*&---------------------------------------------------------------------* *& Report Z_ERPFORGE_01_STECKBRIEF *&---------------------------------------------------------------------* *& ERPForgeAI - Step 1: System Profiling ("Steckbrief") *& Run this FIRST on a customer system to discover capabilities. *& *& Compatible: SAP_BASIS 7.40 SP02+ *& No external type dependencies. *& *& What it does: *& 1. System-Release, Kernel, SP-Level, DB, OS *& 2. ABAP language features (dynamic SYNTAX-CHECK) *& 3. Installed components (CVERS) *& 4. Standard function module existence check *& 5. Table existence check (with row counts) *& 6. Data Dictionary field export (embedded + optional file) *& 7. Additional custom FuBa existence check *& *& Output: *& - Steckbrief as TXT file (ALV display + file download) *& - DD fields optionally as separate tab-delimited file *& *& Workflow: *& 1) Run Z_ERPFORGE_01_STECKBRIEF -> understand the system *& 2) Feed output into ERPForgeAI -> configure AI model *& 3) Run Z_ERPFORGE_02_EXPORT -> extract repository data *&---------------------------------------------------------------------* REPORT z_erpforge_01_steckbrief. *----------------------------------------------------------------------* * Global Data *----------------------------------------------------------------------* TYPES: BEGIN OF ty_stb_line, line TYPE string, END OF ty_stb_line. DATA: gt_output TYPE TABLE OF ty_stb_line, gs_out TYPE ty_stb_line, gv_line TYPE string. DEFINE add_line. gs_out-line = &1. APPEND gs_out TO gt_output. END-OF-DEFINITION. *----------------------------------------------------------------------* * Selection Screen *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE gt_b01. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_sys AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 3(40) t_sys. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_abap AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 3(40) t_abap. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_comp AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 3(40) t_comp. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_fuba AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 3(40) t_fuba. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b01. SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE gt_b02. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_dd AS CHECKBOX DEFAULT ' '. SELECTION-SCREEN COMMENT 3(55) t_dd. SELECTION-SCREEN END OF LINE. SELECT-OPTIONS s_tab FOR sy-tcode VISIBLE LENGTH 40 NO INTERVALS. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_cktab AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 3(55) t_cktab. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_ddfile AS CHECKBOX DEFAULT ' '. SELECTION-SCREEN COMMENT 3(55) t_ddf. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b02. SELECTION-SCREEN BEGIN OF BLOCK b03 WITH FRAME TITLE gt_b03. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS p_ckfb AS CHECKBOX DEFAULT ' '. SELECTION-SCREEN COMMENT 3(55) t_ckfb. SELECTION-SCREEN END OF LINE. SELECT-OPTIONS s_fuba FOR sy-tcode VISIBLE LENGTH 40 NO INTERVALS. SELECTION-SCREEN END OF BLOCK b03. *----------------------------------------------------------------------* * Initialization - Labels + Default Values *----------------------------------------------------------------------* INITIALIZATION. IF sy-langu = 'E' OR sy-langu = 'e'. gt_b01 = 'System Information'. gt_b02 = 'Data Dictionary & Tables'. gt_b03 = 'Additional Function Modules'. %_s_tab_%_app_%-text = 'Table names (e.g. EKKO, EKPO, LFA1)'. %_s_fuba_%_app_%-text = 'Function modules (e.g. BAPI_PO_CREATE1)'. t_sys = 'Release, Kernel, SP Level'. t_abap = 'Test ABAP language features'. t_comp = 'Installed components'. t_fuba = 'Check standard function modules'. t_dd = 'Export field names, types & lengths of tables'. t_cktab = 'Check tables for existence'. t_ddf = 'Export fields as separate file (tab-delimited)'. t_ckfb = 'Check additional function modules for existence'. ELSE. gt_b01 = 'System-Informationen'. gt_b02 = 'Data Dictionary & Tabellen'. gt_b03 = 'Zusaetzliche Funktionsbausteine'. %_s_tab_%_app_%-text = 'Tabellennamen (z.B. EKKO, EKPO, LFA1)'. %_s_fuba_%_app_%-text = 'Funktionsbausteine (z.B. BAPI_PO_CREATE1)'. t_sys = 'Release, Kernel, SP-Stand'. t_abap = 'ABAP Sprachfeatures testen'. t_comp = 'Installierte Komponenten'. t_fuba = 'Wichtige FuBas pruefen'. t_dd = 'Feldnamen, Typen & Laengen der Tabellen exportieren'. t_cktab = 'Tabellen auf Existenz pruefen'. t_ddf = 'Felder als separate Datei exportieren (Tab-getr.)'. t_ckfb = 'Zusaetzliche FuBas auf Existenz pruefen'. ENDIF. " Pre-fill default tables for existence check DATA: ls_tab LIKE LINE OF s_tab. ls_tab-sign = 'I'. ls_tab-option = 'EQ'. DEFINE add_default_tab. ls_tab-low = &1. APPEND ls_tab TO s_tab. END-OF-DEFINITION. add_default_tab 'RFCDES'. add_default_tab 'EDP13'. add_default_tab 'EDIDC'. add_default_tab 'EDIDS'. add_default_tab 'SPROXHDR'. add_default_tab 'TOJTB'. add_default_tab 'ICFSERVICE'. add_default_tab '/UI2/CHIP'. add_default_tab '/UI2/PAGE_V'. add_default_tab '/UI5/APP_INDEX'. *----------------------------------------------------------------------* * Main Program *----------------------------------------------------------------------* START-OF-SELECTION. add_line '================================================================'. add_line ' ERPForgeAI - SAP SYSTEM-STECKBRIEF'. CONCATENATE ' Erstellt: ' sy-datum ' ' sy-uzeit INTO gv_line. add_line gv_line. CONCATENATE ' System: ' sy-sysid ' / Mandant: ' sy-mandt INTO gv_line. add_line gv_line. CONCATENATE ' Benutzer: ' sy-uname INTO gv_line. add_line gv_line. add_line ' Naechster Schritt: Z_ERPFORGE_02_EXPORT ausfuehren'. add_line '================================================================'. add_line ''. IF p_sys = 'X'. PERFORM collect_system_info. ENDIF. IF p_abap = 'X'. PERFORM collect_abap_features. ENDIF. IF p_comp = 'X'. PERFORM collect_components. ENDIF. IF p_fuba = 'X'. PERFORM collect_fuba_standard. ENDIF. IF p_cktab = 'X'. PERFORM collect_table_check. ENDIF. IF p_dd = 'X'. PERFORM collect_dd_export. ENDIF. IF p_ckfb = 'X'. PERFORM collect_fuba_custom. ENDIF. PERFORM export_steckbrief_file. IF p_ddfile = 'X' AND s_tab[] IS NOT INITIAL. PERFORM export_dd_file. ENDIF. PERFORM display_alv. *&=====================================================================* *& 1. System Information *&=====================================================================* FORM collect_system_info. DATA: lv_release TYPE c LENGTH 10, lv_sp TYPE c LENGTH 10. add_line '--- SYSTEM-RELEASE ---'. CONCATENATE ' SAP System ID: ' sy-sysid INTO gv_line. add_line gv_line. CONCATENATE ' Mandant: ' sy-mandt INTO gv_line. add_line gv_line. CONCATENATE ' Host: ' sy-host INTO gv_line. add_line gv_line. CONCATENATE ' Datenbank: ' sy-dbsys INTO gv_line. add_line gv_line. CONCATENATE ' Betriebssystem: ' sy-opsys INTO gv_line. add_line gv_line. CONCATENATE ' SAP Release: ' sy-saprl INTO gv_line. add_line gv_line. SELECT SINGLE release extrelease FROM cvers INTO (lv_release, lv_sp) WHERE component = 'SAP_BASIS'. IF sy-subrc = 0. CONCATENATE ' SAP_BASIS Release: ' lv_release INTO gv_line. add_line gv_line. CONCATENATE ' SAP_BASIS ExtRelease:' lv_sp INTO gv_line. add_line gv_line. ENDIF. CLEAR: lv_release, lv_sp. SELECT SINGLE release extrelease FROM cvers INTO (lv_release, lv_sp) WHERE component = 'SAP_ABA'. IF sy-subrc = 0. CONCATENATE ' SAP_ABA Release: ' lv_release INTO gv_line. add_line gv_line. CONCATENATE ' SAP_ABA ExtRelease: ' lv_sp INTO gv_line. add_line gv_line. ENDIF. add_line ''. ENDFORM. *&=====================================================================* *& 2. ABAP Language Features *&=====================================================================* FORM collect_abap_features. DATA: lv_source TYPE TABLE OF string, lv_msg TYPE string, lv_word TYPE string, lv_lin TYPE i, lv_result TYPE c LENGTH 4, lv_code TYPE string. add_line '--- ABAP SPRACHFEATURES ---'. add_line ' (Getestet durch dynamische Syntax-Pruefung)'. add_line ''. DEFINE test_feature. CLEAR: lv_source, lv_msg, lv_word. APPEND 'REPORT ztest.' TO lv_source. lv_code = &2. APPEND lv_code TO lv_source. SYNTAX-CHECK FOR lv_source MESSAGE lv_msg LINE lv_lin WORD lv_word PROGRAM sy-repid. IF lv_msg IS INITIAL. lv_result = 'JA'. ELSE. lv_result = 'NEIN'. ENDIF. CONCATENATE ' ' &1 ': ' lv_result INTO gv_line. add_line gv_line. END-OF-DEFINITION. test_feature 'Inline DATA(...) [7.40 SP02]' 'DATA(lv_x) = 1.'. test_feature 'Inline FIELD-SYMBOL [7.40 SP02]' 'DATA lt TYPE TABLE OF i. LOOP AT lt ASSIGNING FIELD-SYMBOL(). ENDLOOP.'. test_feature 'String Templates [7.40 SP02]' 'DATA lv TYPE string. lv = |hello|.'. test_feature 'CONV Operator [7.40 SP08]' 'DATA lv TYPE string. lv = CONV string( 123 ).'. test_feature 'COND Ausdruck [7.40 SP08]' 'DATA lv TYPE i. lv = COND #( WHEN 1 = 1 THEN 1 ELSE 0 ).'. test_feature 'SWITCH Ausdruck [7.40 SP08]' 'DATA lv TYPE i VALUE 1. DATA lv2 TYPE string. lv2 = SWITCH #( lv WHEN 1 THEN |a| ELSE |b| ).'. test_feature 'CORRESPONDING Operator [7.40 SP08]' 'TYPES: BEGIN OF ty, f1 TYPE i, END OF ty. DATA ls1 TYPE ty. DATA ls2 TYPE ty. ls2 = CORRESPONDING #( ls1 ).'. test_feature 'VALUE Operator [7.40 SP08]' 'TYPES tt TYPE TABLE OF i WITH EMPTY KEY. DATA lt TYPE tt. lt = VALUE #( ( 1 ) ( 2 ) ).'. test_feature 'NEW Operator [7.40 SP08]' 'DATA lo TYPE REF TO cl_abap_regex. lo = NEW #( pattern = |.| ).'. test_feature 'FOR Ausdruck [7.40 SP08]' 'TYPES tt TYPE TABLE OF i WITH EMPTY KEY. DATA lt TYPE tt. lt = VALUE #( FOR i = 1 UNTIL i > 3 ( i ) ).'. test_feature 'REDUCE Operator [7.40 SP08]' 'TYPES tt TYPE TABLE OF i WITH EMPTY KEY. DATA lt TYPE tt. DATA lv TYPE i. lv = REDUCE #( INIT s = 0 FOR wa IN lt NEXT s = s + wa ).'. test_feature 'FILTER Ausdruck [7.40 SP08]' 'TYPES: BEGIN OF ty, id TYPE i, END OF ty, tt TYPE SORTED TABLE OF ty WITH UNIQUE KEY id. DATA lt TYPE tt. DATA lt2 TYPE tt. lt2 = FILTER #( lt WHERE id = 1 ).'. test_feature 'MESH Typ [7.40 SP08]' 'TYPES: tt TYPE TABLE OF i WITH EMPTY KEY. TYPES: BEGIN OF MESH m, n TYPE tt, END OF MESH m.'. test_feature 'ENUM Typ [7.51]' 'TYPES: BEGIN OF ENUM t_color, red, green, blue, END OF ENUM t_color.'. add_line ''. ENDFORM. *&=====================================================================* *& 3. Installed Components (CVERS) *&=====================================================================* FORM collect_components. DATA: BEGIN OF ls_cv, component TYPE c LENGTH 30, release TYPE c LENGTH 10, extrelease TYPE c LENGTH 10, comp_type TYPE c LENGTH 1, END OF ls_cv, lt_cv LIKE TABLE OF ls_cv. SELECT component release extrelease comp_type FROM cvers INTO TABLE lt_cv ORDER BY component. add_line '--- HAUPTKOMPONENTEN (CVERS) ---'. add_line ' Komponente | Release | Ext.Rel | Typ'. add_line ' -----------------------------|----------|----------|----'. LOOP AT lt_cv INTO ls_cv. CONCATENATE ' ' ls_cv-component '| ' ls_cv-release '| ' ls_cv-extrelease '| ' ls_cv-comp_type INTO gv_line SEPARATED BY space. add_line gv_line. ENDLOOP. add_line ''. ENDFORM. *&=====================================================================* *& 4. Standard Function Module Check *&=====================================================================* FORM collect_fuba_standard. DATA: lv_funcname TYPE rs38l-name, lv_status TYPE c LENGTH 20. add_line '--- STANDARD-FUNKTIONSBAUSTEINE ---'. DEFINE check_fuba. lv_funcname = &1. CALL FUNCTION 'FUNCTION_EXISTS' EXPORTING funcname = lv_funcname EXCEPTIONS function_not_exist = 1 OTHERS = 2. IF sy-subrc = 0. lv_status = 'JA'. ELSE. lv_status = 'NEIN'. ENDIF. CONCATENATE ' ' &1 ': ' lv_status INTO gv_line. add_line gv_line. END-OF-DEFINITION. check_fuba 'RFC_READ_TABLE'. check_fuba 'SAPWL_STATREC_READ_RFC_C'. check_fuba 'BAPI_USER_GET_DETAIL'. check_fuba 'SO_NEW_DOCUMENT_ATT_SEND_API1'. check_fuba 'CONVERT_OTF_2_PDF'. check_fuba 'NUMBER_GET_NEXT'. check_fuba 'POPUP_TO_CONFIRM'. check_fuba 'REUSE_ALV_GRID_DISPLAY'. check_fuba 'IDOC_INBOUND_ASYNCHRONOUS'. check_fuba 'EDI_DOCUMENT_OPEN_FOR_CREATE'. check_fuba 'MASTER_IDOC_DISTRIBUTE'. check_fuba 'RSAU_READ_AUDIT_LOG'. check_fuba 'BAL_LOG_CREATE'. check_fuba 'HR_READ_INFOTYPE'. check_fuba 'BAPI_SALESORDER_GETLIST'. check_fuba 'BAPI_PO_GETDETAIL'. check_fuba 'BBP_PD_SC_GETLIST'. add_line ''. ENDFORM. *&=====================================================================* *& 5. Table Existence Check *&=====================================================================* FORM collect_table_check. DATA: lv_tab TYPE dd02l-tabname, lt_tabs TYPE TABLE OF dd02l-tabname, lv_cnt TYPE i, lv_str TYPE c LENGTH 10, lv_rows TYPE c LENGTH 15, lv_count TYPE i. IF s_tab[] IS INITIAL. RETURN. ENDIF. add_line '--- TABELLEN-EXISTENZ ---'. SELECT tabname FROM dd02l INTO TABLE lt_tabs WHERE tabname IN s_tab AND as4local = 'A' ORDER BY tabname. lv_cnt = lines( lt_tabs ). lv_str = lv_cnt. CONDENSE lv_str. CONCATENATE ' Gefunden: ' lv_str ' Tabellen' INTO gv_line. add_line gv_line. DATA: ls_range LIKE LINE OF s_tab. LOOP AT s_tab INTO ls_range WHERE sign = 'I' AND option = 'EQ'. READ TABLE lt_tabs TRANSPORTING NO FIELDS WITH KEY table_line = ls_range-low. IF sy-subrc = 0. CLEAR lv_count. TRY. SELECT COUNT(*) FROM (ls_range-low) INTO lv_count. CATCH cx_root. lv_count = -1. ENDTRY. IF lv_count >= 0. lv_rows = lv_count. CONDENSE lv_rows. CONCATENATE ' ' ls_range-low ': EXISTIERT (' lv_rows ' Eintraege)' INTO gv_line. ELSE. CONCATENATE ' ' ls_range-low ': EXISTIERT (Anzahl nicht ermittelbar)' INTO gv_line. ENDIF. ELSE. CONCATENATE ' ' ls_range-low ': NICHT VORHANDEN' INTO gv_line. ENDIF. add_line gv_line. ENDLOOP. add_line ''. ENDFORM. *&=====================================================================* *& 6. Data Dictionary Export (embedded in Steckbrief TXT) *&=====================================================================* FORM collect_dd_export. DATA: BEGIN OF ls_dd, tabname TYPE dd03l-tabname, fieldname TYPE dd03l-fieldname, position TYPE dd03l-position, datatype TYPE dd03l-datatype, leng TYPE dd03l-leng, decimals TYPE dd03l-decimals, rollname TYPE dd03l-rollname, keyflag TYPE dd03l-keyflag, ddtext TYPE dd04t-ddtext, END OF ls_dd, lt_dd LIKE TABLE OF ls_dd. DATA: lt_tabs TYPE TABLE OF dd03l-tabname, lv_tabcnt TYPE i, lv_cnt_str TYPE c LENGTH 10, lv_len_str TYPE c LENGTH 6, lv_prev TYPE dd03l-tabname. IF s_tab[] IS INITIAL. add_line '--- DD-EXPORT: Keine Tabellen angegeben ---'. add_line ''. RETURN. ENDIF. SELECT DISTINCT tabname FROM dd03l INTO TABLE lt_tabs WHERE tabname IN s_tab AND as4local = 'A'. lv_tabcnt = lines( lt_tabs ). IF lv_tabcnt > 500. lv_cnt_str = lv_tabcnt. CONDENSE lv_cnt_str. CONCATENATE '--- DD-EXPORT: ' lv_cnt_str ' Tabellen - zu viele! Bitte einschraenken (max 500). ---' INTO gv_line. add_line gv_line. add_line ''. RETURN. ENDIF. SELECT tabname fieldname position datatype leng decimals rollname keyflag FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd WHERE tabname IN s_tab AND as4local = 'A' AND fieldname NOT LIKE '.%' ORDER BY tabname position. " Bulk-load descriptions via FOR ALL ENTRIES DATA: lt_rolls TYPE TABLE OF rollname, lv_roll TYPE rollname. LOOP AT lt_dd INTO ls_dd WHERE rollname IS NOT INITIAL. lv_roll = ls_dd-rollname. COLLECT lv_roll INTO lt_rolls. ENDLOOP. IF lt_rolls IS NOT INITIAL. DATA: BEGIN OF ls_txt, rollname TYPE rollname, ddtext TYPE dd04t-ddtext, END OF ls_txt, lt_txt LIKE TABLE OF ls_txt. SELECT rollname ddtext FROM dd04t INTO TABLE lt_txt FOR ALL ENTRIES IN lt_rolls WHERE rollname = lt_rolls-table_line AND ddlanguage = sy-langu AND as4local = 'A'. FIELD-SYMBOLS
LIKE LINE OF lt_dd. LOOP AT lt_dd ASSIGNING
WHERE rollname IS NOT INITIAL. READ TABLE lt_txt INTO ls_txt WITH KEY rollname =
-rollname. IF sy-subrc = 0.
-ddtext = ls_txt-ddtext. ENDIF. ENDLOOP. ENDIF. add_line '--- DD-EXPORT ---'. lv_cnt_str = lv_tabcnt. CONDENSE lv_cnt_str. CONCATENATE ' Tabellen: ' lv_cnt_str ' | Felder gesamt: ' INTO gv_line. lv_cnt_str = lines( lt_dd ). CONDENSE lv_cnt_str. CONCATENATE gv_line lv_cnt_str INTO gv_line. add_line gv_line. add_line ''. CLEAR lv_prev. LOOP AT lt_dd INTO ls_dd. IF ls_dd-tabname <> lv_prev. IF lv_prev IS NOT INITIAL. add_line ''. ENDIF. CONCATENATE ' Tabelle: ' ls_dd-tabname INTO gv_line. add_line gv_line. add_line ' Feldname | Datentyp | Laenge | Key | Beschreibung'. add_line ' -------------|----------|--------|-----|---------------------------'. lv_prev = ls_dd-tabname. ENDIF. lv_len_str = ls_dd-leng. CONDENSE lv_len_str. CONCATENATE ' ' ls_dd-fieldname '| ' ls_dd-datatype '| ' lv_len_str '| ' ls_dd-keyflag '| ' ls_dd-ddtext INTO gv_line SEPARATED BY space. add_line gv_line. ENDLOOP. add_line ''. ENDFORM. *&=====================================================================* *& 7. Additional Custom FuBa Check *&=====================================================================* FORM collect_fuba_custom. DATA: ls_range LIKE LINE OF s_fuba, lv_funcname TYPE rs38l-name, lv_status TYPE c LENGTH 20. IF s_fuba[] IS INITIAL. RETURN. ENDIF. add_line '--- ZUSAETZLICHE FUNKTIONSBAUSTEINE ---'. LOOP AT s_fuba INTO ls_range WHERE sign = 'I' AND option = 'EQ'. lv_funcname = ls_range-low. CALL FUNCTION 'FUNCTION_EXISTS' EXPORTING funcname = lv_funcname EXCEPTIONS function_not_exist = 1 OTHERS = 2. IF sy-subrc = 0. lv_status = 'JA'. ELSE. lv_status = 'NEIN'. ENDIF. CONCATENATE ' ' ls_range-low ': ' lv_status INTO gv_line. add_line gv_line. ENDLOOP. add_line ''. ENDFORM. *&=====================================================================* *& Export: Steckbrief as TXT *&=====================================================================* FORM export_steckbrief_file. DATA: lv_fp TYPE string, lv_fn TYPE string, lv_path TYPE string, lv_action TYPE i, lv_default TYPE string, lt_strings TYPE TABLE OF string, ls_tmp TYPE ty_stb_line, lv_cnt TYPE c LENGTH 10. CONCATENATE 'ERPForge_Steckbrief_' sy-sysid '_' sy-datum INTO lv_default. cl_gui_frontend_services=>file_save_dialog( EXPORTING window_title = 'Steckbrief speichern' default_extension = 'txt' default_file_name = lv_default file_filter = 'Text (*.txt)|*.txt|All|*.*' CHANGING filename = lv_fn path = lv_path fullpath = lv_fp user_action = lv_action EXCEPTIONS OTHERS = 4 ). IF sy-subrc <> 0 OR lv_action <> 0. RETURN. ENDIF. LOOP AT gt_output INTO ls_tmp. APPEND ls_tmp-line TO lt_strings. ENDLOOP. cl_gui_frontend_services=>gui_download( EXPORTING filename = lv_fp filetype = 'ASC' codepage = '4110' trunc_trailing_blanks = 'X' CHANGING data_tab = lt_strings EXCEPTIONS OTHERS = 22 ). IF sy-subrc = 0. lv_cnt = lines( gt_output ). CONDENSE lv_cnt. CONCATENATE 'Steckbrief exportiert (' lv_cnt ' Zeilen): ' lv_fp INTO gv_line. MESSAGE gv_line TYPE 'S'. ENDIF. ENDFORM. *&=====================================================================* *& Export: DD Fields as separate tab-delimited file *& (Format compatible with dd_export_parser.py) *&=====================================================================* FORM export_dd_file. DATA: BEGIN OF ls_dd, tabname TYPE dd03l-tabname, fieldname TYPE dd03l-fieldname, position TYPE dd03l-position, datatype TYPE dd03l-datatype, leng TYPE dd03l-leng, decimals TYPE dd03l-decimals, rollname TYPE dd03l-rollname, domname TYPE dd03l-domname, keyflag TYPE dd03l-keyflag, notnull TYPE dd03l-notnull, ddtext TYPE dd04t-ddtext, END OF ls_dd, lt_dd LIKE TABLE OF ls_dd. DATA: lt_out TYPE TABLE OF string, lv_line TYPE string, lv_fp TYPE string, lv_fn TYPE string, lv_path TYPE string, lv_action TYPE i, lv_default TYPE string, lv_tab TYPE c LENGTH 1, lv_pos TYPE c LENGTH 6, lv_len TYPE c LENGTH 6, lv_dec TYPE c LENGTH 4. IF s_tab[] IS INITIAL. RETURN. ENDIF. " Safety check DATA: lv_cnt TYPE i, lv_cnt_str TYPE c LENGTH 10. SELECT COUNT(*) FROM dd03l INTO lv_cnt WHERE tabname IN s_tab AND as4local = 'A'. IF lv_cnt > 50000. MESSAGE 'Zu viele Felder (>50000). Bitte Tabellen einschraenken.' TYPE 'W'. RETURN. ENDIF. lv_tab = cl_abap_char_utilities=>horizontal_tab. " Load fields (incl. domain + NotNull) SELECT tabname fieldname position datatype leng decimals rollname domname keyflag notnull FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd WHERE tabname IN s_tab AND as4local = 'A' AND fieldname NOT LIKE '.%' ORDER BY tabname position. " Bulk-load descriptions DATA: lt_rolls TYPE TABLE OF rollname, lv_roll TYPE rollname. LOOP AT lt_dd INTO ls_dd WHERE rollname IS NOT INITIAL. lv_roll = ls_dd-rollname. COLLECT lv_roll INTO lt_rolls. ENDLOOP. IF lt_rolls IS NOT INITIAL. DATA: BEGIN OF ls_txt, rollname TYPE rollname, ddtext TYPE dd04t-ddtext, END OF ls_txt, lt_txt LIKE TABLE OF ls_txt. SELECT rollname ddtext FROM dd04t INTO TABLE lt_txt FOR ALL ENTRIES IN lt_rolls WHERE rollname = lt_rolls-table_line AND ddlanguage = sy-langu AND as4local = 'A'. FIELD-SYMBOLS
LIKE LINE OF lt_dd. LOOP AT lt_dd ASSIGNING
WHERE rollname IS NOT INITIAL. READ TABLE lt_txt INTO ls_txt WITH KEY rollname =
-rollname. IF sy-subrc = 0.
-ddtext = ls_txt-ddtext. ENDIF. ENDLOOP. ENDIF. " Header row CONCATENATE 'Tabelle' lv_tab 'Feldname' lv_tab 'Pos' lv_tab 'Datentyp' lv_tab 'Laenge' lv_tab 'Dezimal' lv_tab 'Datenelement' lv_tab 'Domaene' lv_tab 'Key' lv_tab 'NotNull' lv_tab 'Beschreibung' INTO lv_line. APPEND lv_line TO lt_out. " Data rows LOOP AT lt_dd INTO ls_dd. lv_pos = ls_dd-position. CONDENSE lv_pos. lv_len = ls_dd-leng. CONDENSE lv_len. lv_dec = ls_dd-decimals. CONDENSE lv_dec. CONCATENATE ls_dd-tabname lv_tab ls_dd-fieldname lv_tab lv_pos lv_tab ls_dd-datatype lv_tab lv_len lv_tab lv_dec lv_tab ls_dd-rollname lv_tab ls_dd-domname lv_tab ls_dd-keyflag lv_tab ls_dd-notnull lv_tab ls_dd-ddtext INTO lv_line. APPEND lv_line TO lt_out. ENDLOOP. " Save file CONCATENATE 'ERPForge_DD_Export_' sy-sysid '_' sy-datum INTO lv_default. cl_gui_frontend_services=>file_save_dialog( EXPORTING window_title = 'DD-Export speichern' default_extension = 'txt' default_file_name = lv_default file_filter = 'Text (*.txt)|*.txt|CSV (*.csv)|*.csv|All|*.*' CHANGING filename = lv_fn path = lv_path fullpath = lv_fp user_action = lv_action EXCEPTIONS OTHERS = 4 ). IF sy-subrc <> 0 OR lv_action <> 0. RETURN. ENDIF. cl_gui_frontend_services=>gui_download( EXPORTING filename = lv_fp filetype = 'ASC' write_field_separator = 'X' trunc_trailing_blanks = 'X' codepage = '4110' CHANGING data_tab = lt_out EXCEPTIONS OTHERS = 22 ). IF sy-subrc = 0. lv_cnt_str = lines( lt_dd ). CONDENSE lv_cnt_str. CONCATENATE lv_cnt_str ' Felder exportiert: ' lv_fp INTO gv_line. MESSAGE gv_line TYPE 'S'. ENDIF. ENDFORM. *&=====================================================================* *& ALV Display *&=====================================================================* FORM display_alv. DATA: lo_alv TYPE REF TO cl_salv_table, lo_disp TYPE REF TO cl_salv_display_settings, lo_funcs TYPE REF TO cl_salv_functions_list, lo_cols TYPE REF TO cl_salv_columns_table, lo_col TYPE REF TO cl_salv_column, lv_title TYPE lvc_title. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv CHANGING t_table = gt_output ). lo_disp = lo_alv->get_display_settings( ). CONCATENATE 'ERPForgeAI Steckbrief ' sy-sysid INTO lv_title. lo_disp->set_list_header( lv_title ). lo_cols = lo_alv->get_columns( ). TRY. lo_col = lo_cols->get_column( 'LINE' ). lo_col->set_short_text( 'Steckbrief' ). lo_col->set_medium_text( 'System-Steckbrief' ). lo_col->set_long_text( 'ERPForgeAI System-Steckbrief Zeile' ). lo_col->set_output_length( 120 ). CATCH cx_salv_not_found. ENDTRY. lo_funcs = lo_alv->get_functions( ). lo_funcs->set_all( abap_true ). lo_alv->display( ). CATCH cx_salv_msg. " Fallback: simple list output DATA: ls_out TYPE ty_stb_line. LOOP AT gt_output INTO ls_out. WRITE: / ls_out-line. ENDLOOP. ENDTRY. ENDFORM.