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:

  1. Quell-Pflegedialog auswählen
  2. STRG -Y drücken um den Block-Markiermodus zu aktivieren
  3. Mit der Maus die Felder markieren, die kopiert werden sollen
  4. Mit STRG – C die ausgewählten Daten kopieren
  5. In den Ziel-Pflegedialog wechseln
  6. 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:

  1. Import als CSV (Comma-separated-values) mit einem Semikolon als Trennzeichen
  2. 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.

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)