REPORT ytestfunc.
TABLES tfdir.
"function
TYPES : BEGIN OF ty_func.
INCLUDE TYPE fupararef.
TYPES : typekind TYPE ddtypekind, "DDTYPES
tabname TYPE tabname,
isin TYPE c,
isout TYPE c,
isbak TYPE c,
style TYPE lvc_t_styl,
END OF ty_func.
"Structure
TYPES : BEGIN OF ty_stru,
tabname TYPE dd03l-tabname,
fieldname TYPE dd03l-fieldname,
datatype TYPE dd03l-datatype,
rollname TYPE dd03l-rollname,
ddtext TYPE dd03t-ddtext,
isread TYPE flag,
END OF ty_stru.
TYPES : tt_stru TYPE STANDARD TABLE OF ty_stru INITIAL SIZE 0.
"xsd
TYPES : BEGIN OF ty_xml,
line TYPE string,
END OF ty_xml.
TYPES : tt_xml TYPE STANDARD TABLE OF ty_xml INITIAL SIZE 0.
"Table/Structure Field
DATA : gt_flds TYPE tt_stru,
gt_fld1 TYPE tt_stru,
gt_fld2 TYPE tt_stru.
DATA : gt_xml TYPE tt_xml,
gt_xmli TYPE tt_xml,
gt_xmlo TYPE tt_xml.
"Function parameters
DATA : gt_func TYPE STANDARD TABLE OF ty_func.
DATA : lv_xml TYPE string,
lv_flds TYPE fieldname,
lv_dtext TYPE ddtext.
DEFINE addl.
APPEND VALUE #( line = &1 ) TO gt_xml.
END-OF-DEFINITION.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS : p_func TYPE tfdir-funcname OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_stru TYPE dd02l-tabname NO-DISPLAY,
p_space TYPE string LOWER CASE,
p_dtype TYPE string LOWER CASE OBLIGATORY,
p_ddesc TYPE string LOWER CASE,
p_item TYPE string LOWER CASE DEFAULT 'item',
p_bak TYPE c AS CHECKBOX USER-COMMAND u1,
p_bakn TYPE fieldname LOWER CASE DEFAULT 'ZBAK' MODIF ID m1,
p_bakc TYPE n LENGTH 2 DEFAULT 4 MODIF ID m1,
p_deep TYPE c AS CHECKBOX MODIF ID m1.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
PARAMETERS : r_dwn AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b3.
*INITIALIZATION.
* SET LOCALE LANGUAGE 'E'.
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_set_screen.
START-OF-SELECTION.
PERFORM frm_get_parameters USING p_func.
PERFORM frm_alv_display.
*&---------------------------------------------------------------------*
*& Form FRM_GET_PARAMETERS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FUNC
*&---------------------------------------------------------------------*
FORM frm_get_parameters USING p_func TYPE rs38l_fnam.
DATA :ls_style TYPE lvc_s_styl,
lt_style TYPE lvc_t_styl.
IF p_bak = ''.
p_deep = ''.
ENDIF.
DEFINE sty.
CLEAR ls_style.
ls_style-fieldname = &1.
ls_style-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_style INTO TABLE lt_style.
END-OF-DEFINITION.
SELECT
a~funcname,
a~r3state,
a~parameter,
a~paramtype,
a~structure,
a~defaultval,
a~reference,
a~pposition,
a~optional,
a~type,
a~class,
a~ref_class,
t~typekind
FROM fupararef AS a LEFT JOIN ddtypes AS t ON left( a~structure,30 ) = t~typename
WHERE funcname = @p_func
AND r3state = 'A'
INTO CORRESPONDING FIELDS OF TABLE @gt_func.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH '函数不存在或未激活' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
*I 导入参数
*C 更改参数
*E 导出参数
*T 表参数
sty 'ISIN'.
sty 'ISOUT'.
LOOP AT gt_func ASSIGNING FIELD-SYMBOL(<fs_func>).
CLEAR <fs_func>-style.
CASE <fs_func>-paramtype.
WHEN 'I'.
<fs_func>-isin = 'X'.
<fs_func>-style = lt_style[].
WHEN 'E'.
<fs_func>-isout = 'X'.
<fs_func>-style = lt_style[].
WHEN 'C'.
<fs_func>-isin = 'X'.
<fs_func>-isout = 'X'.
<fs_func>-style = lt_style[].
WHEN 'T'.
WHEN OTHERS.
<fs_func>-style = lt_style[].
ENDCASE.
CHECK p_bak = 'X'.
CASE <fs_func>-typekind.
WHEN 'TTYP'.
WHEN 'TABL' OR 'VIEW'.
IF <fs_func>-paramtype <> 'T'.
ENDIF.
WHEN OTHERS.
INSERT VALUE #( fieldname = 'ISBAK' style = cl_gui_alv_grid=>mc_style_disabled ) INTO TABLE <fs_func>-style.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_screen .
CHECK p_bak IS INITIAL.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_display .
DATA : ls_layout TYPE lvc_s_layo,
lt_flcat TYPE lvc_t_fcat,
ls_flcat TYPE lvc_s_fcat,
lv_title TYPE lvc_title.
DEFINE alv.
ls_flcat-fieldname = &1.
ls_flcat-scrtext_m = &2. "SCRTEXT_M
ls_flcat-outputlen = &3.
IF &4 = 'C'.
ls_flcat-checkbox = 'X'.
ls_flcat-edit = 'X'.
APPEND ls_flcat TO lt_flcat.
ELSEIF &4 IS NOT INITIAL.
ls_flcat-col_pos = &4.
INSERT ls_flcat INTO lt_flcat INDEX &4.
ELSE.
APPEND ls_flcat TO lt_flcat.
ENDIF.
CLEAR ls_flcat.
END-OF-DEFINITION.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'FUPARAREF'
CHANGING
ct_fieldcat = lt_flcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
DELETE lt_flcat WHERE col_pos > 12.
alv : 'ISIN' '输入参数' '1' 'C'.
alv : 'ISOUT' '输出参数' '1' 'C'.
alv : 'TYPEKIND' '类型种类' '30' '6'.
IF p_bak = 'X'.
alv : 'ISBAK' '备用' '1' 'C'.
ENDIF.
ls_layout-zebra = 'X' .
ls_layout-cwidth_opt = 'X' .
ls_layout-stylefname = 'STYLE' .
PERFORM frm_get_title USING p_func CHANGING lv_title.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_user_command = 'USER_COMMAND'
* i_callback_pf_status_set = 'SET_PF_STATUS'
is_layout_lvc = ls_layout
it_fieldcat_lvc = lt_flcat[]
i_save = 'A'
TABLES
t_outtab = gt_func
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> rt_extab Excluding function code
*&
*&---------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
DATA lv_title TYPE lvc_title.
* SET PF-STATUS 'FUNC' EXCLUDING rt_extab.
PERFORM frm_get_title USING p_func CHANGING lv_title.
SET TITLEBAR 'FUNC' WITH lv_title.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
*& 文本
*&---------------------------------------------------------------------*
*& --> r_ucomm
*& --> rs_selfield
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&DATA_SAVE'.
PERFORM frm_gen_xml.
WHEN OTHERS.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& Download XSD file
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_download TABLES pt_xml TYPE tt_xml USING p_nam.
CHECK r_dwn = 'X'.
CHECK pt_xml[] IS NOT INITIAL.
DATA :filename TYPE string,
path TYPE string,
fullpath TYPE string,
defnam TYPE string,
lv_title TYPE string,
user_action TYPE i.
defnam = p_dtype && p_nam.
lv_title = TEXT-t02.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'xsd'
default_file_name = defnam
* with_encoding = '4110'
file_filter = '*.xsd'
* initial_directory =
* prompt_on_overwrite = 'X'
CHANGING
filename = filename
path = path
fullpath = fullpath
user_action = user_action
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH 'GET FILENAME ERROR' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = fullpath
filetype = 'ASC'
codepage = '4110' "UTF-8 - 否则有可能PO无法识别
TABLES
data_tab = pt_xml
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.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GEN_XML
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_gen_xml .
DATA lo_grid TYPE REF TO cl_gui_alv_grid.
DATA:lv_tab TYPE tabname,
lv_fld TYPE fieldname,
lv_desc TYPE ddtext,
lv_type TYPE rs38l_kind,
lv_stru TYPE rs38l_typ.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->check_changed_data.
READ TABLE gt_func WITH KEY paramtype = 'T' isin = space isout = space TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
MESSAGE s001(00) WITH '表参数请选择输入输出类型' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
CLEAR :gt_xml, gt_xmli, gt_xmlo.
LOOP AT gt_func ASSIGNING FIELD-SYMBOL(<fs_func>)
WHERE typekind = 'TTYP' OR typekind = 'TABL' OR typekind = 'VIEW'.
lv_tab = <fs_func>-structure.
PERFORM frm_get_structure CHANGING lv_tab.
READ TABLE gt_flds WITH KEY tabname = lv_tab TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
PERFORM frm_get_fields USING lv_tab .
ENDIF.
<fs_func>-tabname = lv_tab.
ENDLOOP.
* SORT gt_flds BY tabname fieldname.
* DELETE ADJACENT DUPLICATES FROM gt_flds COMPARING tabname fieldname.
PERFORM frm_create_xml.
PERFORM frm_show_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FIELDS
*&---------------------------------------------------------------------*
*& 递归读取字段中的深度结构、表
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_fields USING pv_tab TYPE tabname.
DATA:lv_tab TYPE tabname.
PERFORM frm_get_flds TABLES gt_fld1 USING pv_tab.
APPEND LINES OF gt_fld1[] TO gt_flds[].
DO.
IF sy-index > 10.
EXIT.
ENDIF.
LOOP AT gt_flds ASSIGNING FIELD-SYMBOL(<fs_line>) WHERE isread IS INITIAL AND
( datatype = 'TTYP' OR datatype = 'VIEW' OR datatype = 'STRU' ).
lv_tab = <fs_line>-rollname.
"表类型需要读取其 行类型 结构名称
IF <fs_line>-datatype = 'TTYP'.
SELECT SINGLE rowtype INTO @lv_tab
FROM dd40l
WHERE typename = @<fs_line>-rollname
AND as4local = 'A'.
ENDIF.
"读取行类型、结构字段清单
READ TABLE gt_flds WITH KEY tabname = lv_tab TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
PERFORM frm_get_flds TABLES gt_fld2 USING lv_tab.
ENDIF.
* PERFORM frm_get_flds TABLES gt_fld2 USING lv_tab.
"更新为行类型名称
IF line_exists( gt_fld2[ 1 ] ).
gt_fld2[ 1 ]-tabname = <fs_line>-rollname.
MODIFY gt_fld2 FROM gt_fld2[ 1 ] TRANSPORTING tabname WHERE tabname = lv_tab.
ENDIF.
APPEND LINES OF gt_fld2[] TO gt_flds[].
"递归退出条件
<fs_line>-isread = 'X'.
ENDLOOP.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FLDS
*&---------------------------------------------------------------------*
*& 读取表、结构字段
*&---------------------------------------------------------------------*
*& --> TABNAME
*&---------------------------------------------------------------------*
FORM frm_get_flds TABLES pt_tab TYPE tt_stru USING p_tabname TYPE tabname.
REFRESH pt_tab.
SELECT
l~tabname,
l~fieldname,
l~datatype,
l~rollname,
CASE WHEN t1~ddtext IS NULL THEN t2~ddtext ELSE t1~ddtext END AS ddtext
FROM dd03l AS l
LEFT JOIN dd03t AS t1 ON t1~tabname = l~tabname AND t1~ddlanguage = @sy-langu AND t1~as4local = 'A' AND t1~fieldname = l~fieldname
LEFT JOIN dd04t AS t2 ON t2~rollname = l~rollname AND t2~ddlanguage = @sy-langu
WHERE l~tabname = @p_tabname
AND l~as4local = 'A'
AND l~as4vers = '0000'
AND l~fieldname NOT LIKE '.INC%' "comptype <> 'S'
AND l~depth = '00'
ORDER BY position
INTO TABLE @pt_tab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_TITLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_title USING pv_func TYPE rs38l_fnam CHANGING cv_title TYPE lvc_title.
SELECT SINGLE funcname && stext AS cv_title INTO @cv_title
FROM tftit
WHERE spras = @sy-langu
AND funcname = @pv_func.
IF sy-subrc <> 0.
cv_title = pv_func.
ENDIF.
SET TITLEBAR 'FUNC' WITH cv_title.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_START_XML
*&---------------------------------------------------------------------*
*& XSD 文件抬头
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_start_xml USING p_nam.
IF p_space IS INITIAL.
p_space = |http://test.demo.com|.
ELSE.
CONDENSE p_space.
ENDIF.
"start
* lv_xml = |<?xml version="1.0" encoding="UTF-8"?>|.
* addl lv_xml.
lv_xml = |<xsd:schema targetNamespace="{ p_space }" xmlns:xsd="http://www.w3.org/2001/XMLSchema" |.
addl lv_xml.
lv_xml = | xmlns="{ p_space }" >|.
addl lv_xml.
lv_xml = |<xsd:complexType name="{ p_dtype && p_nam }">|.
addl lv_xml.
IF p_ddesc IS NOT INITIAL.
lv_xml = |<xsd:annotation>| .
addl lv_xml.
lv_xml = |<xsd:documentation xml:lang="EN">{ p_ddesc }</xsd:documentation>| .
addl lv_xml.
lv_xml = |</xsd:annotation>|.
addl lv_xml.
ENDIF.
lv_xml = |<xsd:sequence>|.
addl lv_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_END_XML
*&---------------------------------------------------------------------*
*& XSD 文件结尾
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_end_xml .
"end
lv_xml = |</xsd:sequence>|.
addl lv_xml.
lv_xml = |</xsd:complexType>|.
addl lv_xml.
lv_xml = |</xsd:schema>|.
addl lv_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_BAK_XML
*&---------------------------------------------------------------------*
*& 备用字段
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_bak_xml .
CHECK p_bak = 'X'.
DATA : lv_field TYPE fieldname,
lv_text TYPE ddtext,
lv_numc TYPE n LENGTH 2.
DO p_bakc TIMES.
lv_numc = sy-index.
lv_field = |{ p_bakn }{ lv_numc }|.
lv_text = |{ TEXT-t01 }{ lv_numc }|.
PERFORM frm_set_list_xml USING 'CHAR' lv_field space lv_text ''.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LIST_XML
*&---------------------------------------------------------------------*
*& 行中单个字段转 XSD
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_list_xml USING p_datatype p_fieldname p_rollname p_ddtext p_bak.
CASE p_datatype.
WHEN 'STRU' OR 'TABL'.
PERFORM frm_set_struc_2_xml USING p_fieldname p_rollname p_bak.
WHEN 'TTYP'.
PERFORM frm_set_table_2_xml USING p_fieldname p_rollname p_bak.
WHEN OTHERS.
PERFORM frm_set_field_2_xml USING p_fieldname p_ddtext '' ''.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_TABLE_2_XML
*&---------------------------------------------------------------------*
*& 表 -
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_table_2_xml USING p_field p_tabname p_bak.
"table - start
lv_flds = p_field.
"是否需要子层节点
IF NOT p_item IS INITIAL.
lv_xml = |<xsd:element name="{ lv_flds }" minOccurs="0">|.
ELSE.
lv_xml = |<xsd:element name="{ lv_flds }" minOccurs="0" maxOccurs="unbounded">|.
ENDIF.
addl lv_xml.
lv_xml = |<xsd:complexType>|.
addl lv_xml.
lv_xml = |<xsd:sequence>|.
addl lv_xml.
"子层节点
IF NOT p_item IS INITIAL.
"ITEM - start
lv_xml = |<xsd:element name="{ p_item }" minOccurs="0" maxOccurs="unbounded">|.
addl lv_xml.
lv_xml = |<xsd:complexType>|.
addl lv_xml.
lv_xml = |<xsd:sequence>|.
addl lv_xml.
ENDIF.
"bus. fields
LOOP AT gt_flds ASSIGNING FIELD-SYMBOL(<fs_flds>) WHERE tabname = p_tabname.
lv_flds = <fs_flds>-fieldname.
lv_dtext = <fs_flds>-ddtext.
PERFORM frm_set_list_xml USING <fs_flds>-datatype <fs_flds>-fieldname <fs_flds>-rollname <fs_flds>-ddtext p_deep.
ENDLOOP.
"back fields
IF p_bak = 'X'.
PERFORM frm_set_bak_xml.
ENDIF.
"ITEM - end
IF NOT p_item IS INITIAL.
lv_xml = |</xsd:sequence>| .
addl lv_xml.
lv_xml = |</xsd:complexType>| .
addl lv_xml.
lv_xml = |</xsd:element>|.
addl lv_xml.
ENDIF.
"table - end
lv_xml = |</xsd:sequence>| .
addl lv_xml.
lv_xml = |</xsd:complexType>| .
addl lv_xml.
lv_xml = |</xsd:element>|.
addl lv_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELD_2_XML
*&---------------------------------------------------------------------*
*& 单个字段
*&---------------------------------------------------------------------*
*& --> <FS_LINE>_FIELDNAME
*& --> <FS_LINE>_DDTEXT
*&---------------------------------------------------------------------*
FORM frm_set_field_2_xml USING p_fieldname p_ddtext p_stru p_type.
DATA lv_fld TYPE char200.
lv_fld = p_fieldname.
IF lv_fld CS '/'.
REPLACE ALL OCCURRENCES OF '/' IN lv_fld WITH '_'.
ENDIF.
"fields
lv_xml = |<xsd:element name="{ lv_fld }" type="xsd:string" minOccurs="0">|.
addl lv_xml.
"描述
IF p_ddtext IS NOT INITIAL AND p_ddtext <> 'X'.
lv_xml = | <xsd:annotation>|.
addl lv_xml.
lv_xml = | <xsd:documentation>{ p_ddtext }</xsd:documentation>|.
addl lv_xml.
lv_xml = | </xsd:annotation>|.
addl lv_xml.
ENDIF.
lv_xml = |</xsd:element>|.
addl lv_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_STRUC_2_XML
*&---------------------------------------------------------------------*
*& 结构
*&---------------------------------------------------------------------*
*& --> <FS_LINE>_FIELDNAME
*& --> <FS_LINE>_ROLLNAME
*&---------------------------------------------------------------------*
FORM frm_set_struc_2_xml USING p_fieldname p_rollname p_bak.
lv_flds = p_fieldname.
"Structure - start
lv_xml = |<xsd:element name="{ lv_flds }" minOccurs="0">|.
addl lv_xml.
lv_xml = |<xsd:complexType>|.
addl lv_xml.
lv_xml = |<xsd:sequence>|.
addl lv_xml.
"fields
LOOP AT gt_flds ASSIGNING FIELD-SYMBOL(<fs_flds>) WHERE tabname = p_rollname.
lv_flds = <fs_flds>-fieldname.
lv_dtext = <fs_flds>-ddtext.
PERFORM frm_set_list_xml USING <fs_flds>-datatype <fs_flds>-fieldname
<fs_flds>-rollname <fs_flds>-ddtext p_deep.
ENDLOOP.
IF p_bak = 'X'.
PERFORM frm_set_bak_xml.
ENDIF.
"Structure - end
lv_xml = |</xsd:sequence>| .
addl lv_xml.
lv_xml = |</xsd:complexType>| .
addl lv_xml.
lv_xml = |</xsd:element>|.
addl lv_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_XML
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_create_xml .
"输入
READ TABLE gt_func WITH KEY isin = 'X' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
PERFORM frm_set_start_xml USING 'Req'.
PERFORM frm_set_main_xml USING 'Req'.
PERFORM frm_set_end_xml.
gt_xmli[] = gt_xml[].
CLEAR gt_xml[].
ENDIF.
"输出
READ TABLE gt_func WITH KEY isout = 'X' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
PERFORM frm_set_start_xml USING 'Rsp'.
PERFORM frm_set_main_xml USING 'Rsp'.
PERFORM frm_set_end_xml.
gt_xmlo[] = gt_xml[].
ENDIF.
APPEND INITIAL LINE TO gt_xml.
APPEND LINES OF gt_xmli TO gt_xml.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_MAIN_XML
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_main_xml USING p_typ.
DATA : lv_stru TYPE string,
lv_type TYPE ddtypekind,
lv_name TYPE string,
lv_end TYPE c.
CASE p_typ.
WHEN 'Req'.
"输入参数
lv_name = |{ p_dtype }Req|.
* PERFORM frm_set_conplex_xml USING lv_name ''.
LOOP AT gt_func ASSIGNING FIELD-SYMBOL(<fs_func>) WHERE isin = 'X'.
lv_type = <fs_func>-typekind.
IF <fs_func>-paramtype = 'T'.
lv_type = 'TTYP'.
ENDIF.
CASE <fs_func>-typekind.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
lv_stru = <fs_func>-structure.
IF <fs_func>-tabname IS NOT INITIAL.
lv_stru = <fs_func>-tabname.
ENDIF.
WHEN OTHERS.
lv_stru = ''.
ENDCASE.
PERFORM frm_set_list_xml USING lv_type <fs_func>-parameter lv_stru '' <fs_func>-isbak.
ENDLOOP.
* PERFORM frm_set_conplex_xml USING lv_name 'X'.
WHEN 'Rsp'.
"输出参数
lv_name = |{ p_dtype }Rsp|.
* PERFORM frm_set_conplex_xml USING lv_name ''.
LOOP AT gt_func ASSIGNING <fs_func> WHERE isout = 'X'.
lv_type = <fs_func>-typekind.
IF <fs_func>-paramtype = 'T'.
lv_type = 'TTYP'.
ENDIF.
CASE <fs_func>-typekind.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
lv_stru = <fs_func>-structure.
IF <fs_func>-tabname IS NOT INITIAL.
lv_stru = <fs_func>-tabname.
ENDIF.
WHEN OTHERS.
lv_stru = ''.
ENDCASE.
PERFORM frm_set_list_xml USING lv_type <fs_func>-parameter lv_stru '' <fs_func>-isbak.
ENDLOOP.
* PERFORM frm_set_conplex_xml USING lv_name 'X'.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_CONPLEX_XML
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_NAME
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_set_conplex_xml USING pv_name
VALUE(p_flag).
CASE p_flag.
WHEN space.
lv_xml = |<xsd:element name="{ pv_name }" minOccurs="0">|.
addl lv_xml.
lv_xml = |<xsd:complexType>|.
addl lv_xml.
lv_xml = |<xsd:sequence>|.
addl lv_xml.
WHEN 'X'.
lv_xml = |</xsd:sequence>|.
addl lv_xml.
lv_xml = |</xsd:complexType>|.
addl lv_xml.
lv_xml = |</xsd:element>|.
addl lv_xml.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_STRUCTURE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_TAB
*&---------------------------------------------------------------------*
FORM frm_get_structure CHANGING pv_tab.
SELECT SINGLE typekind INTO @DATA(lv_type)
FROM ddtypes
WHERE typename = @pv_tab.
CHECK sy-subrc = 0.
CHECK lv_type = 'TTYP'.
SELECT SINGLE rowtype INTO @DATA(lv_row)
FROM dd40l
WHERE typename = @pv_tab
AND as4local = 'A'.
CHECK sy-subrc = 0.
pv_tab = lv_row.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_XML
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_xml .
IF r_dwn = 'X'.
PERFORM frm_download TABLES gt_xmli USING 'Req'.
PERFORM frm_download TABLES gt_xmlo USING 'Rsp'.
ENDIF.
CALL FUNCTION 'ZSD_ALVGRID'
TABLES
it_out = gt_xml.
ENDFORM.
*001 XSD
*002 Function
*003 Export
*T01 备用字段
*T02 保存
*
*P_BAK 启用备用字段
*P_BAKC 备用字段数
*P_BAKN 备用字段名
*P_DDESC XSD结构描述
*P_DEEP 下层结构增加备用字段
*P_DTYPE XSD结构名称
*P_FUNC 功能模块
*P_SPACE 命名空间
*R_DWN 直接导出