前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP初体验十一之再看BDC批导

ABAP初体验十一之再看BDC批导

作者头像
齐天大圣
发布2022-03-11 11:27:50
7380
发布2022-03-11 11:27:50
举报
文章被收录于专栏:用户8186044的专栏

声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。

01

目录

11 批导

11.1 简单批导SHDB

11.1.1 录屏

11.1.2 保存生成源代码

11.1.3 根据事物记录器写代码

11.2 简单批导SHDB,MMPV专题

11.2.1 录屏MMPV

11.2.2 根据事物记录器写代码

02

正文

11 批导

11.1 简单批导SHDB

目的要修改以下4列

11.1.1 录屏

维护物料描述、物料组

MS登记编号

保存生成操作记录,共4部分

11.1.2 保存生成源代码

源代码一共分2个部分

结构定义部分

循环调用部分

11.1.3 根据事物记录器写代码

第一行记录事务代码的行可以省略 BDC_SUBSCR 的行可以省略不填 未修改的值(MARA-MEINS = PC MARA-GEWEI = KG)也可省略不填,就奔着要修改的4列去

代码语言:javascript
复制
report ZLGZTEST08_BDC
       no standard page heading line-size 255.

*1 第一步,定义对象

TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
         MATNR TYPE CHAR50,  "料号
         MAKTX TYPE CHAR50,  "物料描述
         MATKL TYPE CHAR50,  "物料组
         MSBOOKPARTNO TYPE CHAR50,  "MS登记号
       END OF TY_DATAS.

"定义EXCEL的数据存储对象
DATA: GT_DATA TYPE TABLE OF TY_DATAS,
      WA_DATA TYPE TY_DATAS.

"BDC的数据对象
DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.


*2 第二步,定义文件选择参数,并选择文件
PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM FRM_GET_FILENAME.

*3 第三步,获取文件数据
START-OF-SELECTION.
  PERFORM FRM_GET_DATA.

END-OF-SELECTION.

*4 第四步,调用BDC录入数据
*  "   调用方法一 By Transaction
  PERFORM FRM_EXEC_TRANSACTION.
  "   调用方法二  By Session(把多个Transaction放到一个Session一起执行)
  "PERFORM FRM_EXEC_SESSION.

**------------------------------------------FROM------------------------------------------**
"第二步中,调用文件的标准程序

FORM FRM_GET_FILENAME .

"调用文件的标准程序
  DATA: LV_RC TYPE I.
  DATA: LT_FILE_TABLE TYPE FILETABLE.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE = '打开文件'
    CHANGING
      FILE_TABLE   = LT_FILE_TABLE
      RC           = LV_RC.
  IF SY-SUBRC = 0.
    READ TABLE LT_FILE_TABLE INTO DATA(WA_FILE_TABLE) INDEX 1.
    P_FILE = WA_FILE_TABLE-FILENAME.
  ENDIF.

ENDFORM.

"第三步中,获取文件数据的标准程序
FORM FRM_GET_DATA .
  DATA: LT_RAW TYPE TRUXS_T_TEXT_DATA.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_RAW
      I_FILENAME           = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA = GT_DATA
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

FORM FRM_CONVERT_DATA USING P_WA_DATA.
* BDC_SUBSCR的项没有意义,可不填
  CLEAR: GT_BDCDATA,GT_BDCDATA[].

  PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '0060'.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'RMMG1-MATNR'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ENTR'.
  PERFORM FRM_FIELD_LINE USING 'RMMG1-MATNR' WA_DATA-MATNR.

  PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '0070'.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ENTR'.
  PERFORM FRM_FIELD_LINE USING 'MSICHTAUSW-KZSEL(01)' 'X'.
  PERFORM FRM_FIELD_LINE USING 'MSICHTAUSW-KZSEL(02)' 'X'.

  PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '4004'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' 'SP02'.
  PERFORM FRM_FIELD_LINE USING 'MAKT-MAKTX' WA_DATA-MAKTX.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MARA-MATKL'.
  PERFORM FRM_FIELD_LINE USING 'MARA-MATKL' WA_DATA-MATKL.

  PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '4004'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=BU'.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MARA-MSBOOKPARTNO'.
  PERFORM FRM_FIELD_LINE USING 'MARA-MSBOOKPARTNO' WA_DATA-MSBOOKPARTNO.

ENDFORM.

FORM FRM_SCREEN_LINE  USING    VALUE(P_VALUE1)
                               VALUE(P_VALUE2).
  CLEAR: GT_BDCDATA.
  GT_BDCDATA-PROGRAM = P_VALUE1.
  GT_BDCDATA-DYNPRO = P_VALUE2.
  GT_BDCDATA-DYNBEGIN = 'X'.
  APPEND GT_BDCDATA.

ENDFORM.

