Einfügen von vielen Daten in Tabellenpflegedialog
Das Einfügen von Daten aus der Zwischenablage in einen Tabellenpflegedialog ist leider nur eingeschränkt möglich. Es können immer nur so viele Daten eingetragen werden, wie auf dem Bildschirm dargestellt werden. Möchte man von einem System in ein anderes Daten kopieren, dann geht man in der Regel wie folgt vor:
- Quell-Pflegedialog auswählen
- STRG -Y drücken um den Block-Markiermodus zu aktivieren
- Mit der Maus die Felder markieren, die kopiert werden sollen
- Mit STRG – C die ausgewählten Daten kopieren
- In den Ziel-Pflegedialog wechseln
- Kopierte Daten mit STRG – V einfügen
Alternativ können die Daten – sofern sie die gleiche Struktur haben, wie der Pflegedialog – auch aus Excel kopiert werden. Allerdings auch immer nur so viele Zeilen, wie in den Pflegedialog eingefügt werden können.
Möchte man also mehrere hundert oder sogar tausende von Einträgen kopieren, dann möchte man schnell eine andere Möglichkeit haben…
Alternative
Das folgende Programm zeigt auf, wie Daten auf zwei Möglichkeiten in einen Tabellenpflegedialog eingefügt werden können:
- Import als CSV (Comma-separated-values) mit einem Semikolon als Trennzeichen
- Import eines kopierten Bereiches aus Microsoft Excel mit einem Tabulator als Trennzeichen.
Die Daten werden mit der korrekten Struktur der zu importierenden Tabelle an den Funktionsbaustein VIEW_MAINTENANCE_GIVEN_DATA übergeben, der diese dann im generierten Tabellenpflegedialog anzeigt. Sind alle Daten korrekt, können sie gespeichert werden.
Das Verfahren habe ich bereits in dem Artikel Speichern per Pflegedialog beschrieben.
Code
TYPES: BEGIN OF _text,
line TYPE c LENGTH 1000,
END OF _text,
_text_tab TYPE STANDARD TABLE OF _text WITH DEFAULT KEY.
PARAMETERS p_demo RADIOBUTTON GROUP a DEFAULT 'X'.
PARAMETERS p_clpb RADIOBUTTON GROUP a.
START-OF-SELECTION.
DATA(import_table) = CONV tabname( 'ZMVDIMP' ).
IF p_demo = abap_true.
DATA(import_data_csv) = VALUE _text_tab(
( line = '100;123;1000;6600' )
( line = '100;333;1000;6600' )
( line = '100;56;3000;2200' )
).
DATA(delimiter) = ';'.
ELSE.
cl_gui_frontend_services=>clipboard_import(
IMPORTING
data = import_data_csv ).
delimiter = cl_abap_char_utilities=>horizontal_tab.
ENDIF.
FIELD-SYMBOLS <import_data_line> TYPE any.
FIELD-SYMBOLS <import_data_tab> TYPE table.
DATA import_data_table_ref TYPE REF TO data.
DATA import_data_struc_ref TYPE REF TO data.
DATA(import_data_struc) = CAST cl_abap_structdescr(
cl_abap_structdescr=>describe_by_name( 'ZMVDIMP' ) ).
DATA(vimflagtab_struc) = CAST cl_abap_structdescr(
cl_abap_structdescr=>describe_by_name( 'VIMFLAGTAB' ) ).
DATA(maint_struc_components) = import_data_struc->get_components( ).
APPEND LINES OF vimflagtab_struc->get_components( ) TO maint_struc_components.
DATA(import_maint_struc) = cl_abap_structdescr=>create( maint_struc_components ).
DATA(import_data_table) = cl_abap_tabledescr=>create( p_line_type = import_maint_struc ).
CREATE DATA import_data_struc_ref TYPE HANDLE import_maint_struc.
ASSIGN import_data_struc_ref->* TO <import_data_line>.
CREATE DATA import_data_table_ref TYPE HANDLE import_data_table.
ASSIGN import_data_table_ref->* TO <import_data_tab>.
LOOP AT import_data_csv INTO DATA(csv_line).
CLEAR <import_data_line>.
SPLIT csv_line AT delimiter INTO TABLE DATA(import_data_values).
LOOP AT import_data_values INTO DATA(value).
ASSIGN COMPONENT sy-tabix OF STRUCTURE <import_data_line> TO FIELD-SYMBOL(<field>).
<field> = value.
ENDLOOP.
ASSIGN COMPONENT 'ACTION' OF STRUCTURE <import_data_line> TO FIELD-SYMBOL(<action>).
<action> = 'N'.
APPEND <import_data_line> TO <import_data_tab>.
ENDLOOP.
CALL FUNCTION 'VIEW_MAINTENANCE_GIVEN_DATA'
EXPORTING
action = 'U'
view_name = import_table
TABLES
data = <import_data_tab>
EXCEPTIONS
client_reference = 1 " View is tied to another client
foreign_lock = 2 " View/Table is locked by another user
invalid_action = 3 " ACTION contains invalid values
no_clientindependent_auth = 4 " no auth. for maintaining client-indep. tables/v
no_database_function = 5 " Fct. mod. for data capture/disposal is missing
no_show_auth = 6 " no display authorization
no_tvdir_entry = 7 " View/table is not entered in TVDIR
no_upd_auth = 8 " no maintenance or display authorization
only_show_allowed = 9 " Display, but not maintain authorization
system_failure = 10 " System locking error
unknown_field_in_dba_sellist = 11 " Selection table contains unknown field
view_not_found = 12 " View/table not found in DDIC
OTHERS = 13.
IF sy-subrc <> 0.
MESSAGE |Error: { sy-subrc }| TYPE 'I'.
ENDIF.
- 7. December: Excel Racing Simulation – Root Vole Race - 7. Dezember 2024
- 5. December: ABAPConf - 5. Dezember 2024
- 4. December: Only a lazy developer is a good developer - 4. Dezember 2024