SAP FUNC PARAMETERS TO PI XSD

2 篇文章 1 订阅
1 篇文章 0 订阅

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 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 lefta~structure,30 ) = t~typename

    WHERE funcname = @p_func

      AND r3state  = 'A'

    INTO CORRESPONDING FIELDS OF TABLE @gt_func.

  IF sy-subrc <> 0.

    MESSAGE s001(00WITH '函数不存在或未激活' 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(00WITH '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(00WITH '表参数请选择输入输出类型' DISPLAY LIKE 'E'.

    EXIT.

  ENDIF.

  CLEAR :gt_xmlgt_xmligt_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_existsgt_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  直接导出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值