SAP bdc例子----详细


REPORT Z_30715_BDC.

*定义表内容
TYPES:
  BEGIN OF GTY_MATERIAL ,
    MATNR TYPE C LENGTH 18, "物料代码
    MAKTX TYPE C LENGTH 80, "物料描述
    BRGEW TYPE C LENGTH 20, "毛总重
    NTGEW TYPE C LENGTH 20, "净重量
    GEWEI TYPE C LENGTH 3,  "单位
  END OF GTY_MATERIAL.

*定义下载的模板
DATA: BEGIN OF GT_TEMPLATE OCCURS 0 ,
        TAB1 TYPE C LENGTH 10 VALUE '物料代码',
        TAB2 TYPE C LENGTH 10 VALUE '物料描述',
        TAB3 TYPE C LENGTH 10 VALUE '毛重量',
        TAB4 TYPE C LENGTH 10 VALUE '净重量',
        TAB5 TYPE C LENGTH 10 VALUE '重量单位',
      END OF GT_TEMPLATE.

DATA: GT_MATERIAL TYPE TABLE OF GTY_MATERIAL,
      GS_MATERIAL TYPE GTY_MATERIAL.

DATA BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
DATA MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE."提示消息
DATA LV_MESSAGE TYPE C LENGTH 200.
DATA GV_SESSION TYPE APQI-GROUPID VALUE 'ZMM02_J02'."用session获取数据时定义的 SM35 名称

.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

*应用工具栏添加下载模板按钮
SELECTION-SCREEN FUNCTION KEY 1. "1~5 数字 可以增加5个按钮
TABLES SSCRFIELDS.

"按钮
*选择屏幕  定义文件选择框
PARAMETERS P_FILES TYPE RLGRAP-FILENAME.

INITIALIZATION .
  TYPE-POOLS ICON.
  SSCRFIELDS-FUNCTXT_01 = '@48@下载模板'. "下载模板按钮名称

AT SELECTION-SCREEN. "处理与selection screen相关的一些输入输出。
  PERFORM SELECT_SCREEN_API. "定义 下载模板按钮 功能


*为选择框添加选择界面
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILES.
  PERFORM GET_FILENAME. " 获取路径名称



START-OF-SELECTION.
* 取数
* 1.从excel上传
* 2. 手工插入数据

*  CLEAR GS_MATERIAL.
*  GS_MATERIAL-MATNR = '4274' .
*  GS_MATERIAL-MAKTX = 'testbdc' .
*  APPEND GS_MATERIAL TO GT_MATERIAL.
*
*  CLEAR GS_MATERIAL.
*  GS_MATERIAL-MATNR = '4275' .
*  GS_MATERIAL-MAKTX = 'testbdcaaa' .
*  APPEND GS_MATERIAL TO GT_MATERIAL.
*
*  CLEAR GS_MATERIAL.
*  GS_MATERIAL-MATNR = '4276' .
*  GS_MATERIAL-MAKTX = 'testbdcbbbb' .
*  APPEND GS_MATERIAL TO GT_MATERIAL.

  PERFORM GET_DATA. "获取数据

END-OF-SELECTION.
* 转换及调用
  " 第1种方法
  " PERFORM APPEND_BDCDATA.

  " 2种方法,利用session
  PERFORM APPEND_BDCDATA_BATCH.
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM APPEND_BDCDATA .

  LOOP AT GT_MATERIAL INTO GS_MATERIAL .

    CLEAR: BDCDATA, BDCDATA[], "循环执行时 清空原有数据
           MESSTAB, MESSTAB[]. "清空提示消息
    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.

