通用SQL查询RFC

ZRFC_EXTRACT_TABLE_DATA

背景:对于主数据 透明表的 联合查询  都要重新开发一个RFC

受RFC_READ_TABLE,及动态SQL的影响 

创建一个通用的用于自定义查询的RFC

案例

 

FUNCTION ZRFC_EXTRACT_TABLE_DATA.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(DELIMITER) TYPE  CHAR1 DEFAULT SPACE
*"     VALUE(FROMCLAUSE) TYPE  CHAR256 OPTIONAL
*"     VALUE(WHERECLAUSE) TYPE  CHAR2000 OPTIONAL
*"     VALUE(ISNOLEAD0) TYPE  CHAR1 DEFAULT 'X'
*"  EXPORTING
*"     VALUE(O_TYPE) TYPE  CHAR1
*"     VALUE(O_MESSAGE) TYPE  CHAR50
*"     VALUE(DBCNT) TYPE  I
*"  TABLES
*"      FIELDS STRUCTURE  ZSQL_CLAUSE_ELEMENTS OPTIONAL
*"      DATA STRUCTURE  ZTABLEROWS OPTIONAL
*"----------------------------------------------------------------------
  TYPE-POOLS: ABAP.
  DATA p_name TYPE tabname.
  DATA p_fldnm TYPE tabname.
  DATA ls_table TYPE ZSQL_CLAUSE_ELEMENTS.
  DATA lr_struc TYPE REF TO cl_abap_structdescr.
  DATA lr_table TYPE REF TO cl_abap_tabledescr.
  DATA lr_type TYPE REF TO cl_abap_typedescr.
  DATA lr_data TYPE REF TO cl_abap_datadescr.
  DATA lt_comp TYPE abap_component_tab.
  DATA ls_comp LIKE LINE OF lt_comp.
  DATA:returnRowString TYPE string,
        dataFieldString TYPE string,
  dataline LIKE DATA.
  DATA dyn_wa TYPE REF TO DATA.
  DATA dyn_table TYPE REF TO DATA.
  DATA l_string TYPE string.
  data numberFields TYPE i.
  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE ,
  <dyn_wa> TYPE ANY,<datafield> TYPE ANY.

  DESCRIBE TABLE FIELDS LINES numberFields.

  LOOP AT FIELDS INTO ls_table.
    REPLACE FIRST OCCURRENCE OF SUBSTRING '~' IN ls_table WITH '-' RESPECTING CASE.
    ls_comp-name = ls_table.
     p_fldnm = ls_table.
*读取字段类型
    CALL METHOD cl_abap_datadescr=>describe_by_name
      EXPORTING
        p_name         = p_fldnm
      RECEIVING
        p_descr_ref    = lr_type
      EXCEPTIONS
        type_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    ls_comp-TYPE ?= lr_type.
    ls_comp-SUFFIX = ''.
    APPEND ls_comp TO lt_comp.
    CLEAR ls_comp.
  ENDLOOP.

  CALL METHOD cl_abap_structdescr=>create
    EXPORTING
      p_components = lt_comp
      p_strict     = abap_false
    RECEIVING
      p_result     = lr_struc.
*根据动态结构创建动态内表类型
  CALL METHOD cl_abap_tabledescr=>create
    EXPORTING
      p_line_type = lr_struc
    RECEIVING
      p_result    = lr_table.
*参照动态结构类型和动态内表类型创建内表与工作区
  CREATE DATA dyn_wa TYPE HANDLE lr_struc.
  CREATE DATA dyn_table TYPE HANDLE lr_table.
*指定内表与工作区到字段符号
  ASSIGN dyn_wa->* TO <dyn_wa>.
  ASSIGN dyn_table->* TO <dyn_table>.

  SELECT (FIELDS) INTO <dyn_wa>
    from (FROMCLAUSE)
    WHERE (WHERECLAUSE).
    append <dyn_wa> to <dyn_table>.
  ENDSELECT.

  LOOP AT <DYN_TABLE> ASSIGNING  <DYN_WA>.
    CLEAR RETURNROWSTRING.
    DO NUMBERFIELDS TIMES.
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE <DYN_WA> TO <DATAFIELD>.
      DATAFIELDSTRING = <DATAFIELD>.
      IF ISNOLEAD0  = 'X'.
        SHIFT  DATAFIELDSTRING LEFT DELETING LEADING '0'."前导0 去掉
      ENDIF.
      IF SY-INDEX = 1.
        RETURNROWSTRING =  DATAFIELDSTRING.
      ELSE.
        CONCATENATE RETURNROWSTRING DELIMITER DATAFIELDSTRING INTO RETURNROWSTRING.
      ENDIF.
    ENDDO.
    DATALINE = RETURNROWSTRING.
    INSERT DATALINE INTO TABLE DATA.
  ENDLOOP.

  DESCRIBE TABLE DATA LINES DBCNT.

  O_TYPE = 'S'.

ENDFUNCTION.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值