FORM FRM_FIELD_LINE  USING    VALUE(P_VALUE11)
                              VALUE(P_VALUE12).
  CLEAR: GT_BDCDATA.
  GT_BDCDATA-FNAM = P_VALUE11.
  GT_BDCDATA-FVAL = P_VALUE12.
  APPEND GT_BDCDATA.

ENDFORM.

"4 第四步,调用的FORM每读入一行,就执行一次
FORM FRM_EXEC_TRANSACTION.

"定义消息的展示方式
  DATA: LT_MESSAGE TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE.
  DATA: LV_MESSAGE TYPE STRING.


"循环文件内表
  LOOP AT GT_DATA INTO WA_DATA.


    PERFORM FRM_CONVERT_DATA USING WA_DATA.

    CALL TRANSACTION 'MM02' USING GT_BDCDATA[]
*                            OPTIONS FROM GS_OPTIONS     "结构传参,参照结构:CTU_PARAMS
                            MESSAGES INTO LT_MESSAGE    "返回消息,参照结构:BDCMSGCOLL
                            UPDATE 'S'                  "更新模式:S 同步 A 异步
                            MODE 'E'.                   "显示模式:A 前台 N 后台 E 仅显示错误
    IF SY-SUBRC = 0.
      READ TABLE LT_MESSAGE WITH KEY MSGID = 'M3'
                                     MSGNR = '801'.
      IF SY-SUBRC = 0.
        WRITE:/ '物料:',WA_DATA-MATNR,'物料修改成功'.
      ELSE.
        LOOP AT LT_MESSAGE WHERE MSGTYP = 'E'.
          WRITE:/ '物料:',WA_DATA-MATNR,'物料修改失败'.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = LT_MESSAGE-MSGID
              MSGNR               = LT_MESSAGE-MSGNR
              MSGV1               = LT_MESSAGE-MSGV1
              MSGV2               = LT_MESSAGE-MSGV2
              MSGV3               = LT_MESSAGE-MSGV3
              MSGV4               = LT_MESSAGE-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MESSAGE.

          WRITE:/ LV_MESSAGE.
        ENDLOOP.
      ENDIF.
    ELSE.
      WRITE:/ 'BDC执行错误'.
    ENDIF.
  ENDLOOP.

ENDFORM.

FORM FRM_EXEC_SESSION.
  " Open Session
  DATA: LS_GROUPNAME TYPE APQI-GROUPID VALUE 'ZMM02_01'.
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      CLIENT              = SY-MANDT
      GROUP               = LS_GROUPNAME
      KEEP                = 'X'
      USER                = SY-UNAME
    EXCEPTIONS
      CLIENT_INVALID      = 1
      DESTINATION_INVALID = 2
      GROUP_INVALID       = 3
      GROUP_IS_LOCKED     = 4
      HOLDDATE_INVALID    = 5
      INTERNAL_ERROR      = 6
      QUEUE_ERROR         = 7
      RUNNING             = 8
      SYSTEM_LOCK_ERROR   = 9
      USER_INVALID        = 10
      OTHERS              = 11.

  LOOP AT GT_DATA INTO WA_DATA.
    PERFORM FRM_CONVERT_DATA USING WA_DATA.

    " Insert Session
    CALL FUNCTION 'BDC_INSERT'
      EXPORTING
        TCODE            = 'MM02'
      TABLES
        DYNPROTAB        = GT_BDCDATA[]
      EXCEPTIONS
        INTERNAL_ERROR   = 1
        NOT_OPEN         = 2
        QUEUE_ERROR      = 3
        TCODE_INVALID    = 4
        PRINTING_INVALID = 5
        POSTING_INVALID  = 6
        OTHERS           = 7.

  ENDLOOP.

  " Close Session
  CALL FUNCTION 'BDC_CLOSE_GROUP'
    EXCEPTIONS
      NOT_OPEN    = 1
      QUEUE_ERROR = 2
      OTHERS      = 3.
  IF sy-subrc = 0.
    WRITE:/ 'Session创建成功,请到SM35执行'.
  ENDIF.
ENDFORM.

关键代码解析:

第一步:结构定义

第二步和第三步:读取excel读到TY_DATAS中

第四步:循环调用并输出消息

第四步详解:参考事物记录器进行模拟

4.1 关于0060屏幕

4.2 关于0070屏幕,物料选择视图时,选择了2个视图,所以有两次X

4.3 关于4004屏幕,去掉SUBSCR判断的,如果MEINS和MTPOS_MARA字段不需要也不用填充

4.4 关于4004屏幕,去掉SUBSCR判断的,有些光标聚焦点不是对应的要修改字段,也无所谓

11.2 简单批导SHDB,MMPV专题

11.2.1 录屏MMPV

