Application Development 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: 

Dynamic Table selection

Former Member
0 Kudos

Hi All,

Please help me to resolve this Issue.

Internal table - IT which has table name like

KOTH600

KOTH601

KOTH602

KOTH603 , All these table has field KNUMH.

Loop at IT into WA. ( which has table name in it )

select * from (WA-TABNAME) into (New_WA)

where KNUMH = '100010'.

write:/ New_WA - NAME.

Endloop.

Here issue is table name is dynamic and depending upon this New_WA will change. How can I give both table name and work-area dynamic. ( I do not wish to define 4 new work-area, one for each to handle this situation as number of tables will increase going further ).

Thanks in advance,

Regards,

Mayank Rajguru.

3 REPLIES 3

Former Member
0 Kudos

In this example you have what you are looking for. Create dinamyc tables.

REPORT Z_DUMMY_ATG NO STANDARD PAGE HEADING MESSAGE-ID SAPLWOSA.

*=======================================================================

    • Variables*

*=======================================================================

DATA DESCR_STRUCT_REF TYPE REF TO CL_ABAP_STRUCTDESCR.

DATA WA_FCAT TYPE LVC_S_FCAT.

DATA IT_FIELDCATALOG TYPE LVC_T_FCAT.

DATA DATAREF TYPE REF TO DATA.

DATA: ONE LIKE PCFILE-DRIVE,

TWO LIKE PCFILE-PATH,

LONG TYPE I,

FLAG TYPE C,

FILEPATH(128) TYPE C,

FILE_TAB TYPE STRING,

TABNAME LIKE DD02L-TABNAME.

*=======================================================================

    • Field-Symbols.*

*=======================================================================

FIELD-SYMBOLS:

<ROW> TYPE ANY TABLE,

<TABLE> TYPE STANDARD TABLE,

<COMPONENT> TYPE ABAP_COMPDESCR,

<FS> TYPE ANY.

*=======================================================================

    • Selection screen*

*=======================================================================

SELECTION-SCREEN BEGIN OF BLOCK DATA WITH FRAME TITLE TEXT-T01.

PARAMETERS:

TABNAM(128) TYPE C,

FUNCTION(1) TYPE C OBLIGATORY,

LISTNAME LIKE RLGRAP-FILENAME.

SELECTION-SCREEN END OF BLOCK DATA.

*=======================================================================

    • At Selection screen*

*=======================================================================

AT SELECTION-SCREEN ON VALUE-REQUEST FOR LISTNAME.

PERFORM GET_FILENAME CHANGING LISTNAME.

*=======================================================================

    • Start-of-selection*

*=======================================================================

START-OF-SELECTION.

CLEAR FLAG.

PERFORM LOAD_DATA USING TABNAM.

PERFORM VERIFY_TABLE USING TABNAM CHANGING FLAG.

IF FLAG NE 'X'.

IF FUNCTION EQ 'D'.

PERFORM CREATE_TABLE USING TABNAM.

PERFORM DOWNLOAD_TABLE USING TABNAM.

ELSE.

PERFORM CREATE_TABLE USING TABNAM.

PERFORM UPLOAD_TABLE USING TABNAM.

ENDIF.

ELSE.

MESSAGE S000 WITH 'The proposed table doesn''t exist.'.

ENDIF.

*----


*

    • FORM GET_FILENAME **

*----


*

    • Name of the directory.*

*----


*

FORM GET_FILENAME CHANGING LISTNAME.

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

DEF_FILENAME = LISTNAME

DEF_PATH = 'C:\downloads\list'

MASK = ',.,.. '

MODE = 'S'

TITLE = 'Save as'

IMPORTING

FILENAME = LISTNAME

EXCEPTIONS

INV_WINSYS = 1

NO_BATCH = 2

SELECTION_CANCEL = 3

SELECTION_ERROR = 4

OTHERS = 5.

ENDFORM.

*----


*

    • FORM LOAD_DATA **

*----


*

    • Specifies the path and table name*

*----


*

FORM LOAD_DATA USING MY_TAB.

DATA: W_FILE LIKE PCFILE-PATH.

W_FILE = LISTNAME.

CALL FUNCTION 'PC_SPLIT_COMPLETE_FILENAME'

EXPORTING

COMPLETE_FILENAME = W_FILE

IMPORTING

DRIVE = ONE

PATH = TWO

EXCEPTIONS

INVALID_DRIVE = 1

INVALID_EXTENSION = 2

INVALID_NAME = 3

INVALID_PATH = 4

OTHERS = 5.

CONCATENATE ONE ':' TWO INTO FILEPATH.

CONCATENATE FILEPATH MY_TAB '.txt' INTO FILE_TAB.

ENDFORM.

*----


*

    • FORM DOWNLOAD_TABLE **

*----


*

    • Downloads the table data.*

*----


*

FORM DOWNLOAD_TABLE USING MY_TAB.

*SELECT **

INTO TABLE <ROW>

FROM (MY_TAB).

ASSIGN <ROW> TO <TABLE>.

CALL FUNCTION 'GUI_DOWNLOAD'

EXPORTING

FILENAME = FILE_TAB

FILETYPE = 'ASC'

TABLES

DATA_TAB = <TABLE>

EXCEPTIONS

FILE_WRITE_ERROR = 1

NO_BATCH = 2

GUI_REFUSE_FILETRANSFER = 3

