09-26-2008 11:14 AM
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.
09-26-2008 12:31 PM
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.
09-26-2008 12:37 PM
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
09-30-2008 10:33 PM
Check this out: [Dynamic Internal Table Creation and selection|http://help-abap.blogspot.com/2008/09/dynamic-internal-table-creation.html]
Regards,
Naimesh Patel