*1.   CLEAR BDCDATA.
*     BDCDATA-PROGRAM = ''.
*     BDCDATA-DYNPRO = ''.
*     BDCDATA-DYNBEGIN = ''.
*     BDCDATA-FNAM = 'BDC_CURSOR'.
*     BDCDATA-FVAL = 'RMMG1-MATNR'.

    "2 代码格式优化
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR'  'RMMG1-MATNR'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE'  '=ENTR'.
    PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_MATERIAL-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 'MAKT-MAKTX' GS_MATERIAL-MAKTX .
    PERFORM APPEND_FIELDS USING 'MARA-MEINS' 'EA'.
    PERFORM APPEND_FIELDS USING 'MARA-MATKL' '23000000'.
    PERFORM APPEND_FIELDS USING 'MARA-SPART' '00'.
    PERFORM APPEND_FIELDS USING 'MARA-GEWEI' 'KG'.
    PERFORM APPEND_FIELDS USING 'MARA-NTGEW' '200'.

    CALL TRANSACTION 'MM01' USING BDCDATA "使用内表 bdcdata 调用事务代码 mm02
                                UPDATE 'S' " 更新模式:S 同步 A 异步
                                MODE 'A'  "显示模式 A 前台 N 后台 E 只显示错误
                                MESSAGES INTO MESSTAB."消息提示

    IF SY-SUBRC = 0.
      READ TABLE MESSTAB WITH KEY MSGID = 'M3'
                                        MSGNR = '801'. "物料修改成功

      IF SY-SUBRC = 0.
        WRITE: / '物料', GS_MATERIAL-MATNR, '修改成功'.

      ELSE.
        READ TABLE MESSTAB WITH KEY MSGID = 'M3'
        MSGNR = '801'. "数据未修改的时候  物料修改成功

        IF SY-SUBRC = 0.
          WRITE: / '物料修改失败'.

          WRITE: / '物料', GS_MATERIAL-MATNR, '失败原因:'.
          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_MESSAGE.

            WRITE: / 'E', LV_MESSAGE.

          ENDLOOP.

        ENDIF.

      ENDIF.
    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*

FORM APPEND_FIELDS USING VALUE(P_PROGRAM) VALUE(P_DYNPRO)  .
  CLEAR BDCDATA.
  BDCDATA-FNAM = P_PROGRAM.
  BDCDATA-FVAL = P_DYNPRO.
  APPEND BDCDATA.
ENDFORM.

FORM APPEND_SCREEN USING VALUE(P_PROGRAM) VALUE(P_DYNPRO)  .
  CLEAR BDCDATA.
  BDCDATA-PROGRAM = P_PROGRAM.
  BDCDATA-DYNPRO = P_DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GET_DATA .
*  1.获取本地文件路径
*  2.从文件中获取数据

  "文件类型转换  FILENAME是String类型
  DATA LV_FILES TYPE STRING.

  CHECK P_FILES IS NOT INITIAL.
  TRANSLATE P_FILES TO UPPER CASE.

  FIND '.TXT' IN P_FILES.
  IF SY-SUBRC = 0.
    LV_FILES = P_FILES.
* txt文件的上传
    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        FILENAME            = LV_FILES
*       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            = GT_MATERIAL
*   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.

  ELSE.
    FIND '.XLSX' IN P_FILES.
    IF SY-SUBRC = 0.

      DATA LA_RAW TYPE TRUXS_T_TEXT_DATA.

*excel 文件上传
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
        EXPORTING
          I_FIELD_SEPERATOR    = 'X'
          I_LINE_HEADER        = 'X'
          I_TAB_RAW_DATA       = LA_RAW
          I_FILENAME           = P_FILES
        TABLES
          I_TAB_CONVERTED_DATA = GT_MATERIAL
        EXCEPTIONS
          CONVERSION_FAILED    = 1
          OTHERS               = 2.
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.

    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GET_FILENAME .
  REFRESH GT_TEMPLATE.
  APPEND GT_TEMPLATE.
* 1.获取文件路径
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '    "默认文件名称
*     DEF_PATH         = ' '    "默认文件路径
      MASK             = ',excel.xls,*.xls,excel.xlsx,*.xlsx,text.txt,*.txt. '
      MODE             = 'o '     "s 保存 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.
