SAP 导出RFC XSD文件

一般CPI到Mapping步骤直接使用RFC的WSDL也可以,通过此方式可以根据RFC的出入参数,导出带item或不带item节点的XSD文件

REPORT yxx_get_xsd.

" XML解析工具
DATA: go_ixml          TYPE REF TO if_ixml,
      go_streamfactory TYPE REF TO if_ixml_stream_factory,
      go_ostream       TYPE REF TO if_ixml_ostream,
      go_renderer      TYPE REF TO if_ixml_renderer,
      go_doc           TYPE REF TO if_ixml_document,
      go_elem          TYPE REF TO if_ixml_element,
      gt_xml_table     TYPE TABLE OF xml_str,
*      gt_xml_table     TYPE TABLE OF xml_line, " ECC系统使用的是xml_line,到S4已经没有这个结构了
      gv_xml_size      TYPE i,
      gv_value         TYPE string.

DATA: gv_path      TYPE string,
      gv_fullpath  TYPE string,
      gv_extension TYPE string,
      gv_filename  TYPE string.

" 字段层级结构
TYPES: BEGIN OF ty_node,
         level TYPE i,      " 层级
         fname TYPE string, " 字段名
         ftype TYPE string, " 字段类型
         felem TYPE string, " 数据元素
         el    TYPE REF TO if_ixml_element, " 当前节点XML对象
       END OF ty_node.

SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-101.

  PARAMETERS: p_rfc  TYPE rs38l-name OBLIGATORY MATCHCODE OBJECT sfunc_modules, " 函数名
              p_item AS CHECKBOX. " 是否生成表item节点

SELECTION-SCREEN END OF BLOCK blk01.

START-OF-SELECTION.

  " 检查函数名
  SELECT SINGLE
    funcname
  FROM tfdir
  WHERE
    funcname = @p_rfc
  INTO @DATA(ls_tfdir).
  IF sy-subrc <> 0.
    MESSAGE '函数不存在' TYPE 'E'.
  ENDIF.

END-OF-SELECTION.

  PERFORM frm_create_xsd USING 'I'.
  PERFORM frm_create_xsd USING 'E'.

