SAP SHDB 录制BDC并程序调用BDC教程

Step1. 录制BDC

  1. 运行T-Code:SHDB,SHDB中可查看修改创建BDC录屏记录
    1

  2. 点击新建记录,创建一个新的BDC录屏
    2

  3. 输入创建参数,然后点击开始记录(录屏界面可能和使用事务代码的界面不一样;如果需要两个界面一致;需勾选不是批输入会话
    3

  4. 输入物料编号,回车进入视图选择窗
    4

  5. 选择基本数据 1视图视图;然后回车进入物料主数据视图界面
    5

  6. 修改物料描述,物料组,然后切换到基本数据 2 视图;建议使用右边的视图切换按钮,保证BDC能够记录到
    6
    7.录入基本数据2 视图数据后;点击保存按钮结束录屏
    7

  7. 点击保存按钮保存记录(录屏的数据就是我们要使用的数据格式;构造一样的格式就可通过ABAP程序实现调用
    8

  8. DBC ZMM02_01创建完成
    9

Step2. 通过标准创建ABAP程序调用BDC

  1. 在SHDB界面选择记录ZMM02_01,然后点击程序按钮
    10
  2. 输入对应参数
    11
  3. 输入程序描述,点击源代码,跳转到程序编辑界面(可通过修改修改标准程序达到目的,参照 Step3. )

Step3. 手动创建ABAP程序调用BDC

3.1 从EXCEL TXT文件取数据

  • 详见代码:PERFORM FRM_GET_FILENAME.
  • 详见代码:PERFORM FRM_GET_DATA.

3.2 根据录屏结果生成BDC调用数据

  • 第一行记录事务代码的行可以省略
    12
  • BDC_SUBSCR 的行可以省略不填
  • 未修改的值(MARA-MEINS = PC MARA-GEWEI = KG)也可省略不填
  • 详见代码:PERFORM FRM_CONVERT_DATA USING WA_DATA.
    13

3.3 执行BDC调用

  • 方法一:使用Transaction方法,读入一条执行一次MM02
  • 方法二:使用Session的方式,读入所有数据放到一个Session,再用MM02逐条执行;还需要使用SM35去执行Session
  • 方法一详见代码:PERFORM FRM_EXEC_TRANSACTION.
  • 方法二详见代码:PERFORM FRM_EXEC_SESSION.

4.4 代码

TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
         MATNR TYPE CHAR50,  "料号
         MAKTX TYPE CHAR50,  "物料描述
         MATKL TYPE CHAR50,  "物料组
         NORMT TYPE CHAR50,  "开发案号
       END OF TY_DATAS.

DATA: GT_DATA TYPE TABLE OF TY_DATAS,
      WA_DATA TYPE TY_DATAS.

DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.

PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.

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

START-OF-SELECTION.
  PERFORM FRM_GET_DATA.

END-OF-SELECTION.
*  "   调用方法一 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_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-NORMT'.
  PERFORM FRM_FIELD_LINE USING 'MARA-NORMT' WA_DATA-NORMT.
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.

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.

Step4. 运行测试

  1. 准备Excel数据
    12
  2. Transaction 方式
    12
    13
  3. Session 方式
    14
    15
    16
  4. 执行结果
    17

版权声明:本文为qq_30797051原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。