ABAP BDC 相關

BDC基本流程

一  、定義一個BDC程序的基本流程

1. BDC錄製,記錄屏幕操作

2.產生相關的程序及數據格式文件

3.利用程序將相關單據信息讀取到內表,並對內表的數據進行調整邏輯處理(數據檢查或數據轉換)

4.調用BDC錄製程序導入數據

5.輸出消息列表(基本操作對象:MESSTAB(TYPE BDCMSGCOLL))

二 、主要事務代碼 : -SHDB(錄屏)  -SM35(查看會話)

三、BDC兩種實現方式 

1.CALL TRANSACTION

*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM APPEND_BDCDATA .
  DATA LV_MESSAGES  TYPE C LENGTH 200.
  LOOP AT GX_01 INTO GS_01 .
    CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
    PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.

    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE'  '=ENTR'.
    PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.

    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
    PERFORM APPEND_FIELDS USING 'MAKT-MAKTX'  GS_01-MAKTX.
    PERFORM APPEND_FIELDS USING 'MARA-BRGEW'  GS_01-BRGEW.
    PERFORM APPEND_FIELDS USING 'MARA-NTGEW'  GS_01-NTGEW.
    PERFORM APPEND_FIELDS USING 'MARA-GEWEI'  GS_01-GEWEI.

    CLEAR GS_OPTION.
    GS_OPTION-DISMODE ='A'.
    GS_OPTION-UPDMODE ='S'.
    CALL TRANSACTION  'MM02' USING BDCDATA "使用內表調用
                             OPTIONS FROM GS_OPTION " CTU_PARAMS
*                             UPDATE 'S' " 更新模式 s a
*                             MODE 'N'    "顯示模式 A,N
                             MESSAGES INTO MESSTAB .
    READ TABLE MESSTAB WITH  KEY MSGID = 'M3'
                                      MSGNR = '801'.
    IF SY-SUBRC = 0 .
      WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
    ELSE.
      READ TABLE  MESSTAB WITH KEY MSGID = 'M3'
                                   MSGNR = '810' .
      IF SY-SUBRC = 0 .
        WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
      ELSE.
        WRITE:/ '物料ERROE' .

        LOOP AT MESSTAB WHERE MSGTYP = 'E'  .

          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = MESSTAB-MSGID
              MSGNR               = MESSTAB-MSGNR
              MSGV1               = MESSTAB-MSGV1
              MSGV2               = MESSTAB-MSGV2
              MSGV3               = MESSTAB-MSGV3
              MSGV4               = MESSTAB-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MESSAGES.
          WRITE:/ LV_MESSAGES.
        ENDLOOP .

      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

2.BATCH INPUT SESSION

*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM APPEND_ABCDATA_BATCH .
  DATA GX_SESSION TYPE APQI-GROUPID VALUE 'ZMM02_GX_TEST' .
* 開啓session
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
*     CLIENT              = SY-MANDT
*     DEST                = FILLER8
      GROUP               = GX_SESSION
*     HOLDDATE            = FILLER8
      KEEP                = 'X'
      USER                = SY-UNAME
*     RECORD              = FILLER1
*     PROG                = SY-CPROG
*     DCPFM               = '%'
*     DATFM               = '%'
*   IMPORTING
*     QID                 =
    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.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    EXIT.
  ENDIF.

  LOOP AT GX_01 INTO GS_01 .
    CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
    PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.

    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE'  '=ENTR'.
    PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.


    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
    PERFORM APPEND_FIELDS USING 'MAKT-MAKTX'  GS_01-MAKTX.
    PERFORM APPEND_FIELDS USING 'MARA-BRGEW'  GS_01-BRGEW.
    PERFORM APPEND_FIELDS USING 'MARA-NTGEW'  GS_01-NTGEW.
    PERFORM APPEND_FIELDS USING 'MARA-GEWEI'  GS_01-GEWEI.

