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.