Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Dynamic Table and Gui_Upload

Former Member
0 Likes
3,322

Hi Abaper,

I want to use GUI_UPLOAD function module to load some data.

My program must be dynamic.

The table will contain my data is a parameter (p_table).

My internal table must be created dynamically.

Look my code :

   ref_rowtype ?= cl_abap_typedescr=>describe_by_name( p_table ).

   gi_tabdescr[] = ref_rowtype->components[].

   LOOP AT gi_tabdescr INTO wa_tabdescr.

     CLEAR wa_fieldcat.

     wa_fieldcat-fieldname = wa_tabdescr-name.

     wa_fieldcat-datatype  = wa_tabdescr-type_kind.

     wa_fieldcat-inttype   = wa_tabdescr-type_kind.

     wa_fieldcat-intlen    = wa_tabdescr-length.

     wa_fieldcat-decimals  = wa_tabdescr-decimals.

     APPEND wa_fieldcat TO gi_fieldcat.

   ENDLOOP.

   CALL METHOD cl_alv_table_create=>create_dynamic_table

     EXPORTING

       it_fieldcatalog = gi_fieldcat

     IMPORTING

       ep_table        = lo_dtable.

   ASSIGN lo_dtable->* TO <fs_table>.

Now how to use GUI_UPLOAD ???

I can't use field-symbol ...

I have my table in my FS but i can't use it.

CALL FUNCTION 'GUI_UPLOAD'

     EXPORTING

       filename            = p_file

       filetype            = 'DAT'

       has_field_separator = 'X'

     TABLES

       data_tab            = <fs_table>.

I hope i'm clear about my problem.

Thank you in advance for your help.

Youri

1 ACCEPTED SOLUTION
Read only

aferngas
Active Participant
0 Likes
1,683

Hi Youri,

It can be your fieldsymbol definition. It should be TYPE STANDARD TABLE for use GUI_UPLOAD function. Also you can do it with CL_GUI_FRONTEND_SERVICES:

DATA: lr_struct TYPE REF TO cl_abap_structdescr,

      lr_table  TYPE REF TO cl_abap_tabledescr,

      lr_data   TYPE REF TO data,

      lv_file   TYPE string.

FIELD-SYMBOLS <table> TYPE ANY.


lr_struct ?= cl_abap_typedescr=>describe_by_name( 'MARA' ).

lr_table = cl_abap_tabledescr=>create( p_line_type = lr_struct ).

CREATE DATA lr_data TYPE HANDLE lr_table.

ASSIGN lr_data->* TO <table>.

cl_gui_frontend_services=>gui_upload(

  EXPORTING filename            = lv_file

            has_field_separator = abap_true

   CHANGING data_tab            = <table> ).

In this example I create a data of table type MARA an filled from a csv (missing part where it retrieves the file name). In this case <table> can be TYPE ANY, TYPE ANY TABLE or TYPE STANDARD TABLE and it will still work.

Regards,

Alex

3 REPLIES 3
Read only

FredericGirod
Active Contributor
0 Likes
1,683

Hi



this works fine for me



FIELD-SYMBOLS : <wfv_structname> TYPE typename , " Nom de la table

                <wft_table>      TYPE table , " Table interne dyn


    CALL FUNCTION 'WS_DOWNLOAD'

      EXPORTING

        filename = p_file

        filetype = 'DAT'

      TABLES

        data_tab = <wft_table>

      EXCEPTIONS

        OTHERS   = 10.

    IF sy-subrc NE space.

      WRITE : /3 text-003.

    ENDIF.

regards

Fred

PS : the full code could be more simple to understand

REPORT ZBC_SAUVEGARDE_TABLE
       NO STANDARD PAGE HEADING.

*------------------------------- TABLES -------------------------------*

TABLES : dd02t.

*-------------------------------- DATA --------------------------------*

DATA : wt_fieldcat TYPE lvc_t_fcat ,
       ws_fieldcat TYPE lvc_s_fcat ,

BEGIN OF wt_tablist OCCURS 0 ,
  tabname TYPE tabname ,
  ddtext TYPE as4text ,
END OF wt_tablist .

FIELD-SYMBOLS : <wfv_structname> TYPE typename , " Nom de la table
                <wft_table>      TYPE table , " Table interne dyn
                <wfs_structure>  TYPE ANY . " Structure de la table

*-------------------------- SELECTION SCREEN --------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
PARAMETERS : p_table TYPE tabname ,
             p_max   type i .
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
PARAMETERS : p_imp RADIOBUTTON GROUP ra1 ,
             p_exp RADIOBUTTON GROUP ra1
                   DEFAULT 'X' ,
             p_clear AS CHECKBOX .
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.
PARAMETERS : p_file TYPE localfile
                    OBLIGATORY .
SELECTION-SCREEN SKIP 1.
PARAMETERS : p_excl RADIOBUTTON GROUP ra2 ,
             p_flat RADIOBUTTON GROUP ra2 .
SELECTION-SCREEN END OF BLOCK b3.

*-------------------------------- MAIN --------------------------------*

START-OF-SELECTION.