*&---------------------------------------------------------------------*
*& Form SELECT_SCREEN_API
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SELECT_SCREEN_API .
  CASE SSCRFIELDS-UCOMM .
    WHEN 'FC01'.
      PERFORM DOWNLOAD_TEMPLATE. "下载模板
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM DOWNLOAD_TEMPLATE .
* 1.获取文件路径

  REFRESH  GT_TEMPLATE.
  APPEND GT_TEMPLATE.

  DATA LV_FILE TYPE STRING.

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
*     DEF_PATH         = ' '
      MASK             = '.EXCEL,*.XLSX. '
      MODE             = 'S'
*     TITLE            = ' '
    IMPORTING
      FILENAME         = LV_FILE
*     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.

  CHECK LV_FILE IS NOT INITIAL."避免上面function报错导致下面function不执行 加个判断

* 2.将内表下载到指定文件路径的文件中

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
*     BIN_FILESIZE            =
      FILENAME                = LV_FILE
*     FILETYPE                = 'ASC'
*     APPEND                  = ' '
      WRITE_FIELD_SEPARATOR   = 'X'
*     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              = ' '
*     WRITE_LF_AFTER_LAST_LINE        = ABAP_TRUE
*     SHOW_TRANSFER_STATUS    = ABAP_TRUE
*     VIRUS_SCAN_PROFILE      = '/SCET/GUI_DOWNLOAD'
*   IMPORTING
*     FILELENGTH              =
    TABLES
      DATA_TAB                = GT_TEMPLATE
*     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.
* Implement suitable error handling here
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA_BATCH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM APPEND_BDCDATA_BATCH .

*开启session
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
*     CLIENT              = SY-MANDT
*     DEST                = FILLER8
      GROUP               = GV_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.
* DATA:s TYPE string.

  LOOP AT GT_MATERIAL INTO GS_MATERIAL .

    CLEAR: BDCDATA, BDCDATA[], "循环执行时 清空原有数据
           MESSTAB, MESSTAB[]. "清空提示消息
    PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.

*1.   CLEAR BDCDATA.
*     BDCDATA-PROGRAM = ''.
*     BDCDATA-DYNPRO = ''.
*     BDCDATA-DYNBEGIN = ''.
*     BDCDATA-FNAM = 'BDC_CURSOR'.
*     BDCDATA-FVAL = 'RMMG1-MATNR'.

    "   前导零
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT        = GS_MATERIAL-MATNR
      IMPORTING
        OUTPUT       = GS_MATERIAL-MATNR
      EXCEPTIONS
        LENGTH_ERROR = 1
        OTHERS       = 2.


    "2 代码格式优化
    PERFORM APPEND_FIELDS USING 'BDC_CURSOR'  'RMMG1-MATNR'.
    PERFORM APPEND_FIELDS USING 'BDC_OKCODE'  '=ENTR'.
    PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_MATERIAL-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 'MAKT-MAKTX' GS_MATERIAL-MAKTX .
    PERFORM APPEND_FIELDS USING 'MARA-MEINS' 'EA'.
    PERFORM APPEND_FIELDS USING 'MARA-MATKL' '23000000'.
    PERFORM APPEND_FIELDS USING 'MARA-SPART' '00'.
    PERFORM APPEND_FIELDS USING 'MARA-GEWEI' 'KG'.
    PERFORM APPEND_FIELDS USING 'MARA-NTGEW' '200'.

    CALL TRANSACTION 'MM02'
          USING BDCDATA           "使用内表 bdcdata 调用事务代码 mm02
          UPDATE 'S'              " 更新模式:S 同步 A 异步
          MODE 'A'                "显示模式 A 前台 N 后台 E 只显示错误
          MESSAGES INTO MESSTAB.  "消息提示

*向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.

*关闭事务
  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:/ 'SESSION创建成功'.
  ENDIF.


ENDFORM.

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值