SAP ABAP 关于BAPI的扩展字段EXTENSIONIN处理

194 篇文章 115 订阅

1.找到对应的结构

2.查看SAP内部解释说明

 

 3. 找到结构

 4. 下面拿采购申请创建为例

DATA: ls_req_item TYPE BAPI_TE_MEREQITEM,

ls_req_itemx TYPE BAPI_TE_MEREQITEMX,

ls_extensionin TYPE bapiparex,

lt_extensionin TYPE STANDARD TABLE OF bapiparex.

clear ls_extensionin.

clear ls_req_item.

ls_req_item-preq_item = wa_gt_data-posic.

ls_req_item-ZZKOSTL = wa_praccount-costcenter.

ls_extensionin-structure = 'BAPI_TE_MEREQITEM'.

PERFORM transfer_to_extensionin USING ls_req_item CHANGING ls_extensionin.

APPEND ls_extensionin to lt_extensionin.

clear ls_extensionin.

clear ls_req_itemx.

ls_req_itemx-preq_item = wa_gt_data-posic.

ls_req_itemx-ZZKOSTL = 'X'.

ls_extensionin-structure = 'BAPI_TE_MEREQITEMX'.

PERFORM transfer_to_extensionin USING ls_req_itemx CHANGING ls_extensionin.

APPEND ls_extensionin to lt_extensionin.

FORM transfer_to_extensionin

USING

is_bapi_extensionin TYPE any

CHANGING

cs_bapiparex TYPE bapiparex.

DATA l_distance_characters TYPE I.

FIELD-SYMBOLS <any> TYPE any.

DESCRIBE DISTANCE BETWEEN cs_bapiparex-structure

AND cs_bapiparex-valuepart1

INTO l_distance_characters

IN CHARACTER MODE.

ASSIGN cs_bapiparex+l_distance_characters(*) TO <any>

CASTING LIKE is_bapi_extensionin.

<any> = is_bapi_extensionin.

ENDFORM.

* Create the PR with the above data's.

CALL FUNCTION 'BAPI_PR_CREATE'

EXPORTING

prheader = wa_header

prheaderx = wa_headerx

TABLES

return = t_return

pritem = t_item

pritemx = t_itemx

praccount = t_praccount

praccountx = t_praccountx

"pritemsource = t_itemsource

"pritemtext = t_itext

EXTENSIONIN = lt_extensionin

EXCEPTIONS

OTHERS = 1.

5. 说说重点

系统BAPI允许的最大extension长度为960(=240*4)。所以,如果超过这个长度就会有问题,或者DUMP,或者值不更新。

 将结构里增强字段总长度降低至960以下,就可以解决任何问题。

跟matinal学知识,提一个小知识点:
各种BAPI的扩张结构字段中,最好不要包含金额类型字段(CURR),改为CHAR类型。如果必须是金额类型的字段,我们可以用 CL_ABAP_CONTAINER_UTILITIES=>FILL_CONTAINER_C来转换为字符串,再截取,塞入到extension的多个字段传输。(matinal告诉你,这个是很多人不知道的知识点)

6. 再举个栗子

  DATA:ls_prheader    TYPE bapimereqheader,
       ls_prheaderx   TYPE bapimereqheaderx,
       lv_number      TYPE bapimereqheader-preq_no,
       l_comp         TYPE TABLE OF bapimereqcomponent WITH HEADER LINE,
       l_compx        TYPE TABLE OF bapimereqcomponentx WITH HEADER LINE,
       l_pritem       TYPE TABLE OF bapimereqitemimp  WITH HEADER LINE,
       l_pritemx      TYPE TABLE OF bapimereqitemx    WITH HEADER LINE,
       l_pritemtext   TYPE TABLE OF bapimereqitemtext WITH HEADER LINE,
       l_praccount    TYPE TABLE OF bapimereqaccount WITH HEADER LINE,
       l_praccountx   TYPE TABLE OF bapimereqaccountx WITH HEADER LINE,