把公司代码,或者修改时间,点击处理都是有效的。

保存事物记录器,同时复制一遍,再导入发现也是有效的

11.2.2 根据事物记录器写代码

需要注意,如果遇到回车执行按钮后,不要结束,ls_CTU_PARAMS-RACOMMIT这个选项很关键,必须选择为X data ls_CTU_PARAMS type CTU_PARAMS. ls_CTU_PARAMS-UPDMODE = ‘L’. "更新模式:S 同步 A 异步 ls_CTU_PARAMS-DISMODE = ‘N’. "显示模式:A 前台 N 后台 E 仅显示错误 ls_CTU_PARAMS-RACOMMIT = ‘X’. "COMMIT WORK语句是否结束批处理的选项,值:“”可终止 “X”不可终止。

代码语言:javascript
复制
CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
                         OPTIONS FROM ls_CTU_PARAMS
                         MESSAGES INTO LT_MESSAGE.
代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& Report  ZLGZBDC_MMPV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZLGZBDC_MMPV  no standard page heading line-size 255.

*1 第一步,定义对象

TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
         I_VBUKR TYPE CHAR50,  "公司代码
         I_LFGJA TYPE CHAR50,  "年
         I_LFMON TYPE CHAR50,  "月份
       END OF TY_DATAS.

"定义EXCEL的数据存储对象
DATA: GT_DATA TYPE TABLE OF TY_DATAS,
      WA_DATA TYPE TY_DATAS.

"BDC的数据对象
DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.


*2 第二步,定义文件选择参数,并选择文件
PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM FRM_GET_FILENAME.

*3 第三步,获取文件数据
START-OF-SELECTION.
  PERFORM FRM_GET_DATA.

END-OF-SELECTION.

*4 第四步,调用BDC录入数据
*  "   调用方法一 By Transaction
  PERFORM FRM_EXEC_TRANSACTION.
  "   调用方法二  By Session(把多个Transaction放到一个Session一起执行)
  "PERFORM FRM_EXEC_SESSION.

**------------------------------------------FROM------------------------------------------**
"第二步中,调用文件的标准程序

FORM FRM_GET_FILENAME .

"调用文件的标准程序
  DATA: LV_RC TYPE I.
  DATA: LT_FILE_TABLE TYPE FILETABLE.
  DATA: WA_FILE_TABLE LIKE LINE OF LT_FILE_TABLE.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE = '打开文件'
    CHANGING
      FILE_TABLE   = LT_FILE_TABLE
      RC           = LV_RC.
  IF SY-SUBRC = 0.
    READ TABLE LT_FILE_TABLE INTO WA_FILE_TABLE INDEX 1.
    P_FILE = WA_FILE_TABLE-FILENAME.
  ENDIF.

ENDFORM.

"第三步中,获取文件数据的标准程序
FORM FRM_GET_DATA .
  DATA: LT_RAW TYPE TRUXS_T_TEXT_DATA.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_RAW
      I_FILENAME           = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA = GT_DATA
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

FORM FRM_CONVERT_DATA USING P_WA_DATA.
* BDC_SUBSCR的项没有意义,可不填
  CLEAR: GT_BDCDATA,GT_BDCDATA[].

  PERFORM FRM_SCREEN_LINE USING 'RMMMPERI' '1000'.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'I_LFGJA'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ONLI'.
  PERFORM FRM_FIELD_LINE USING 'I_VBUKR' WA_DATA-I_VBUKR.
  PERFORM FRM_FIELD_LINE USING 'I_LFMON' WA_DATA-I_LFMON.
  PERFORM FRM_FIELD_LINE USING 'I_LFGJA' WA_DATA-I_LFGJA.

  PERFORM FRM_SCREEN_LINE USING 'SAPMSSY0' '0120'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=&F03'.

  PERFORM FRM_SCREEN_LINE USING 'RMMMPERI' '1000'.
  PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '/EE'.
  PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'I_VBUKR'.

ENDFORM.

FORM FRM_SCREEN_LINE  USING    VALUE(P_VALUE1)
                               VALUE(P_VALUE2).
  CLEAR: GT_BDCDATA.
  GT_BDCDATA-PROGRAM = P_VALUE1.
  GT_BDCDATA-DYNPRO = P_VALUE2.
  GT_BDCDATA-DYNBEGIN = 'X'.
  APPEND GT_BDCDATA.

ENDFORM.

FORM FRM_FIELD_LINE  USING    VALUE(P_VALUE11)
                              VALUE(P_VALUE12).
  CLEAR: GT_BDCDATA.
  GT_BDCDATA-FNAM = P_VALUE11.
  GT_BDCDATA-FVAL = P_VALUE12.
  APPEND GT_BDCDATA.

ENDFORM.