INVALID_TYPE = 4

NO_AUTHORITY = 5

UNKNOWN_ERROR = 6.

IF SY-SUBRC EQ 0.

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = 'Successful Download'

TXT1 = 'All the data from the table'

TXT2 = 'was correctly downloaded.'.

ELSE.

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = 'Download Error!'

TXT1 = 'The data of the table'

TXT2 = 'couldn''t be downloaded.'.

ENDIF.

ENDFORM.

*----


*

    • FORM UPLOAD_TABLE **

*----


*

    • Table Upload.*

*----


*

FORM UPLOAD_TABLE USING MY_TAB.

ASSIGN <ROW> TO <TABLE>.

CALL FUNCTION 'GUI_UPLOAD'

EXPORTING

FILENAME = FILE_TAB

FILETYPE = 'ASC'

IMPORTING

FILELENGTH = LONG

TABLES

DATA_TAB = <TABLE>

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.

MODIFY (MY_TAB) FROM TABLE <TABLE>.

IF SY-SUBRC EQ 0.

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = 'Successful Upload'

TXT1 = 'All the data from the table'

TXT2 = 'was correctly uploaded.'.

ELSE.

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = 'Upload Error!'

TXT1 = 'The data of the table'

TXT2 = 'couldn''t be uploaded.'.

ENDIF.

ENDFORM.

*----


*

    • FORM CREATE_TABLE **

*----


*

    • Creates a dynamic internal table.*

*----


*

FORM CREATE_TABLE USING MY_TAB.

CREATE DATA DATAREF TYPE (MY_TAB).

ASSIGN DATAREF-> TO <FS>.*

DESCR_STRUCT_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <FS> ).

LOOP AT DESCR_STRUCT_REF->COMPONENTS ASSIGNING <COMPONENT>.

WA_FCAT-FIELDNAME = <COMPONENT>-NAME.

WA_FCAT-REF_TABLE = MY_TAB.

WA_FCAT-REF_FIELD = <COMPONENT>-NAME.

APPEND WA_FCAT TO IT_FIELDCATALOG.

ENDLOOP.

CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE

EXPORTING

IT_FIELDCATALOG = IT_FIELDCATALOG

IMPORTING

EP_TABLE = DATAREF

EXCEPTIONS

GENERATE_SUBPOOL_DIR_FULL = 1

OTHERS = 2.

ASSIGN DATAREF-> TO <ROW>.*

ENDFORM.

*&----


*

*& Form VERIFY_TABLE

*&----


*

    • The table must exist!*

*----


*

FORM VERIFY_TABLE USING TABNAM CHANGING FLAG.

SELECT SINGLE TABNAME

INTO (TABNAME)

FROM DD02L

WHERE TABNAME EQ TABNAM.

IF SY-SUBRC NE 0.

FLAG = 'X'.

ENDIF.

ENDFORM.

Former Member
0 Kudos

Hi,

you can determine both internal table and workarea during runtime. If you give any database table as input it will retrieve all record of it.

Check this code

REPORT Z_RTTC.
PARAMETERS:
p_tab TYPE dd02l-tabname .                  " Input data table name
 
FIELD-SYMBOLS:
<fsym_itab> TYPE ANY TABLE,                 " Field symbol for internal table
<fsym_warea> TYPE ANY,                      " Field symbol for work area
<fsym_field> TYPE ANY.                      " Field symbol for field value

DATA:
ref_rowtype
TYPE REF TO cl_abap_structdescr,            " Rowtype ref to RTTS
ref_tabletype
TYPE REF TO cl_abap_tabledescr.             " Internal table type ref to RTTS

DATA:
ref_wa TYPE REF TO data, 		       " Declaration of work area instance
ref_itab TYPE REF TO data.                  " Declaration of internal table instance
 
 
*"---------------------------------------------------------------------
* START-OF-SELECTION
*"---------------------------------------------------------------------

START-OF-SELECTION.

* Create row type and tabletype by RTTC technique
ref_rowtype ?= cl_abap_typedescr=>describe_by_name( p_tab ).
ref_tabletype = cl_abap_tabledescr=>create( p_line_type = ref_rowtype).
 
* Object type created by RTTC.
CREATE DATA ref_itab TYPE HANDLE ref_tabletype.
CREATE DATA ref_wa TYPE HANDLE ref_rowtype.
 
*Type assignment
ASSIGN ref_itab->* TO <fsym_itab>.
ASSIGN ref_wa->* TO <fsym_warea>.
 
* Value assignment to the internal table 
SELECT *
FROM (p_tab)
INTO TABLE <fsym_itab>.
 
* Display Output 
LOOP AT <fsym_itab> INTO <fsym_warea>.

DO.

ASSIGN COMPONENT sy-index OF STRUCTURE <fsym_warea> TO

<fsym_field>.

IF sy-subrc NE 0.

NEW-LINE.                           " Shift Cursor to next line
EXIT.                               " EXIT to next work area

ENDIF.                              " IF sy-subrc NE 0.

WRITE <fsym_field>.

ENDDO.

ENDLOOP.                            " LOOP AT <fsym_itab> INTO <fsym_warea>.

Regards,

Anirban

naimesh_patel
Active Contributor
0 Kudos

Check this out: [Dynamic Internal Table Creation and selection|http://help-abap.blogspot.com/2008/09/dynamic-internal-table-creation.html]

Regards,

Naimesh Patel