*       ls_req_item    TYPE bapi_te_mereqitem,
       ls_req_item    TYPE bapi_te_requisition_item,
       ls_req_itemx   TYPE bapi_te_mereqitemx,
       ls_extensionin TYPE bapiparex,
       lt_extensionin TYPE STANDARD TABLE OF bapiparex,
       l_return       TYPE TABLE OF bapiret2 WITH HEADER LINE.

	  IF <l_data>-zrwl IS NOT INITIAL.
        ls_req_item-zrwl    = <l_data>-zrwl.
        ls_req_itemx-zrwl    = 'X'.
      ENDIF.

      CLEAR ls_extensionin.
      ls_extensionin-STRUCTURE = 'BAPI_TE_MEREQITEM'.
      PERFORM transfer_to_extensionin USING ls_req_item CHANGING ls_extensionin.
      APPEND ls_extensionin TO lt_extensionin.

      CLEAR ls_extensionin.
      ls_extensionin-STRUCTURE = 'BAPI_TE_MEREQITEMX'.
      PERFORM transfer_to_extensionin USING ls_req_itemx CHANGING ls_extensionin.
      APPEND ls_extensionin TO lt_extensionin.

7. 完整的例子

REPORT  ZMM_PR_BATCH_INPUT .


TYPES:BEGIN OF TY_ITAB,
      WBS_ELEMENT(24),
      MATERIAL(18),
      QUANTITY(13),
      UNIT(3),
      DELIV_DATE(8),
      PURCH_ORG(4),
*      KNTTP TYPE EBAN-KNTTP,
      END OF TY_ITAB.
DATA:ITAB TYPE TABLE OF TY_ITAB WITH HEADER LINE.
DATA:WA TYPE TY_ITAB.


TYPES:BEGIN OF TY_RESULT,
      WBS_ELEMENT(24),
      MATERIAL(18),
      QUANTITY(13),
      UNIT(3),
      DELIV_DATE(8),
      PURCH_ORG(4),
*      KNTTP TYPE EBAN-KNTTP,
      FLAG(1),
      NUMBER TYPE BAPIMEREQHEADER-PREQ_NO,
      MESSAGE(1200),
      END OF TY_RESULT.
DATA:IT_RESULT TYPE TABLE OF TY_RESULT with header line.
data: g_info type string.


DATA:PRHEADER TYPE BAPIMEREQHEADER,
     PRHEADERX TYPE BAPIMEREQHEADERX,
     NUMBER TYPE BAPIMEREQHEADER-PREQ_NO,
     PRITEM TYPE TABLE OF BAPIMEREQITEMIMP WITH HEADER LINE,
     PRITEMX TYPE TABLE OF BAPIMEREQITEMX WITH HEADER LINE,
     PRITEMTEXT TYPE TABLE OF BAPIMEREQITEMTEXT WITH HEADER LINE,
     PRACCOUNT TYPE TABLE OF BAPIMEREQACCOUNT WITH HEADER LINE,
     PRACCOUNTX TYPE TABLE OF BAPIMEREQACCOUNTX WITH HEADER LINE,
     RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA:FLAG(1).


selection-screen begin of block shi with frame title text-001.
parameters:p_file like rlgrap-filename memory id zy1 obligatory.
PARAMETERS:P_WERKS LIKE MARC-WERKS OBLIGATORY.
parameters:P_CHECK  RADIOBUTTON GROUP SHI,
           P_CHECK1  RADIOBUTTON GROUP SHI.
selection-screen end of block shi.


at selection-screen on value-request for p_file.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  = syst-cprog
      dynpro_number = syst-dynnr
    IMPORTING
      file_name     = p_file.


*at selection-screen.
*****加权限对象-----
*  IF P_WERKS IS NOT INITIAL.
*    AUTHORITY-CHECK OBJECT 'M_BANF_WRK'
*                        ID 'ACTVT' FIELD '01'
*                        ID 'WERKS' FIELD P_WERKS.
*    IF SY-SUBRC <> 0.
*      MESSAGE E019(ZMM001) WITH P_WERKS.
*    ENDIF.
*  ENDIF.


