Tuesday, October 10, 2006

Archivos planos y ABAP


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:

Anonymous said...

Excelente!... muchas gracias

Juvenal said...

viejo, no me compila, me saca errores con cosas como por ejemplo

Alvaro "Blag" Tejada Galindo said...

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...