"4 第四步,调用的FORM每读入一行,就执行一次
FORM FRM_EXEC_TRANSACTION.

"定义消息的展示方式
  DATA: LT_MESSAGE TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE.
  DATA: LV_MESSAGE TYPE STRING.


"循环文件内表
  LOOP AT GT_DATA INTO WA_DATA.


    PERFORM FRM_CONVERT_DATA USING WA_DATA.
    data ls_CTU_PARAMS type CTU_PARAMS.
    ls_CTU_PARAMS-UPDMODE = 'L'. "更新模式:S 同步 A 异步
    ls_CTU_PARAMS-DISMODE = 'N'. "显示模式:A 前台 N 后台 E 仅显示错误
    ls_CTU_PARAMS-RACOMMIT = 'X'. "COMMIT WORK语句是否结束批处理的选项,值:“”可终止 “X”不可终止。

    CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
                             OPTIONS FROM ls_CTU_PARAMS
                             MESSAGES INTO LT_MESSAGE.
*    CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
**                            OPTIONS FROM GS_OPTIONS     "结构传参,参照结构:CTU_PARAMS
*                            MESSAGES INTO LT_MESSAGE    "返回消息,参照结构:BDCMSGCOLL
*                            UPDATE 'L'                  "更新模式:S 同步 A 异步
*                            MODE 'N'.                   "显示模式:A 前台 N 后台 E 仅显示错误

    IF SY-SUBRC = 0.
      READ TABLE LT_MESSAGE WITH KEY MSGID = 'M3'
                                     MSGNR = '489'.
      IF SY-SUBRC = 0.
        WRITE:/ '公司代码:',WA_DATA-I_VBUKR,WA_DATA-I_LFGJA,WA_DATA-I_LFMON,'物料账开启成功'.
      ELSE.
        LOOP AT LT_MESSAGE WHERE MSGTYP = 'E'.
          WRITE:/ '公司代码:',WA_DATA-I_VBUKR,WA_DATA-I_LFGJA,WA_DATA-I_LFMON,'物料账开启失败'.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = LT_MESSAGE-MSGID
              MSGNR               = LT_MESSAGE-MSGNR
              MSGV1               = LT_MESSAGE-MSGV1
              MSGV2               = LT_MESSAGE-MSGV2
              MSGV3               = LT_MESSAGE-MSGV3
              MSGV4               = LT_MESSAGE-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MESSAGE.

          WRITE:/ LV_MESSAGE.
        ENDLOOP.
      ENDIF.
    ELSE.
      WRITE:/ 'BDC执行错误'.
    ENDIF.
  ENDLOOP.

ENDFORM.

FORM FRM_EXEC_SESSION.
  " Open Session
  DATA: LS_GROUPNAME TYPE APQI-GROUPID VALUE 'ZMM02_01'.
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      CLIENT              = SY-MANDT
      GROUP               = LS_GROUPNAME
      KEEP                = 'X'
      USER                = SY-UNAME
    EXCEPTIONS
      CLIENT_INVALID      = 1
      DESTINATION_INVALID = 2
      GROUP_INVALID       = 3
      GROUP_IS_LOCKED     = 4
      HOLDDATE_INVALID    = 5
      INTERNAL_ERROR      = 6
      QUEUE_ERROR         = 7
      RUNNING             = 8
      SYSTEM_LOCK_ERROR   = 9
      USER_INVALID        = 10
      OTHERS              = 11.

  LOOP AT GT_DATA INTO WA_DATA.
    PERFORM FRM_CONVERT_DATA USING WA_DATA.

    " Insert Session
    CALL FUNCTION 'BDC_INSERT'
      EXPORTING
        TCODE            = 'MM02'
      TABLES
        DYNPROTAB        = GT_BDCDATA[]
      EXCEPTIONS
        INTERNAL_ERROR   = 1
        NOT_OPEN         = 2
        QUEUE_ERROR      = 3
        TCODE_INVALID    = 4
        PRINTING_INVALID = 5
        POSTING_INVALID  = 6
        OTHERS           = 7.

  ENDLOOP.

  " Close Session
  CALL FUNCTION 'BDC_CLOSE_GROUP'
    EXCEPTIONS
      NOT_OPEN    = 1
      QUEUE_ERROR = 2
      OTHERS      = 3.
  IF sy-subrc = 0.
    WRITE:/ 'Session创建成功,请到SM35执行'.
  ENDIF.
ENDFORM.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ERP全球顾问云平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 11.1 简单批导SHDB
    • 11.1.1 录屏
      • 11.1.2 保存生成源代码
        • 11.1.3 根据事物记录器写代码
        • 11.2 简单批导SHDB,MMPV专题
          • 11.2.1 录屏MMPV
            • 11.2.2 根据事物记录器写代码
            相关产品与服务
            数据保险箱
            数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档