* Vérification des options de sélection.

  PERFORM p_check.

* Déchargement de la table.

  IF p_exp EQ 'X'.
    PERFORM p_dechargement.

* Chargement de la table.

  ELSE.
    PERFORM p_chargement.

  ENDIF.

END-OF-SELECTION.

*----------------------------------------------------------------------*
* Form P_CHECK.                                                        *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*

FORM p_check.

  DATA : wlv_tabname TYPE tabname.

* Verifie que la table existe.

  SELECT tabname
         UP TO 1 ROWS
         INTO wlv_tabname
         FROM dd02t
         WHERE tabname EQ p_table
         AND as4local EQ 'A'.
  ENDSELECT.

  IF sy-subrc NE space.
    WRITE : /3 text-001.
    STOP.
  ENDIF.

* On ne traite que le chargement des tables Z*.

  IF p_imp EQ 'X' AND p_table+0(1) NE 'Z'
     and sy-uname ne 'FRFGIROD'.
    WRITE : /1 text-007.
    STOP.
  ENDIF.


ENDFORM. " P_CHECK.

*----------------------------------------------------------------------*
* Form P_DECHARGEMENT.                                                 *
*----------------------------------------------------------------------*
* Déchargement de la table.                                            *
*----------------------------------------------------------------------*

FORM p_dechargement.

* Création de la table interne dynamique du type de la table.

  PERFORM p_create_dyntable
          USING p_table.

* Lecture de la table ( et oui un joli select * ! )

  SELECT *
         up to p_max rows
         INTO TABLE <wft_table>
         FROM (p_table).

* Si déchargen en format Excel.

  IF p_excl EQ 'X'.
    CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT'
      EXPORTING
        i_filename        = p_file
      TABLES
        i_tab_sap_data    = <wft_table>
      EXCEPTIONS
        conversion_failed = 1
        OTHERS            = 2.
    IF sy-subrc NE space.
      WRITE : /3 text-003.
    ENDIF.

* Si fichier plat.

  ELSEIF p_flat EQ 'X'.

    CALL FUNCTION 'WS_DOWNLOAD'
      EXPORTING
        filename = p_file
        filetype = 'DAT'
      TABLES
        data_tab = <wft_table>
      EXCEPTIONS
        OTHERS   = 10.
    IF sy-subrc NE space.
      WRITE : /3 text-003.
    ENDIF.

  ENDIF.

ENDFORM. " P_DECHARGEMENT.

*----------------------------------------------------------------------*
* Form P_CHARGEMENT.                                                   *
*----------------------------------------------------------------------*
* Chargement.                                                          *
*----------------------------------------------------------------------*

FORM p_chargement.


  DATA : wlv_count_col TYPE i ,
         wlv_flag_row TYPE kcd_ex_row_n ,
         wlt_file TYPE TABLE OF alsmex_tabline
                  WITH HEADER LINE ,
         wlv_char1 TYPE char1.

  FIELD-SYMBOLS : <wlfv_field> TYPE ANY.

* Création de la table interne dynamique du type de la table.

  PERFORM p_create_dyntable
          USING p_table.

* Lecture du fichier.
* Si déchargen en format Excel.

  IF p_excl EQ 'X'.

*   Seek number of column.

    DESCRIBE TABLE wt_fieldcat LINES wlv_count_col.

*   Function to read the Microsoft Excel file.

    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        filename                = p_file
        i_begin_col             = '1'
        i_begin_row             = '1'
        i_end_col               = wlv_count_col
        i_end_row               = '10000'
      TABLES
        intern                  = wlt_file
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF sy-subrc NE space.
      WRITE : /3 text-003.
      STOP.
    ENDIF.

*   Set data.

    LOOP AT wlt_file.

      IF wlt_file-row NE wlv_flag_row.
        MOVE wlt_file-row TO wlv_flag_row.
        IF wlt_file-row NE 1.
          APPEND <wfs_structure> TO <wft_table>.
          CLEAR <wfs_structure>.
        ENDIF.
      ENDIF.

      READ TABLE wt_fieldcat
           INTO ws_fieldcat
           INDEX wlt_file-col.

      CHECK sy-subrc EQ space.
      ASSIGN COMPONENT ws_fieldcat-fieldname
             OF STRUCTURE <wfs_structure>
             TO <wlfv_field>.
      CATCH SYSTEM-EXCEPTIONS conversion_errors = 1.
        MOVE wlt_file-value TO <wlfv_field>.
      ENDCATCH.

      IF sy-subrc EQ 1.
        " A FAIRE
      ENDIF.

    ENDLOOP.

*   Append last time.

    APPEND <wfs_structure> TO <wft_table>.

* Si fichier plat.

  ELSEIF p_flat EQ 'X'.

    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename = p_file
        filetype = 'DAT'
      TABLES
        data_tab = <wft_table>
      EXCEPTIONS
        OTHERS   = 10.

    IF sy-subrc NE space.
      WRITE : /3 text-003.
      STOP.
    ENDIF.

  ENDIF.

* Si vide la table avant.

  IF p_clear EQ 'X'.