START-OF-SELECTION.
  PERFORM FRM_GETDATA.
  PERFORM FRM_MVT_BAPI.
  PERFORM FRM_DOWNLOAD.
*&---------------------------------------------------------------------*
*&      Form  FRM_GETDATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GETDATA .
  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
*   CODEPAGE                      = ' '
      FILENAME                      = P_FILE
      FILETYPE                      = 'DAT'
*   HEADLEN                       = ' '
*   LINE_EXIT                     = ' '
*   TRUNCLEN                      = ' '
*   USER_FORM                     = ' '
*   USER_PROG                     = ' '
*   DAT_D_FORMAT                  = ' '
* IMPORTING
*   FILELENGTH                    =
     TABLES
       DATA_TAB                      = ITAB
* EXCEPTIONS
*   CONVERSION_ERROR              = 1
*   FILE_OPEN_ERROR               = 2
*   FILE_READ_ERROR               = 3
*   INVALID_TYPE                  = 4
*   NO_BATCH                      = 5
*   UNKNOWN_ERROR                 = 6
*   INVALID_TABLE_WIDTH           = 7
*   GUI_REFUSE_FILETRANSFER       = 8
*   CUSTOMER_ERROR                = 9
*   OTHERS                        = 10
             .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.




ENDFORM.                    " FRM_GETDATA
*&---------------------------------------------------------------------*
*&      Form  FRM_MVT_BAPI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_MVT_BAPI .
  DATA:m_SBDKZ TYPE MARC-SBDKZ.


  LOOP AT ITAB.
    MOVE-CORRESPONDING ITAB TO IT_RESULT.


    CLEAR m_SBDKZ.
    SELECT SINGLE
           SBDKZ
           INTO m_SBDKZ
           FROM
           MARC
           WHERE MATNR = ITAB-MATERIAL AND WERKS = P_WERKS.


*    IF ITAB-KNTTP = ''.
*        IT_RESULT-FLAG = 'E'.
*        IT_RESULT-MESSAGE = '科目分配为空'.
*        APPEND IT_RESULT.
*        CLEAR IT_RESULT.
*    ELSEIF ITAB-KNTTP = '1' AND m_SBDKZ = '2'.
*        IT_RESULT-FLAG = 'E'.
*        IT_RESULT-MESSAGE = '系统库存按非项目管理'.
*        APPEND IT_RESULT.
*        CLEAR IT_RESULT.
*    ELSEIF ITAB-KNTTP = '2' AND m_SBDKZ = '1'.
*        IT_RESULT-FLAG = 'E'.
*        IT_RESULT-MESSAGE = '系统库存按项目管理'.
*        APPEND IT_RESULT.
*        CLEAR IT_RESULT.
*    ELSE.
        IF P_CHECK = 'X'.
          PRHEADER-PR_TYPE = 'NB'.
        ELSE.
          PRHEADER-PR_TYPE = 'ZNB'.
        ENDIF.
        PRHEADERX-PR_TYPE = 'X'.


        PRITEM-PREQ_ITEM = '00010'.
        PRITEM-MATERIAL = ITAB-MATERIAL.
        PRITEM-PLANT = P_WERKS.
        PRITEM-QUANTITY = ITAB-QUANTITY.
        PRITEM-UNIT = ITAB-UNIT.
        PRITEM-DELIV_DATE = ITAB-DELIV_DATE.


