动态创建信息类型结构,动态指定查询条件,并写入

动态创建信息类型结构,动态指定查询条件,并写入



前言

有时候,我们事先并不知道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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值