*向SESSION插入事務
    CALL FUNCTION 'BDC_INSERT'
      EXPORTING
        TCODE            = 'MM02'
*       POST_LOCAL       = NOVBLOCAL
*       PRINTING         = NOPRINT
*       SIMUBATCH        = ' '
*       CTUPARAMS        = ' '
      TABLES
        DYNPROTAB        = BDCDATA
      EXCEPTIONS
        INTERNAL_ERROR   = 1
        NOT_OPEN         = 2
        QUEUE_ERROR      = 3
        TCODE_INVALID    = 4
        PRINTING_INVALID = 5
        POSTING_INVALID  = 6
        OTHERS           = 7.
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.
  ENDLOOP.

* 關閉SESSION
  CALL FUNCTION 'BDC_CLOSE_GROUP'
    EXCEPTIONS
      NOT_OPEN    = 1
      QUEUE_ERROR = 2
      OTHERS      = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ELSE.
    WRITE:/'SUCC'.
  ENDIF.

ENDFORM.

BDC實現,上傳文件

1.使用函數 WS_FILENAME_GET 獲取文件路徑

FORM GET_FIELNAME .
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
*     DEF_PATH         = ' '
      MASK             = ',excel.xls,*.xls,text.txt,*.txt.'
      MODE             = 'O'
      TITLE            = '打開文件'
    IMPORTING
      FILENAME         = P_FILES
*     RC               =
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

2.使用函數GUI_UPLOAD,上傳txt文件

  DATA GV_FILE TYPE STRING.
* 1. 獲取本地文件
  CHECK P_FILES IS NOT INITIAL .
*  2.從文件取數據
  TRANSLATE P_FILES TO UPPER CASE .
  FIND '.TXT' IN P_FILES .
  IF SY-SUBRC = 0 .
    GV_FILE = P_FILES.

    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        FILENAME                = GV_FILE
*       FILETYPE                = 'ASC'
        HAS_FIELD_SEPARATOR     = 'X'
*       HEADER_LENGTH           = 0
*       READ_BY_LINE            = 'X'
*       DAT_MODE                = ' '
*       CODEPAGE                = ' '
*       IGNORE_CERR             = ABAP_TRUE
*       REPLACEMENT             = '#'
*       CHECK_BOM               = ' '
*       VIRUS_SCAN_PROFILE      =
*       NO_AUTH_CHECK           = ' '
* IMPORTING
*       FILELENGTH              =
*       HEADER                  =
      TABLES
        DATA_TAB                = GX_01
* CHANGING
*       ISSCANPERFORMED         = ' '
      EXCEPTIONS
        FILE_OPEN_ERROR         = 1
        FILE_READ_ERROR         = 2
        NO_BATCH                = 3
        GUI_REFUSE_FILETRANSFER = 4
        INVALID_TYPE            = 5
        NO_AUTHORITY            = 6
        UNKNOWN_ERROR           = 7
        BAD_DATA_FORMAT         = 8
        HEADER_NOT_ALLOWED      = 9
        SEPARATOR_NOT_ALLOWED   = 10
        HEADER_TOO_LONG         = 11
        UNKNOWN_DP_ERROR        = 12
        ACCESS_DENIED           = 13
        DP_OUT_OF_MEMORY        = 14
        DISK_FULL               = 15
        DP_TIMEOUT              = 16
        OTHERS                  = 17.
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.

3.使用函數TEXT_CONVERT_XLS_TO_SAP,上傳excel文件

    FIND '.XLS' IN P_FILES .
    IF SY-SUBRC = 0 .
* EXCEL 文件的上傳
      DATA  LT_RAW TYPE TRUXS_T_TEXT_DATA.
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
        EXPORTING
          I_FIELD_SEPERATOR    = 'x'
          I_LINE_HEADER        = 'x'
          I_TAB_RAW_DATA       = LT_RAW
          I_FILENAME           = P_FILES
        TABLES
          I_TAB_CONVERTED_DATA = GX_01
        EXCEPTIONS
          CONVERSION_FAILED    = 1
          OTHERS               = 2.
    ENDIF.
  ENDIF.

