动态创建信息类型结构,动态指定查询条件,并写入
前言
有时候,我们事先并不知道where 后面要跟什么东西,只有在运行中才能确定,这就有点象其它语言中拼凑sql语句一样,abap也是支持的,用起来也很方便。详情请查看abap中动态指定查询条件,创建动态内表有以为博主写的很详细了具体请查看他的博客ABAP动态生成内表的三种方法
一、执行代码
*&---------------------------------------------------------------------*
*& Report ZTEST03
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST03.
TYPE-POOLS:ABAP.
PARAMETERS P_NAME TYPE TABNAME.
PARAMETERS P_GUID TYPE STRING DEFAULT 'GUID_P0001 IS INITIAL ' .
DATA LT_TABLE TYPE TABLE OF DFIES. "字段结构表
DATA LS_TABLE TYPE DFIES.
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 DYN_WA TYPE REF TO DATA.
DATA DYN_TABLE TYPE REF TO DATA.
DATA L_STRING TYPE STRING.
DATA:GT_PNNNN TYPE PRELP_TAB,
GS_PNNNN TYPE PRELP.
FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
<DYN_WA> TYPE ANY.
*1.获取表中的字段结构
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
TABNAME = P_NAME
TABLES
DFIES_TAB = LT_TABLE
EXCEPTIONS
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.
LOOP AT LT_TABLE INTO LS_TABLE.
CONCATENATE LS_TABLE-TABNAME '-' LS_TABLE-FIELDNAME INTO L_STRING.
LS_COMP-NAME = LS_TABLE-FIELDNAME.
*读取字段类型
CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
EXPORTING
P_NAME = L_STRING
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.
APPEND LS_COMP TO LT_COMP.
CLEAR LS_COMP.
ENDLOOP.
*根据字段目录创建动态结构类型
CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
EXPORTING
P_COMPONENTS = LT_COMP
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
*
FROM (P_NAME)
WHERE (P_GUID)
INTO TABLE @<DYN_TABLE>.
*创建pnnnn结构
DATA:LS_RETURN TYPE BAPIRETURN1.
DATA:lo_infty_line TYPE REF TO data,
lo_infty_tab TYPE REF TO data.
FIELD-SYMBOLS: <gfs_infty_tab> TYPE STANDARD TABLE, "
<gfs_infty_line> TYPE any.
IF <DYN_TABLE> IS NOT INITIAL.
DATA(LV_INFTY) = 'P' && P_NAME+2(4).
DATA:LS_KEY TYPE BAPIPAKEY.
CREATE DATA lo_infty_tab TYPE TABLE OF (lv_infty).
ASSIGN lo_infty_tab->* TO <gfs_infty_tab>.
CREATE DATA lo_infty_line LIKE LINE OF <gfs_infty_tab>.
ASSIGN lo_infty_line->* TO <gfs_infty_line>.
FREE:lo_infty_tab,lo_infty_line.
LOOP AT <DYN_TABLE> INTO <DYN_WA>.
ASSIGN COMPONENT 'PERNR' OF STRUCTURE <DYN_WA> TO FIELD-SYMBOL(<FS_PERNR>).
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
EXPORTING
NUMBER = <FS_PERNR>
IMPORTING
RETURN = LS_RETURN.
ELSE.
MESSAGE E398(00) WITH LV_INFTY && '结构读取错误'.
ENDIF.
IF LS_RETURN-TYPE = 'E'.
MESSAGE E398(00) WITH LS_RETURN-MESSAGE.
ENDIF.
MOVE-CORRESPONDING <DYN_WA> TO <gfs_infty_line>.
ASSIGN COMPONENT 'SUBTY' OF STRUCTURE <gfs_infty_line> TO FIELD-SYMBOL(<FS_SUBTY>).
ASSIGN COMPONENT 'ENDDA' OF STRUCTURE <gfs_infty_line> TO FIELD-SYMBOL(<FS_ENDDA>).
ASSIGN COMPONENT 'BEGDA' OF STRUCTURE <gfs_infty_line> TO FIELD-SYMBOL(<FS_BEGDA>).
ASSIGN COMPONENT 'SEQNR' OF STRUCTURE <gfs_infty_line> TO FIELD-SYMBOL(<FS_SEQNR>).
CALL FUNCTION 'HR_INFOTYPE_OPERATION'
EXPORTING
INFTY = P_NAME+2(4)
NUMBER = <FS_PERNR>
SUBTYPE = <FS_SUBTY>
VALIDITYEND = <FS_ENDDA>
VALIDITYBEGIN = <FS_BEGDA>
RECORD = <gfs_infty_line>
OPERATION = 'MOD'
RECORDNUMBER = <FS_SEQNR>
IMPORTING
RETURN = LS_RETURN
KEY = LS_KEY.
CALL FUNCTION 'HR_EMPLOYEE_DEQUEUE'
EXPORTING
NUMBER = <FS_PERNR>.
IF LS_RETURN-TYPE = 'E'.
MESSAGE E398(00) WITH LS_RETURN-MESSAGE.
ENDIF.
ENDLOOP.
MESSAGE S398(00) WITH '执行成功'.
ENDIF.
**显示内表中的数据
*CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
* EXPORTING
* I_STRUCTURE_NAME = P_NAME
* TABLES
* T_OUTTAB = <DYN_TABLE>
* EXCEPTIONS
* PROGRAM_ERROR = 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.