*       Modified by liuxy2010-01-25
        IF m_SBDKZ = '1'.
           PRITEM-ACCTASSCAT = 'Q'.
        ELSE.
           PRITEM-ACCTASSCAT = ''.
        ENDIF.


        PRITEM-PURCH_ORG = ITAB-PURCH_ORG.
        APPEND PRITEM.
        CLEAR PRITEM.


        PRITEMX-PREQ_ITEM = '00010'.
        PRITEMX-MATERIAL = 'X'.
        PRITEMX-PLANT = 'X'.
        PRITEMX-QUANTITY = 'X'.
        PRITEMX-UNIT = 'X'.
        PRITEMX-DELIV_DATE = 'X'.
        PRITEMX-ACCTASSCAT = 'X'.
        PRITEMX-PURCH_ORG = 'X'.
        APPEND PRITEMX.
        CLEAR PRITEMX.


        PRITEMTEXT-PREQ_ITEM = '00010'.
        PRITEMTEXT-TEXT_ID = 'B01'.
        PRITEMTEXT-TEXT_LINE = ITAB-WBS_ELEMENT.
        APPEND PRITEMTEXT.
        CLEAR PRITEMTEXT.


        PRACCOUNT-PREQ_ITEM = '00010'.
        PRACCOUNT-SERIAL_NO = '01'.
        PRACCOUNT-WBS_ELEMENT = ITAB-WBS_ELEMENT.
        APPEND PRACCOUNT.
        CLEAR PRACCOUNT.


        PRACCOUNTX-PREQ_ITEM = '00010'.
        PRACCOUNTX-SERIAL_NO = '01'.
        PRACCOUNTX-WBS_ELEMENT = 'X'.
        PRACCOUNTX-PREQ_ITEMX = 'X'.
        APPEND PRACCOUNTX.
        CLEAR PRACCOUNTX.


        CALL FUNCTION 'BAPI_PR_CREATE'
         EXPORTING
           PRHEADER                    = PRHEADER
           PRHEADERX                   = PRHEADERX
*       TESTRUN                     =
         IMPORTING
           NUMBER                      = NUMBER
*       PRHEADEREXP                 =
          TABLES
            RETURN                      = RETURN
            PRITEM                      = PRITEM
            PRITEMX                     = PRITEMX
            PRITEMTEXT                  = PRITEMTEXT
*       PRITEMEXP                   =
*       PRITEMSOURCE                =
            PRACCOUNT                   = PRACCOUNT
*       PRACCOUNTPROITSEGMENT       =
            PRACCOUNTX                  = PRACCOUNTX
*       PRADDRDELIVERY              =
*       PRITEMTEXT                  =
*       PRHEADERTEXT                =
*       EXTENSIONIN                 =
*       EXTENSIONOUT                =
*       PRVERSION                   =
*       PRVERSIONX                  =
*       ALLVERSIONS                 =
                  .


        CLEAR RETURN.
        LOOP AT RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
          FLAG = 'X'.
          IT_RESULT-FLAG = 'E'.
          CONCATENATE IT_RESULT-MESSAGE '&' RETURN-MESSAGE INTO IT_RESULT-MESSAGE.
        ENDLOOP.
        IF FLAG = 'X'.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
          wait up to 1 seconds.
          IT_RESULT-FLAG = 'S'.
          IT_RESULT-MESSAGE = '成功创建!'.
          IT_RESULT-NUMBER = NUMBER.
        ENDIF.
        APPEND IT_RESULT.
        CLEAR IT_RESULT.
        CLEAR PRHEADER.
        CLEAR PRHEADERX.
        CLEAR NUMBER.
        REFRESH PRITEM.
        CLEAR PRITEM.
        REFRESH PRITEMX.
        CLEAR PRITEMX.
        REFRESH PRITEMTEXT.
        CLEAR PRITEMTEXT.
        REFRESH PRACCOUNT.
        CLEAR PRACCOUNT.
        REFRESH PRACCOUNTX.
        CLEAR PRACCOUNTX.
        CLEAR FLAG.
        REFRESH RETURN.
        CLEAR RETURN.
*    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_MVT_BAPI
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD .
  CALL FUNCTION 'GUI_DOWNLOAD'
     EXPORTING
