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:

  1. Anonymous7:55 AM

    Excelente!... muchas gracias

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

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

    ReplyDelete