*&---------------------------------------------------------------------*
*& Form frm_create_xsd
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_xsd USING pv_type TYPE c.

  DATA: ls_node TYPE ty_node,
        lo_root TYPE REF TO if_ixml_element.

  " 获取函数参数 出/入参
  SELECT
    funcname,
    pposition,
    parameter, " 参数名
    paramtype, " 参数类型
    structure  " 参考的结构
  FROM fupararef
  WHERE
    funcname = @p_rfc AND
    paramtype = @pv_type
  INTO TABLE @DATA(lt_data).
  SORT lt_data BY paramtype pposition..

  " 获取函数参数 表
  SELECT
    funcname,
    pposition,
    parameter, " 参数名
    paramtype, " 参数类型
    structure  " 参考的结构
  FROM fupararef
  WHERE
    funcname = @p_rfc AND
    paramtype = 'T'
  INTO TABLE @DATA(lt_data1).
  SORT lt_data1 BY paramtype pposition..
  APPEND LINES OF lt_data1 TO lt_data.

  IF lt_data IS INITIAL.
    RETURN.
  ENDIF.

  go_ixml = cl_ixml=>create( ).
  go_doc = go_ixml->create_document( ).

  " 构建初始xsd节点schema
  go_elem = go_doc->create_simple_element( name = 'schema' parent = go_doc ).
  go_elem->set_attribute( name = 'attributeFormDefault' value = 'unqualified' ).
  go_elem->set_attribute( name = 'elementFormDefault' value = 'qualified' ).
  go_elem->set_attribute( name = 'xmlns' value = 'http://www.w3.org/2001/XMLSchema' ).
  ls_node-el = go_elem.

  " 构建根节点Request
  go_elem = go_doc->create_simple_element( name = 'element' parent = ls_node-el ).
  IF pv_type = 'I'.
    go_elem->set_attribute( name = 'name' value = 'Request' ).
  ELSE.
    go_elem->set_attribute( name = 'name' value = 'Respond' ).
  ENDIF.
  ls_node-el = go_elem.

  " 构建XML节点 complexType
  go_elem = go_doc->create_simple_element( name = 'complexType' parent = ls_node-el ).
  ls_node-el = go_elem.

  " 构建XML节点 sequence
  go_elem = go_doc->create_simple_element( name = 'sequence' parent = ls_node-el ).
  ls_node-el = go_elem.

  " 根节点
  lo_root = ls_node-el.

  " 从顶层节点向下遍历
  LOOP AT lt_data INTO DATA(ls_data).

    ls_node-level = '1'.
    ls_node-fname = ls_data-parameter.
    ls_node-felem = ls_data-structure.
    ls_node-el    = lo_root.
    IF ls_data-paramtype = 'T'.
      PERFORM frm_expand_node USING ls_node 1 'X'.
    ELSE.
      PERFORM frm_expand_node USING ls_node 1 ''.
    ENDIF.

  ENDLOOP.

  go_streamfactory = go_ixml->create_stream_factory( ).
  go_ostream = go_streamfactory->create_ostream_itable( table = gt_xml_table ).
  go_renderer = go_ixml->create_renderer( ostream  = go_ostream
                                          document = go_doc ).
  go_renderer->render( ).
  gv_xml_size = go_ostream->get_num_written_raw( ).

  " 选择文件保存路径
  IF pv_type = 'I'.
    gv_filename = p_rfc && '_Request'.
  ELSE.
    gv_filename = p_rfc && '_Respond'.
  ENDIF.
  cl_gui_frontend_services=>file_save_dialog(
    EXPORTING
      default_extension = 'XSD'
      default_file_name = gv_filename
    CHANGING
      filename          = gv_filename
      path              = gv_path
      fullpath          = gv_fullpath
    EXCEPTIONS
      OTHERS            = 1 ).

  IF sy-subrc <> 0 OR gv_fullpath IS INITIAL.
    MESSAGE '未选择文件保存路径' TYPE 'E'. " 未选择文件保存路径
    RETURN.
  ENDIF.

  cl_gui_frontend_services=>gui_download(
     EXPORTING
       bin_filesize = gv_xml_size
       filename     = gv_fullpath
       filetype     = 'BIN'
     CHANGING
       data_tab     = gt_xml_table ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_expand_node
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_NODE
*&      --> LEVEL
*&---------------------------------------------------------------------*
FORM frm_expand_node  USING ps_node  TYPE ty_node
                            pv_level TYPE i
                            pv_table TYPE c.

  DATA: ls_node  TYPE ty_node,
        ls_next  TYPE ty_node,
        lv_level TYPE i,
        lv_table TYPE c.

  ls_node  = ps_node.
  lv_level = pv_level + 1.

  IF ls_node-felem CS '-'. " 引用了结构中的元素
    ls_node-felem = 'CHAR100'.
  ENDIF.

  " 检查该节点是否为数据元素,若为数据元素则结束
  SELECT SINGLE
    rollname
  FROM dd04l
  WHERE
    rollname = @ls_node-felem
  INTO @DATA(ls_count).
  IF sy-subrc = 0.

    ls_node-ftype = 'ELEM'. " 数据元素
    go_elem = go_doc->create_simple_element( name = 'element' parent = ls_node-el ).
    go_elem->set_attribute( name = 'name' value = ls_node-fname ).
    go_elem->set_attribute( name = 'type' value = 'string' ).
    go_elem->set_attribute( name = 'minOccurs' value = '0' ).
    go_elem->set_attribute( name = 'maxOccurs' value = '1' ).

    RETURN.

  ENDIF.

  " 检查该节点是否为表类型,若为表类型则继续下钻
  SELECT SINGLE
    typename, " 表类型名称
    rowtype   " 行类型
  FROM dd40l
  WHERE
    typename = @ls_node-felem
  INTO @DATA(ls_dd40l).
  IF sy-subrc = 0.
    ls_node-ftype = 'TABL'. " 表类型
  ELSE.
    ls_node-ftype = 'STRU'. " 结构类型
  ENDIF.

  IF pv_table = 'X'.
    ls_node-ftype = 'TABL'. " 表类型
  ENDIF.

  " 构建XML节点 element
  go_elem = go_doc->create_simple_element( name = 'element' parent = ls_node-el ).
  go_elem->set_attribute( name = 'name' value = ls_node-fname ).
  IF ls_node-ftype = 'TABL' AND p_item IS INITIAL.
    go_elem->set_attribute( name = 'minOccurs' value = '0' ).
    go_elem->set_attribute( name = 'maxOccurs' value = 'unbounded' ).
  ELSE.
    go_elem->set_attribute( name = 'minOccurs' value = '0' ).
    go_elem->set_attribute( name = 'maxOccurs' value = '1' ).
  ENDIF.
  ls_node-el = go_elem.

  " 构建XML节点 complexType
  go_elem = go_doc->create_simple_element( name = 'complexType' parent = ls_node-el ).
  ls_node-el = go_elem.

  " 构建XML节点 sequence
  go_elem = go_doc->create_simple_element( name = 'sequence' parent = ls_node-el ).
  ls_node-el = go_elem.

  IF p_item = 'X' AND ls_node-ftype = 'TABL'.

    " 构建XML节点 element 【item】
    go_elem = go_doc->create_simple_element( name = 'element' parent = ls_node-el ).
    go_elem->set_attribute( name = 'name' value = 'item' ).
    go_elem->set_attribute( name = 'minOccurs' value = '0' ).
    go_elem->set_attribute( name = 'maxOccurs' value = 'unbounded' ).
    ls_node-el = go_elem.

    " 构建XML节点 complexType
    go_elem = go_doc->create_simple_element( name = 'complexType' parent = ls_node-el ).
    ls_node-el = go_elem.

    " 构建XML节点 sequence
    go_elem = go_doc->create_simple_element( name = 'sequence' parent = ls_node-el ).
    ls_node-el = go_elem.
  ENDIF.

  IF ls_node-ftype = 'TABL' AND pv_table IS INITIAL.
    " 准备下潜展开结构
    ls_node-felem = ls_dd40l-rowtype.
    ls_node-el    = go_elem.
  ENDIF.

  " 展开结构
  SELECT
    tabname,
    fieldname, " 字段名
    rollname,  " 数据元素
    position   " 顺序
  FROM dd03l
  WHERE
    depth = '00' AND " 只要当前层的
    fieldname <> '.INCLUDE' AND " 排除include
    tabname = @ls_node-felem
  INTO TABLE @DATA(lt_dd03l).
  SORT lt_dd03l BY position.

  LOOP AT lt_dd03l INTO DATA(ls_dd03l).

    ls_next-level = lv_level.
    ls_next-fname = ls_dd03l-fieldname.
    ls_next-felem = ls_dd03l-rollname.
    IF ls_next-felem IS INITIAL. " 没有引用数据元素
      ls_next-felem = 'CHAR100'.
    ENDIF.
    ls_next-el    = ls_node-el.
    PERFORM frm_expand_node USING ls_next lv_level ''.

  ENDLOOP.

ENDFORM.
印刷电路板(PCB)作为电子元件的关键支撑体,在电子设备中扮演着不可或缺的角色,其市场发展态势备受关注。QYResearch 的调研数据为我们揭示了该市场的全景:2024 年,全球印刷电路板市场规模约达 782.9 亿美元,而展望 2031 年,这一数字有望攀升至 1012.7 亿美元,在 2025 - 2031 期间,年复合增长率(CAGR)预计保持在 3.8%。然而,当前美国 2025 年关税框架的潜在变动,已然在全球市场掀起波澜,对印刷电路板市场的竞争格局、区域经济协同以及供应链体系产生着深远影响。 一、印刷电路板基础概述 印刷电路板,又被称作印制电路板或印刷线路板,常见英文缩写为 PCB(Printed circuit board)或 PWB(Printed wire board)。其内部存在金属导体,承担着连接电子元器件线路的重任。传统电路板主要运用印刷蚀刻阻剂的工艺,以此构建电路的线路与图面,这也是其名称的由来。在现代电子技术领域,PCB 通过电子印刷术制造而成,它成功搭建起电子元器件之间的电气连接桥梁,成为各类电子设备的核心组件。无论是体积小巧的智能穿戴设备,还是大型的服务器系统,只要其中配备集成电路等电子元件,PCB 必然 “参与其中”。 二、市场规模增长引擎 (一)中国主导地位凸显 中国在全球印刷电路板市场中占据着举足轻重的地位。据预测,2025 年中国市场规模有望达到 4333.21 亿元,在全球市场的占比将超过 50%。这一卓越成绩的背后,人工智能(AI)与新能源汽车产业功不可没,二者已成为驱动中国 PCB 市场增长的核心动力。以 AI 产业为例,随着 AI 技术的迅猛发展,对算力的需求呈爆发式增长,这使得 AI 服务器的市场需求大幅提升。而每台 AI 服务器中 PCB 的价值量可达 5000 元,预计到 2025 年,全球 AI 服务器相关的 PC
资源下载链接为: https://pan.quark.cn/s/637cf229ceb0 “official_web_copy_redbook” 是一个以小红书官网首页为蓝本,运用多种前端技术搭建而成的示例项目。开发者运用了 Bootstrap、jQuery、HTML5、CSS 以及 JavaScript 等一系列技术栈来完成页面制作。以下是对这些技术及其在项目中应用的详细阐述。 HTML5 作为超文本标记语言的最新版本,为网页开发带来了诸多新元素和功能,其核心目标是提升网页的可读性、可访问性与互动性。在本项目中,HTML5 承担着构建网页基本架构的重任,它通过定义头部、导航、主体、底部等不同内容区块,清晰地划分页面结构。新出现的 <nav>、<section>、<article> 等元素,赋予了页面更强的语义化特性,这不仅有利于搜索引擎进行优化处理,也为无障碍访问提供了有力支持。 CSS(层叠样式表)主要负责掌控网页的外观与布局。在该项目里,CSS 被充分运用于定制小红书首页的视觉风格,涵盖颜色搭配、字体选择、间距设置以及整体布局等多个方面。借助 CSS,开发者能够实现响应式设计,确保页面在不同设备和各种屏幕尺寸下都能呈现出良好的显示效果。而 CSS3 的出现,更是引入了动画和过渡效果,这些效果或许被用于增强用户体验,例如制作按钮悬停时的特效、页面滚动时的动画等。 Bootstrap 是一款广受欢迎的开源前端框架,它集成了预设的 CSS 样式、JavaScript 组件以及网格系统,极大地提高了网页开发的效率。在仿小红书首页项目中,Bootstrap 很可能被用来快速搭建响应式布局,简化栅格设计流程,并提供诸如模态框、下拉菜单、按钮等交互元素。其包含的 CSS 和 JavaScript 库,能够助力开发者维持设计的一致性与专业性。 jQuery 是一个轻量级的 JavaS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值