Aller au contenu

Abap - Ajouter lignes en DEV dans un aDso

Exemple Simple

REPORT ztstcra2.

DATA: lt_data TYPE STANDARD TABLE OF /bic/azfi_a0272,
lt_msg  TYPE rs_t_msg.

APPEND VALUE #( bill_num = '0000000001'
                bill_item = '000001'
                calday = '20250101'
                /bic/zkn_zc04 = '12'
                doc_currcy = 'EUR'
                loc_currcy = 'EUR') 
        TO lt_data.

CALL FUNCTION 'RSDSO_WRITE_API'
    EXPORTING
        i_adsonm            = 'ZFI_A027'
        i_allow_new_sids    = 'X'
        i_activate_data = 'X'
        it_data             = lt_data
    IMPORTING
        et_msg              = lt_msg
    EXCEPTIONS
        write_failed        = 1
        datastore_not_found = 2
        OTHERS              = 3.

IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

cl_demo_output=>display(
    EXPORTING
        data = lt_msg).

Programme générique pour charger un aDso par fichier csv

Dans ce code on aura un fichier csv en entrée qui contient les dimensions de l‘aDso à mettre à jour

*&---------------------------------------------------------------------*
*& Report ZCREATE_DATA_IN_ADSO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcreate_data_in_adso.

*&---------------------------------------------------------------------*
*& Variable Declaration
*&---------------------------------------------------------------------*
DATA: lt_csv_lines   TYPE STANDARD TABLE OF string,
      lv_filename    TYPE string VALUE 'C:\temp\mara.csv',
      lv_tablename   TYPE string VALUE 'MARA',
      lt_fields      TYPE STANDARD TABLE OF string,
      lt_data        TYPE REF TO data,
      lo_typedescr   TYPE REF TO cl_abap_typedescr,
      lo_structdescr TYPE REF TO cl_abap_structdescr,
      lo_tabledescr  TYPE REF TO cl_abap_tabledescr,
      lo_row         TYPE REF TO data,
      lt_msg         TYPE rs_t_msg,
      lv_separator   TYPE c VALUE ';'.

FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE,
               <fs_line>  TYPE any,
               <fs_field> TYPE any.


*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS     p_file   LIKE rlgrap-filename OBLIGATORY.
PARAMETERS     p_adso   LIKE rso_s_adso_key-adsonm OBLIGATORY.

*&---------------------------------------------------------------------*
*& Selection Screen program
*&---------------------------------------------------------------------*
*Help user to select the input file.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION '/SAPDMC/LSM_F4_FRONTEND_FILE'
*   EXPORTING
*     PATHNAME               =
    CHANGING
      pathfile         = p_file
    EXCEPTIONS
      canceled_by_user = 1
      system_error     = 2
      OTHERS           = 3.
  IF sy-subrc <> 0.
  ENDIF.


*&---------------------------------------------------------------------*
*& Start of the program
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  " 1. Lire le fichier CSV
  lv_filename = p_file.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'ASC'
      has_field_separator     = 'X'
    TABLES
      data_tab                = lt_csv_lines
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  IF sy-subrc <> 0.
    WRITE: / 'Erreur de lecture du fichier'.
    RETURN.
  ENDIF.

  " 2. Extraire les noms des champs depuis la première ligne
  DATA(lv_header_line) = lt_csv_lines[ 1 ].
  SPLIT lv_header_line AT lv_separator INTO TABLE lt_fields.

  " Supprimer la ligne d'entête du tableau
  DELETE lt_csv_lines INDEX 1.

  " Obtenir la structure de la table DDIC dynamiquement
  CONCATENATE '/BIC/A' p_adso '2' INTO lv_tablename.
  lo_typedescr   = cl_abap_typedescr=>describe_by_name( lv_tablename ).
  lo_structdescr = CAST cl_abap_structdescr( lo_typedescr ).
  lo_tabledescr  = cl_abap_tabledescr=>create( lo_structdescr ).

* Créer dynamiquement la table
  CREATE DATA lt_data TYPE HANDLE lo_tabledescr.
  ASSIGN lt_data->* TO <fs_table>.

* Boucler sur les lignes du CSV et remplir dynamiquement
  LOOP AT lt_csv_lines INTO DATA(lv_line).
    DATA(lt_values) = VALUE string_table( ).
    SPLIT lv_line AT lv_separator INTO TABLE lt_values.

    " Créer une ligne vide
    CREATE DATA lo_row TYPE HANDLE lo_structdescr.
    ASSIGN lo_row->* TO <fs_line>.

    " Remplir chaque champ de la ligne
    DATA(idx) = 0.
    LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fieldname>).
      idx = idx + 1.
      READ TABLE lt_values ASSIGNING FIELD-SYMBOL(<value>) INDEX idx.
      IF sy-subrc = 0.
        ASSIGN COMPONENT <fieldname> OF STRUCTURE <fs_line> TO <fs_field>.
        IF sy-subrc = 0.
          <fs_field> = <value>.
        ENDIF.
      ENDIF.
    ENDLOOP.

    " Ajouter la ligne à la table
    APPEND <fs_line> TO <fs_table>.
  ENDLOOP.

  " lecture du contenu chargé
*  LOOP AT <fs_table> ASSIGNING <fs_line>.
*    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <fs_line> TO <fs_field>.
*    IF sy-subrc = 0.
*      WRITE: / 'MATNR:', <fs_field>.
*    ENDIF.
*  ENDLOOP.



**2 - Création de la request dans l'aDso.
  CALL FUNCTION 'RSDSO_WRITE_API'
    EXPORTING
      i_adsonm            = p_adso
      i_allow_new_sids    = 'X'
*     i_activate_data     = 'X'
      it_data             = <fs_table>
    IMPORTING
      et_msg              = lt_msg
    EXCEPTIONS
      write_failed        = 1
      datastore_not_found = 2
      OTHERS              = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    WRITE : 'Request created in the aDso. you need to activate it.'.
  ENDIF.

*  cl_demo_output=>display(
*    EXPORTING
*      data = lt_msg
*  ).

Et le fichier csv pouvant servir de modèle

Fichier Exemple