Muchas veces tenemos que hacer programas de integración, en los cuales debemos descargar muchas tablas en archivos planos. Lo que se hacía antes era crear un GUI_DOWNLOAD por cada archivo...Pero que pasa si tenemos que crear 5,6 o 7 archivos planos? Pues muy simple, creamos una tabla interna dinámica y un solo GUI_DOWNLOAD que descargue todas las tablas. Aquí está el código -;)
*------------------------------------------------------------*
* DECLARACION DE VARIABLES *
*------------------------------------------------------------*
DATA: DESCR_STRUCT_REF TYPE REF TO CL_ABAP_STRUCTDESCR,
DATAREF TYPE REF TO DATA,
WA_FCAT TYPE LVC_S_FCAT,
IT_FIELDCATALOG TYPE LVC_T_FCAT,
TABNAME TYPE DD02L-TABNAME,
NEW_LINE TYPE REF TO DATA,
FILE_TAB TYPE STRING,
LONG TYPE I.
*&-----------------------------------------------------------*
*& Form CREATE_TABLE *
*&-----------------------------------------------------------*
* Creamos una tabla interna dinámica *
*------------------------------------------------------------*
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 <DYN_TABLE>.
CREATE DATA NEW_LINE LIKE LINE OF <DYN_TABLE>.
ASSIGN NEW_LINE->* TO <DYN_WA>.
ENDFORM. "CREATE_TABLE
*&-----------------------------------------------------------*
*& Form DESCARGAR_TABLA *
*&-----------------------------------------------------------*
* Descargamos la tabla interna a un archivo plano *
*------------------------------------------------------------*
FORM DESCARGAR_TABLA TABLES P_TABLA.
LOOP AT P_TABLA ASSIGNING <LINE>.
G_LINES = <LINE>.
ASSIGN <DYN_WA> TO <TABLE>.
<TABLE> = G_LINES.
APPEND <DYN_WA> TO <DYN_TABLE>.
ENDLOOP.
FILE_TAB = P_FILE.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = FILE_TAB
FILETYPE = 'ASC'
IMPORTING
FILELENGTH = LONG
TABLES
DATA_TAB = <DYN_TABLE>
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
ENDFORM. "DESCARGAR_TABLA
La forma de utilizar el código sería la siguiente:
DATA: T_MARA TYPE STANDARD TABLE OF MARA
WITH HEADER LINE.
TABNAME = 'T_MARA'.
PERFORM CREATE_TABLE USING TABNAME.
PERFORM DESCARGAR_TABLA TABLES T_MARA.
Saludos,
Blag.
3 comments:
Excelente!... muchas gracias
viejo, no me compila, me saca errores con cosas como por ejemplo
Como por ejemplo que? Este codigo lo hice hace tiempo y si mal no recuerdo para 4.6D...si lo pruebas en otro R/3 pueden haber cosas que han cambiado...
Post a Comment