‎2008 Apr 27 6:46 PM
Hi guys,
I'm new to ABAP only a few months experience ,
I have a question ,
What does the transformation between XML and ABAP data structures
involve?
please help ; )
Arturo
‎2008 Apr 28 1:43 AM
look through these ,maybe this can help you
REPORT zvin01newbat NO STANDARD PAGE HEADING
MESSAGE-ID 00
LINE-COUNT 65
LINE-SIZE 160.
&----
*& TABLES:
&----
TABLES: objk, mara, makt, ytvin , ytdpvin ,
afpo, vbap , ser05 , t001w .
RANGES: r_werks FOR t001w-werks .
&----
*& CONSTANTS:
&----
*CONSTANTS
&----
*& PROGRAM VARIABLES
&----
&----
*& INTERNAL TABLES
&----
DATA: BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE ytvin.
DATA: veh_czrq(20) TYPE c,
veh_fzrq1(20) TYPE c,
veh_clzzrq1(20) TYPE c,
END OF itab.
&----
*& SELECT-OPTIONS
&----
&----
*& PAPAMETERS
&----
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_radioa RADIOBUTTON GROUP rad0,
p_radiob RADIOBUTTON GROUP rad0.
SELECT-OPTIONS: s_ytsn FOR ytvin-ytsn OBLIGATORY .
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_radio1 RADIOBUTTON GROUP rad1,
p_radio2 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN: END OF BLOCK b1.
&----
INITIALIZATION
&----
INITIALIZATION.
&----
AT SELECTION-SCREEN
&----
AT SELECTION-SCREEN.
&----
START-OF-SELECTION
&----
START-OF-SELECTION.
IF p_radioa = 'X' .
SELECT *
INTO TABLE itab
FROM ytvin
WHERE ytsn IN s_ytsn .
ELSE .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE itab
FROM ytdpvin
WHERE ytsn IN s_ytsn .
LOOP AT itab .
CONCATENATE itab-veh_fdjxh
itab-veh_fdjh
INTO itab-veh_fdjh
SEPARATED BY space .
itab-veh_zchgzbh = itab-veh_dphgzbh .
CLEAR itab-veh_dphgzbh .
MODIFY itab TRANSPORTING veh_fdjh veh_zchgzbh veh_dphgzbh .
ENDLOOP .
ENDIF .
LOOP AT itab.
CONCATENATE sy-datum+0(4) '-'
sy-datum+4(2) '-'
sy-datum+6(2) '#'
sy-uzeit+0(2) ':'
sy-uzeit+2(2) ':'
sy-uzeit+4(2)
INTO itab-veh_czrq.
TRANSLATE itab-veh_czrq USING '# '.
CONCATENATE itab-veh_fzrq+0(4) '-'
itab-veh_fzrq+6(2) '-'
itab-veh_fzrq+10(2) '#'
'00:00:00'
INTO itab-veh_fzrq1.
TRANSLATE itab-veh_fzrq1 USING '# '.
CONCATENATE itab-veh_clzzrq+0(4) '-'
itab-veh_clzzrq+6(2) '-'
itab-veh_clzzrq+10(2) '#'
'00:00:00'
INTO itab-veh_clzzrq1.
TRANSLATE itab-veh_clzzrq1 USING '# '.
MODIFY itab TRANSPORTING veh_czrq veh_fzrq1 veh_clzzrq1.
IF itab-veh_clztxx = 'QX' .
CONCATENATE itab-veh_fdjxh
itab-veh_fdjh
INTO itab-veh_fdjh
SEPARATED BY space .
MODIFY itab TRANSPORTING veh_fdjh .
ENDIF .
IF itab-veh_clztxx = 'JH' .
CLEAR: itab-veh_fdjxh , itab-veh_fdjh .
MODIFY itab TRANSPORTING veh_fdjxh veh_fdjh .
ENDIF .
ENDLOOP.
IF p_radio1 = 'X'.
PERFORM render_xml_file TABLES itab USING 'd:\upload.vm'
'C:\upload.xml'.
ELSEIF p_radio2 = 'X'.
PERFORM render_xml_file TABLES itab USING 'd:\DELERQ.vm'
'C:\DELERQ.xml'.
ENDIF .
************************************************************************
END-OF-SELECTION
************************************************************************
END-OF-SELECTION .
----
FORM render_xml_file *
----
........ *
----
--> P_OUTPUT *
----
FORM render_xml_file TABLES itab USING p_input p_output.
DATA: BEGIN OF it_data OCCURS 0,
line(255) TYPE c,
END OF it_data.
DATA: it_xml LIKE TABLE OF it_data WITH HEADER LINE,
it_header LIKE TABLE OF it_data WITH HEADER LINE,
it_foot LIKE TABLE OF it_data WITH HEADER LINE,
it_repeat LIKE TABLE OF it_data WITH HEADER LINE,
it_cont LIKE TABLE OF it_data WITH HEADER LINE.
DATA: line(255) TYPE c.
*0:header 1:content 2:foot
DATA: sign(1) TYPE c.
DATA: it_name(20) TYPE c.
FIELD-SYMBOLS: <fs> TYPE ANY.
DATA: fld_name(30) TYPE c.
DATA: prefix(30) TYPE c,
surfix(30) TYPE c.
DATA: dsn(20) VALUE 'Upload.vm'.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_input
filetype = 'DAT'
TABLES
data_tab = it_data
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
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.
sign = 0.
LOOP AT it_data.
line = it_data-line.
CONDENSE line.
IF line+0(8) = '#foreach'.
sign = 1.
PERFORM get_enclose_text
USING line '(' ')'
CHANGING it_name.
CONTINUE.
ELSEIF line+0(4) = '#end'.
sign = 2.
CONTINUE.
ENDIF.
CONDENSE it_data.
IF sign = 0.
APPEND it_data TO it_header.
ELSEIF sign = 2.
APPEND it_data TO it_foot.
ELSE.
APPEND it_data TO it_repeat.
ENDIF.
ENDLOOP.
LOOP AT itab.
LOOP AT it_repeat.
IF NOT it_repeat-line CS '$'.
it_cont-line = it_repeat-line.
ELSE.
PERFORM get_enclose_text
USING it_repeat-line '<' '>'
CHANGING prefix.
PERFORM get_enclose_text
USING it_repeat-line '/' '>'
CHANGING surfix.
PERFORM get_enclose_text
USING it_repeat-line '$' '<'
CHANGING fld_name.
ASSIGN COMPONENT fld_name OF STRUCTURE itab TO <fs>.
CONCATENATE '<' prefix '>'
<fs>
'</' surfix '>'
INTO it_cont-line.
ENDIF.
APPEND it_cont.
ENDLOOP.
ENDLOOP.
LOOP AT it_header.
APPEND it_header TO it_xml.
ENDLOOP.
LOOP AT it_cont.
APPEND it_cont TO it_xml.
ENDLOOP.
LOOP AT it_foot.
APPEND it_foot TO it_xml.
ENDLOOP.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = p_output
filetype = 'DAT'
TABLES
data_tab = it_xml
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
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.
ENDFORM.
----
FORM get_enclose_text *
----
........ *
----
--> P1 *
--> P2 *
--> P_TEXT *
----
FORM get_enclose_text USING p_orgin p1 p2 CHANGING p_text.
DATA: start TYPE i,
end TYPE i,
len TYPE i.
SEARCH p_orgin FOR p1.
IF sy-subrc = 0.
start = sy-fdpos.
ENDIF.
start = start + 1.
SEARCH p_orgin FOR p2 STARTING AT start.
IF sy-subrc = 0.
end = sy-fdpos.
ENDIF.
len = end - 1.
p_text = p_orgin+start(len).
CONDENSE p_text.
ENDFORM.
‎2008 Apr 28 1:43 AM
look through these ,maybe this can help you
REPORT zvin01newbat NO STANDARD PAGE HEADING
MESSAGE-ID 00
LINE-COUNT 65
LINE-SIZE 160.
&----
*& TABLES:
&----
TABLES: objk, mara, makt, ytvin , ytdpvin ,
afpo, vbap , ser05 , t001w .
RANGES: r_werks FOR t001w-werks .
&----
*& CONSTANTS:
&----
*CONSTANTS
&----
*& PROGRAM VARIABLES
&----
&----
*& INTERNAL TABLES
&----
DATA: BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE ytvin.
DATA: veh_czrq(20) TYPE c,
veh_fzrq1(20) TYPE c,
veh_clzzrq1(20) TYPE c,
END OF itab.
&----
*& SELECT-OPTIONS
&----
&----
*& PAPAMETERS
&----
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_radioa RADIOBUTTON GROUP rad0,
p_radiob RADIOBUTTON GROUP rad0.
SELECT-OPTIONS: s_ytsn FOR ytvin-ytsn OBLIGATORY .
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_radio1 RADIOBUTTON GROUP rad1,
p_radio2 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN: END OF BLOCK b1.
&----
INITIALIZATION
&----
INITIALIZATION.
&----
AT SELECTION-SCREEN
&----
AT SELECTION-SCREEN.
&----
START-OF-SELECTION
&----
START-OF-SELECTION.
IF p_radioa = 'X' .
SELECT *
INTO TABLE itab
FROM ytvin
WHERE ytsn IN s_ytsn .
ELSE .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE itab
FROM ytdpvin
WHERE ytsn IN s_ytsn .
LOOP AT itab .
CONCATENATE itab-veh_fdjxh
itab-veh_fdjh
INTO itab-veh_fdjh
SEPARATED BY space .
itab-veh_zchgzbh = itab-veh_dphgzbh .
CLEAR itab-veh_dphgzbh .
MODIFY itab TRANSPORTING veh_fdjh veh_zchgzbh veh_dphgzbh .
ENDLOOP .
ENDIF .
LOOP AT itab.
CONCATENATE sy-datum+0(4) '-'
sy-datum+4(2) '-'
sy-datum+6(2) '#'
sy-uzeit+0(2) ':'
sy-uzeit+2(2) ':'
sy-uzeit+4(2)
INTO itab-veh_czrq.
TRANSLATE itab-veh_czrq USING '# '.
CONCATENATE itab-veh_fzrq+0(4) '-'
itab-veh_fzrq+6(2) '-'
itab-veh_fzrq+10(2) '#'
'00:00:00'
INTO itab-veh_fzrq1.
TRANSLATE itab-veh_fzrq1 USING '# '.
CONCATENATE itab-veh_clzzrq+0(4) '-'
itab-veh_clzzrq+6(2) '-'
itab-veh_clzzrq+10(2) '#'
'00:00:00'
INTO itab-veh_clzzrq1.
TRANSLATE itab-veh_clzzrq1 USING '# '.
MODIFY itab TRANSPORTING veh_czrq veh_fzrq1 veh_clzzrq1.
IF itab-veh_clztxx = 'QX' .
CONCATENATE itab-veh_fdjxh
itab-veh_fdjh
INTO itab-veh_fdjh
SEPARATED BY space .
MODIFY itab TRANSPORTING veh_fdjh .
ENDIF .
IF itab-veh_clztxx = 'JH' .
CLEAR: itab-veh_fdjxh , itab-veh_fdjh .
MODIFY itab TRANSPORTING veh_fdjxh veh_fdjh .
ENDIF .
ENDLOOP.
IF p_radio1 = 'X'.
PERFORM render_xml_file TABLES itab USING 'd:\upload.vm'
'C:\upload.xml'.
ELSEIF p_radio2 = 'X'.
PERFORM render_xml_file TABLES itab USING 'd:\DELERQ.vm'
'C:\DELERQ.xml'.
ENDIF .
************************************************************************
END-OF-SELECTION
************************************************************************
END-OF-SELECTION .
----
FORM render_xml_file *
----
........ *
----
--> P_OUTPUT *
----
FORM render_xml_file TABLES itab USING p_input p_output.
DATA: BEGIN OF it_data OCCURS 0,
line(255) TYPE c,
END OF it_data.
DATA: it_xml LIKE TABLE OF it_data WITH HEADER LINE,
it_header LIKE TABLE OF it_data WITH HEADER LINE,
it_foot LIKE TABLE OF it_data WITH HEADER LINE,
it_repeat LIKE TABLE OF it_data WITH HEADER LINE,
it_cont LIKE TABLE OF it_data WITH HEADER LINE.
DATA: line(255) TYPE c.
*0:header 1:content 2:foot
DATA: sign(1) TYPE c.
DATA: it_name(20) TYPE c.
FIELD-SYMBOLS: <fs> TYPE ANY.
DATA: fld_name(30) TYPE c.
DATA: prefix(30) TYPE c,
surfix(30) TYPE c.
DATA: dsn(20) VALUE 'Upload.vm'.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_input
filetype = 'DAT'
TABLES
data_tab = it_data
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
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.
sign = 0.
LOOP AT it_data.
line = it_data-line.
CONDENSE line.
IF line+0(8) = '#foreach'.
sign = 1.
PERFORM get_enclose_text
USING line '(' ')'
CHANGING it_name.
CONTINUE.
ELSEIF line+0(4) = '#end'.
sign = 2.
CONTINUE.
ENDIF.
CONDENSE it_data.
IF sign = 0.
APPEND it_data TO it_header.
ELSEIF sign = 2.
APPEND it_data TO it_foot.
ELSE.
APPEND it_data TO it_repeat.
ENDIF.
ENDLOOP.
LOOP AT itab.
LOOP AT it_repeat.
IF NOT it_repeat-line CS '$'.
it_cont-line = it_repeat-line.
ELSE.
PERFORM get_enclose_text
USING it_repeat-line '<' '>'
CHANGING prefix.
PERFORM get_enclose_text
USING it_repeat-line '/' '>'
CHANGING surfix.
PERFORM get_enclose_text
USING it_repeat-line '$' '<'
CHANGING fld_name.
ASSIGN COMPONENT fld_name OF STRUCTURE itab TO <fs>.
CONCATENATE '<' prefix '>'
<fs>
'</' surfix '>'
INTO it_cont-line.
ENDIF.
APPEND it_cont.
ENDLOOP.
ENDLOOP.
LOOP AT it_header.
APPEND it_header TO it_xml.
ENDLOOP.
LOOP AT it_cont.
APPEND it_cont TO it_xml.
ENDLOOP.
LOOP AT it_foot.
APPEND it_foot TO it_xml.
ENDLOOP.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = p_output
filetype = 'DAT'
TABLES
data_tab = it_xml
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
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.
ENDFORM.
----
FORM get_enclose_text *
----
........ *
----
--> P1 *
--> P2 *
--> P_TEXT *
----
FORM get_enclose_text USING p_orgin p1 p2 CHANGING p_text.
DATA: start TYPE i,
end TYPE i,
len TYPE i.
SEARCH p_orgin FOR p1.
IF sy-subrc = 0.
start = sy-fdpos.
ENDIF.
start = start + 1.
SEARCH p_orgin FOR p2 STARTING AT start.
IF sy-subrc = 0.
end = sy-fdpos.
ENDIF.
len = end - 1.
p_text = p_orgin+start(len).
CONDENSE p_text.
ENDFORM.
‎2008 Apr 28 4:42 AM
Hello Arturo
The author of the previous posting is apparently not aware of the statement CALL TRANSFORMATION which allows you to easily convert between ABAP structures and XML. The ABAP keyword documentation is quite verbose:
Syntax
CALL TRANSFORMATION {trans|(name)}
[PARAMETERS {p1 = e1 p2 = e2 ...}|(ptab)]
[OBJECTS {o1 = e1 o2 = e2 ...}|(otab)]
[OPTIONS a1 = e1 a2 = e2 ...]
SOURCE {XML sxml}
| {{bn1 = e1 bn2 = e2 ...}|(stab)}
RESULT {XML rxml}
| {{bn1 = f1 bn2 = f2 ...}|(rtab)}.
This statement calls the specified XSL transformation (XSLT) or a simple transformation (ST, as of release 6.40). The source of the transformation is specified after SOURCE and the result is stored as specified after RESULT. Use PARAMETERS and OBJECTS to pass parameters to the transformation. Possible transformation types are:
from XML to XML (only for XSLT),
from XML to ABAP (for XSLT and simple transformations),
from ABAP to XML (for XSLT and simple transformations),
from ABAP to ABAP (only for XSLT),
where the last two types are available only as of release 6.20.
The name of the transformation can be specified either directly as trans or as content of a character-type data object name in braces. The specified transformation must exist as a XSLT program or as a simple transformation in the Repository.
If you like to learn more about the XML features of the SAP system have a look at the classes, interfaces and sample reports in packages SIXML and SIXML_TEST.
Regards
Uwe
‎2008 Apr 28 2:13 PM
so what does the transformation between XML and ABAP data structures generate? which of the following 3?
- Generation of ABAP proxy types from XML schemas.
- Generation of XML schemas from ABAP types.
- Neither generation of XML schemas from ABAP types nor generation of ABAP
proxy types from XML schemas.