Wie man dynamisch Strukturen und interne Tabellen zur Laufzeit erzeugen kann, habe ich bereits in einem anderen Artikel beschrieben.
Heute möchte ich zeigen, wie man eine Datenbank Struktur zur Laufzeit erzeugt und diese auch gleich einem Transportauftrag zuweisen kann.
Der unten gezeigte Report besitzt einen Selection Screen mit vier Eingabefeldern. Diese Felder sind :
- Strukturname
- Strukturbeschreibung
- Feldname
- Datenelement des Feldes
In diesem Beispiel wird eine Struktur mit einem Feld erzeugt. Dies sollte zur Veranschaulichung völlig ausreichend sein.
In der Form create_ddic_structure wird die gewünschte Datenbankstruktur erzeugt und aktiviert. Ab diesem Zeitpunkt ist die Struktur via SE11 auffindbar.
Als nächstes wird mit in der Form write_transport der nötige Transportauftrag erzeugt. Wie gewohnt kann man hier einen bereits existierenden Auftrag auswählen oder einen neuen Auftrag anlegen.
REPORT create_structure. TYPE-POOLS: abap. DATA: wa_structure_data TYPE dd02v. DATA: lt_table_fields TYPE STANDARD TABLE OF dd03p, wa_table_fields TYPE dd03p. SELECTION-SCREEN: BEGIN OF BLOCK a WITH FRAME. PARAMETERS: p_struc TYPE ddobjname. PARAMETERS: p_ddtext TYPE char60. SELECTION-SCREEN: SKIP 1. PARAMETERS: p_field TYPE fieldname. PARAMETERS: p_dtype TYPE rollname. SELECTION-SCREEN: END OF BLOCK a. START-OF-SELECTION. PERFORM create_ddic_structure. PERFORM write_transport. END-OF-SELECTION. *---------------------------------------------------------------------* * Form create_ddic_structure *---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM create_ddic_structure. DATA: wa_data_head TYPE dd04v, wa_data_tec TYPE tpara. DATA: obj_data TYPE REF TO data. * Build structure data MOVE p_struc TO wa_structure_data-tabname. MOVE 'INTTAB' TO wa_structure_data-tabclass. MOVE p_ddtext TO wa_structure_data-ddtext. MOVE sy-langu TO wa_structure_data-ddlanguage. * Build table fields * Get data type data CALL FUNCTION 'DDIF_DTEL_GET' EXPORTING name = p_dtype langu = sy-langu IMPORTING dd04v_wa = wa_data_head tpara_wa = wa_data_tec EXCEPTIONS illegal_input = 1 OTHERS = 2. MOVE-CORRESPONDING wa_data_head TO wa_table_fields. MOVE-CORRESPONDING wa_data_tec TO wa_table_fields. MOVE p_struc TO wa_table_fields-tabname. MOVE p_field TO wa_table_fields-fieldname. MOVE sy-langu TO wa_table_fields-ddlanguage. MOVE '0001' TO wa_table_fields-position. APPEND wa_table_fields TO lt_table_fields. * Create table in data dictionary CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = p_struc dd02v_wa = wa_structure_data TABLES dd03p_tab = lt_table_fields EXCEPTIONS tabl_not_found = 1 name_inconsistent = 2 tabl_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. * Activate table CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = p_struc EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. CREATE DATA obj_data TYPE (p_struc). CLEAR: wa_structure_data. ENDFORM. "create_ddic_structure *---------------------------------------------------------------------* * Form write_transport *---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM write_transport. DATA: wa_e070 TYPE e070. DATA: lt_e071 TYPE TABLE OF e071, wa_e071 TYPE e071, lt_e071k TYPE TABLE OF e071k, wa_e071k TYPE e071k. DATA: lv_order TYPE trkorr, lv_task TYPE trkorr. DATA: wa_tadir TYPE tadir, wa_new_tadir TYPE tadir. MOVE 'R3TR' TO wa_tadir-pgmid. MOVE 'TABL' TO wa_tadir-object. MOVE p_struc TO wa_tadir-obj_name. MOVE sy-sysid TO wa_tadir-srcsystem. MOVE sy-uname TO wa_tadir-author. MOVE sy-langu TO wa_tadir-masterlang. * Ask for development package CALL FUNCTION 'TRINT_TADIR_POPUP' EXPORTING wi_message_enter_devclass = abap_true wi_tadir = wa_tadir wi_no_tadir = abap_true wi_no_tdevc = abap_true wi_no_delete_function = abap_true iv_name_too_long_for_old = abap_true IMPORTING we_tadir_new = wa_new_tadir EXCEPTIONS display_mode = 1 exit = 2 global_tadir_insert_error = 3 no_systemname = 4 no_systemtype = 5 no_tadir_type = 6 reserved_name = 7 tadir_not_exist = 8 close = 9 no_object_authority = 10 no_modification_of_head_syst = 11 obj_specification_not_unique = 12 pgmid_object_not_allowed = 13 object_reserved_for_devclass = 14 OTHERS = 15. * Create tadir entry CALL FUNCTION 'TRINT_TADIR_INSERT' EXPORTING author = sy-uname masterlang = sy-langu devclass = wa_new_tadir-devclass * GENFLAG = ' ' object = wa_new_tadir-object obj_name = wa_new_tadir-obj_name pgmid = wa_new_tadir-pgmid * SRCSYSTEM = SY-SYSID EXCEPTIONS object_exists_global = 1 object_exists_local = 2 OTHERS = 3. * Create transport request CALL FUNCTION 'TRINT_ORDER_CHOICE' EXPORTING * WI_SIMULATION = ' ' wi_order_type = 'K' wi_task_type = 'S' wi_category = 'SYST' wi_client = sy-mandt iv_tarsystem = 'CQR' wi_e070 = wa_e070 wi_remove_locks = 'X' IMPORTING we_order = lv_order we_task = lv_task TABLES wt_e071 = lt_e071 wt_e071k = lt_e071k. * Set transport header wa_e071-trkorr = lv_task. wa_e071-as4pos = sy-tabix. wa_e071-pgmid = 'R3TR'. wa_e071-object = 'TABL'. wa_e071-obj_name = p_struc. wa_e071-objfunc = ' '. APPEND wa_e071 TO lt_e071. CLEAR wa_e071. * Save items for transport request CALL FUNCTION 'TRINT_APPEND_TO_COMM_ARRAYS' EXPORTING wi_trkorr = lv_task TABLES wt_e071 = lt_e071 wt_e071k = lt_e071k. * Sort an supress transport request CALL FUNCTION 'TR_SORT_AND_COMPRESS_COMM' EXPORTING iv_trkorr = lv_task. ENDFORM. "write_transport
Comments are closed.