*   Verification avant la suppression de la table.

    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar       = text-004
        text_question  = text-005
      IMPORTING
        answer         = wlv_char1
      EXCEPTIONS
        text_not_found = 1
        OTHERS         = 2.
    IF wlv_char1 EQ '2'.
      STOP.
    ENDIF.

*   On supprime tout.

    DELETE FROM (p_table).


    IF sy-subrc NE space.
      WRITE : /3 text-003.
      STOP.
    ENDIF.

  ENDIF.

* Chargement de la base.

  MODIFY (p_table) FROM TABLE <wft_table>.
  IF sy-subrc NE space.
    WRITE : /3 text-003.
    STOP.
  ENDIF.

ENDFORM. " P_CHARGEMENT.

*----------------------------------------------------------------------*
* Form P_CREATE_DYNTABLE.                                              *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*

FORM p_create_dyntable
     USING wpv_tabname TYPE tabname.


  DATA : wlt_table TYPE REF TO data ,
         wls_table TYPE REF TO data .

* On assigne le nom de la table.

  IF <wfv_structname> IS ASSIGNED.
    UNASSIGN <wfv_structname>.
  ENDIF.
  ASSIGN wpv_tabname TO <wfv_structname>.

* Recherche de la description du dictionnaire.

  REFRESH wt_fieldcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = <wfv_structname>
      i_bypassing_buffer     = 'X'
    CHANGING
      ct_fieldcat            = wt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  IF sy-subrc NE space.
    WRITE : /1 text-003.
    STOP.
  ENDIF.

* Création de la table interne dynamique.

  IF <wft_table> IS ASSIGNED.
    UNASSIGN <wft_table>.
  ENDIF.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = wt_fieldcat
    IMPORTING
      ep_table        = wlt_table.

  ASSIGN wlt_table->* TO <wft_table>.

* Création de la structure du type de la table.

  IF <wfs_structure> IS ASSIGNED.
    UNASSIGN <wfs_structure>.
  ENDIF.
  CREATE DATA wls_table LIKE LINE OF <wft_table>.
  ASSIGN wls_table->* TO <wfs_structure>.


ENDFORM. " P_CREATE_DYNTABLE.

*------------------------------- EVENTS -------------------------------*
* Au démarage de l'application.

INITIALIZATION.

* On desactive la zone vider la table, elle n'est active que pour
* le chargement.

  LOOP AT SCREEN.
    IF screen-name EQ 'P_CLEAR'.
      MOVE '0' TO screen-active.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

* A l'événement rafraichissement de l'écran.

AT SELECTION-SCREEN OUTPUT.

  LOOP AT SCREEN.

* Si on charge alors on active la zone P_CLEAR.

    IF p_imp EQ 'X'.
      IF screen-name EQ 'P_CLEAR'.
        MOVE '1' TO screen-active.
        MODIFY SCREEN.
      ENDIF.
    ELSE.
      IF screen-name EQ 'P_CLEAR'.
        MOVE '0' TO screen-active.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

* Evenement F4 sur P_FILE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      file_name = p_file.

*Text elements
*----------------------------------------------------------
* 001 Erreur : table inconnue
* 003 Erreur lors de l'export de la table
* 007 Import table *SAP* interdit
* T01 Paramètre de sélection
* T02 Paramètres import / export
* T03 Paramètres supp. d'export


*Selection texts
*----------------------------------------------------------
* P_CLEAR         Effacer la table avant
* P_EXCL         Fichier Excel
* P_EXP         Export
* P_FILE D       .
* P_FLAT         Fichier plat (tab)
* P_IMP         Import
* P_MAX         Nombre max d'enreg.
* P_TABLE D       .

Message was edited by: Frédéric Girod

Read only

0 Likes
1,683

Yes, now my code works well ...

Sorry for my post ...

I'm really sorry for the inconvenience.

My post was useless.

Read only

aferngas
Active Participant
0 Likes
1,684

Hi Youri,

It can be your fieldsymbol definition. It should be TYPE STANDARD TABLE for use GUI_UPLOAD function. Also you can do it with CL_GUI_FRONTEND_SERVICES:

DATA: lr_struct TYPE REF TO cl_abap_structdescr,

      lr_table  TYPE REF TO cl_abap_tabledescr,

      lr_data   TYPE REF TO data,

      lv_file   TYPE string.

FIELD-SYMBOLS <table> TYPE ANY.


lr_struct ?= cl_abap_typedescr=>describe_by_name( 'MARA' ).

lr_table = cl_abap_tabledescr=>create( p_line_type = lr_struct ).

CREATE DATA lr_data TYPE HANDLE lr_table.

ASSIGN lr_data->* TO <table>.

cl_gui_frontend_services=>gui_upload(

  EXPORTING filename            = lv_file

            has_field_separator = abap_true

   CHANGING data_tab            = <table> ).

In this example I create a data of table type MARA an filled from a csv (missing part where it retrieves the file name). In this case <table> can be TYPE ANY, TYPE ANY TABLE or TYPE STANDARD TABLE and it will still work.

Regards,

Alex