四、BDC錄製,記錄屏幕操作

*&---------------------------------------------------------------------*
*&      Form  APPEND_BDCDATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM APPEND_BDCDATA .
  DATA LV_MESSAGES  TYPE C LENGTH 200.
  LOOP AT GX_01 INTO GS_01 .
    CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
    PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.

    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE'  '=ENTR'.
    PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.

    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
    PERFORM APPEND_FIELDS USING 'MAKT-MAKTX'  GS_01-MAKTX.
    PERFORM APPEND_FIELDS USING 'MARA-BRGEW'  GS_01-BRGEW.
    PERFORM APPEND_FIELDS USING 'MARA-NTGEW'  GS_01-NTGEW.
    PERFORM APPEND_FIELDS USING 'MARA-GEWEI'  GS_01-GEWEI.

    CLEAR GS_OPTION.
    GS_OPTION-DISMODE ='A'.
    GS_OPTION-UPDMODE ='S'.
    CALL TRANSACTION  'MM02' USING BDCDATA "使用內表調用
                             OPTIONS FROM GS_OPTION " CTU_PARAMS
*                             UPDATE 'S' " 更新模式 s a
*                             MODE 'N'    "顯示模式 A,N
                             MESSAGES INTO MESSTAB .
    READ TABLE MESSTAB WITH  KEY MSGID = 'M3'
                                      MSGNR = '801'.
    IF SY-SUBRC = 0 .
      WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
    ELSE.
      READ TABLE  MESSTAB WITH KEY MSGID = 'M3'
                                   MSGNR = '810' .
      IF SY-SUBRC = 0 .
        WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
      ELSE.
        WRITE:/ '物料ERROE' .

        LOOP AT MESSTAB WHERE MSGTYP = 'E'  .

          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = MESSTAB-MSGID
              MSGNR               = MESSTAB-MSGNR
              MSGV1               = MESSTAB-MSGV1
              MSGV2               = MESSTAB-MSGV2
              MSGV3               = MESSTAB-MSGV3
              MSGV4               = MESSTAB-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MESSAGES.
          WRITE:/ LV_MESSAGES.
        ENDLOOP .

      ENDIF.
    ENDIF.

  ENDLOOP.

ENDFORM.

FORM APPEND_SCREEN USING VALUE(P_PROGRAM)  "值傳遞
                          VALUE(P_DYNPRO) .
  CLEAR BDCDATA .
  BDCDATA-PROGRAM  = P_PROGRAM.
  BDCDATA-DYNPRO   = P_DYNPRO .
  BDCDATA-DYNBEGIN = 'X'.
  BDCDATA-FNAM     = ''.
  BDCDATA-FVAL     = ''.
  APPEND BDCDATA.

ENDFORM.
FORM APPEND_FIELDS USING VALUE(P_FIELD)
                         VALUE(P_VALUE).
  CLEAR BDCDATA .
  BDCDATA-PROGRAM  = ''.
  BDCDATA-DYNPRO   = '' .
  BDCDATA-DYNBEGIN = ''.
  BDCDATA-FNAM     = P_FIELD.
  BDCDATA-FVAL     = P_VALUE.
  APPEND BDCDATA.
ENDFORM .

相關參照

在屏幕上添加一個按鈕

TABLES : SSCRFIELDS .

SELECTION-SCREEN FUNCTION KEY 1. "1-5

INITIALIZATION .
   TYPE-POOLS: ICON.
   SSCRFIELDS-FUNCTXT_01 = '@01@下載模板'.

  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM  DOWNLOAD_TEMPLATE.
  ENDCASE.

BDCDATA 錄屏相關字段 程序/ 屏幕 / 開始ID / 字段名 / 值

BCD執行完收集信息的相關字段

 

CALL TRANSACTION USING ....運行是參數字符串

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章