Crear un XML con los datos de una tabla del sistema
Hola, chicos!.
Aquí tenéis un ejemplo sencillito. Lo que hace es descargar a una ruta local ( por defecto C:\ ), el contenido de la tabla del sistema MARA a un fichero XML.
Hay una parte del código - donde se lleva a cabo la transformación - que no sabría explicar qué hace, pero, vamos, el hecho es que funciona...
** Tabla del sistema
Tables: mara.
data: begin of i_idoc2 occurs 0.
include structure mara.
data: end of i_idoc2.
*** DECLARACION DE DATOS PARA EL TRATAMIENTO DEL XML
DATA: L_DOM TYPE REF TO IF_IXML_ELEMENT,
M_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT,
G_IXML TYPE REF TO IF_IXML,
W_STRING TYPE XSTRING,
W_SIZE TYPE I,
W_RESULT TYPE I,
W_LINE TYPE STRING,
IT_XML TYPE DCXMLLINES,
S_XML LIKE LINE OF IT_XML,
W_RC LIKE SY-SUBRC.
DATA: XML TYPE DCXMLLINES.
DATA: RC TYPE SY-SUBRC,
BEGIN OF XML_TAB OCCURS 0,
D LIKE LINE OF XML,
END OF XML_TAB.
*** RECUPERAMOS EL CONTENIDO DE LA TABLA MARA.
** Esta parte no tengo demasiado clara cómo explicarla, pero, a lo
** que voy, lo importante es que funciona....jajajaja
select * into
table i_idoc2 from mara.
CLASS CL_IXML DEFINITION LOAD.
G_IXML = CL_IXML=>CREATE( ).
CHECK NOT G_IXML IS INITIAL.
M_DOCUMENT = G_IXML->CREATE_DOCUMENT( ).
CHECK NOT M_DOCUMENT IS INITIAL.
CALL FUNCTION 'SDIXML_DATA_TO_DOM'
EXPORTING
NAME = 'IDOC'
DATAOBJECT = I_IDOC2[]
IMPORTING
DATA_AS_DOM = L_DOM
CHANGING
DOCUMENT = M_DOCUMENT
EXCEPTIONS
ILLEGAL_NAME = 1
OTHERS = 2.
CHECK NOT L_DOM IS INITIAL.
W_RC = M_DOCUMENT->APPEND_CHILD( NEW_CHILD = L_DOM ).
CALL FUNCTION 'SDIXML_DOM_TO_XML'
EXPORTING
DOCUMENT = M_DOCUMENT
IMPORTING
XML_AS_STRING = W_STRING
SIZE = W_SIZE
TABLES
XML_AS_TABLE = IT_XML
EXCEPTIONS
NO_DOCUMENT = 1
OTHERS = 2.
** Aquí ya tenemos la tabla con la estructura del fichero XML.
LOOP AT IT_XML INTO XML_TAB-D.
APPEND XML_TAB.
ENDLOOP.
DATA: W_SIZE TYPE I.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
* BIN_FILESIZE = W_SIZE
FILENAME = 'C:\FICHERO.XML'
FILETYPE = 'BIN'
TABLES
DATA_TAB = XML_TAB
EXCEPTIONS
OTHERS = 10.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Espero que os sirva, niños!
Raúl
|