*    BIN_FILESIZE                    =
       FILENAME                        = 'C:/PR批导结果表.TXT'
       FILETYPE                        = 'ASC'
       APPEND                          = ' '
*    WRITE_FIELD_SEPARATOR           = ' '
*    HEADER                          = '00'
*    TRUNC_TRAILING_BLANKS           = ' '
*    WRITE_LF                        = 'X'
*    COL_SELECT                      = ' '
*    COL_SELECT_MASK                 = ' '
*    DAT_MODE                        = ' '
*    CONFIRM_OVERWRITE               = ' '
*    NO_AUTH_CHECK                   = ' '
*    CODEPAGE                        = ' '
*    IGNORE_CERR                     = ABAP_TRUE
*    REPLACEMENT                     = '#'
*    WRITE_BOM                       = ' '
*    TRUNC_TRAILING_BLANKS_EOL       = 'X'
*    WK1_N_FORMAT                    = ' '
*    WK1_N_SIZE                      = ' '
*    WK1_T_FORMAT                    = ' '
*    WK1_T_SIZE                      = ' '
*  IMPORTING
*    FILELENGTH                      =
     TABLES
       DATA_TAB                        = IT_RESULT
*    FIELDNAMES                      =
*  EXCEPTIONS
*    FILE_WRITE_ERROR                = 1
*    NO_BATCH                        = 2
*    GUI_REFUSE_FILETRANSFER         = 3
*    INVALID_TYPE                    = 4
*    NO_AUTHORITY                    = 5
*    UNKNOWN_ERROR                   = 6
*    HEADER_NOT_ALLOWED              = 7
*    SEPARATOR_NOT_ALLOWED           = 8
*    FILESIZE_NOT_ALLOWED            = 9
*    HEADER_TOO_LONG                 = 10
*    DP_ERROR_CREATE                 = 11
*    DP_ERROR_SEND                   = 12
*    DP_ERROR_WRITE                  = 13
*    UNKNOWN_DP_ERROR                = 14
*    ACCESS_DENIED                   = 15
*    DP_OUT_OF_MEMORY                = 16
*    DISK_FULL                       = 17
*    DP_TIMEOUT                      = 18
*    FILE_NOT_FOUND                  = 19
*    DATAPROVIDER_EXCEPTION          = 20
*    CONTROL_FLUSH_ERROR             = 21
*    OTHERS                          = 22
             .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  WRITE:'数据成功保存到C盘根目录下,请查看!'.

ENDFORM.                    " FRM_DOWNLOAD

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP HANA中的MSEG扩展字段是指在MSEG表中自定义添加的字段。MSEG表是SAP系统中的一个重要表格,用于存储物料凭证的行项目数据。在某些特定情况下,我们可能需要向MSEG表中添加一些额外的信息字段,以满足特定的业务需求。 在ABAP HANA中,扩展字段的添加通常涉及以下步骤: 1. 在数据字典(SE11)中创建一个结构(Z结构),用于定义扩展字段的数据类型和长度。 2. 使用数据元素创建一个域(Z域),用于将结构字段与数据元素关联起来。 3. 在MSEG表的扩展索引中创建一个新的索引,包含结构中定义的字段。 4. 使用ABAP开发工具(SE80)创建一个新的Includes(Z Include),用于定义扩展字段和相关的数据逻辑。 5. 在MSEG表的相关ABAP程序中,在适当的位置引用新创建的Z Include,并根据需要进行相关的UBM逻辑(Update, Database Modifications)。 通过执行上述步骤,我们可以成功扩展MSEG表,添加额外的自定义字段。这些扩展字段将与其他标准字段一起存储在MSEG表中,并可以在相关的ABAP程序中使用处理。这为我们提供了更灵活的数据管理和处理方式,以满足不同业务需求。 总之,ABAP HANA中的MSEG扩展字段添加可以通过定义自定义结构和域,并在相关ABAP程序中进行引用和修改来实现。这帮助我们根据具体需求灵活地定义和操作MSEG表中的额外字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值