创建session做BDC

本文介绍了一个用于批量创建内部订单的ABAP程序。该程序通过上传包含订单信息的数据文件,检查利润中心是否存在,验证内部订单是否已创建,并最终通过BDC(后台文档控制)流程完成订单创建。此外,程序还提供了详细的错误处理和消息报告功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 TABLES: coas, cepc.

*-----------------------------------------------------------------------
*                    Internal Tables and Work Areas
*-----------------------------------------------------------------------
DATA: BEGIN OF gt_table OCCURS 0,    "internal order table
        auart LIKE aufk-auart,       "order type
        aufnr LIKE aufk-aufnr,       "order number
        ktext LIKE aufk-ktext,       "description
        bukrs LIKE aufk-bukrs,       "company code
        gsber LIKE aufk-gsber,       "business area
        prctr LIKE aufk-prctr,       "profit center
        funca LIKE aufk-func_area,   "function area
 END OF gt_table.

DATA: BEGIN OF gt_exists OCCURS 0.   "existed IO
        INCLUDE STRUCTURE gt_table.
DATA: END OF gt_exists.

DATA: BEGIN OF gt_prft_cntr OCCURS 0."the profit center not existing IO
        INCLUDE STRUCTURE gt_table.
DATA: END OF gt_prft_cntr.

DATA: BEGIN OF gt_submit OCCURS 0.   "the submitted IO
        INCLUDE STRUCTURE gt_table.
DATA: END OF gt_submit.

DATA: BEGIN OF gt_bdcdata OCCURS 0.  "BDC DATA
        INCLUDE STRUCTURE bdcdata.
DATA: END OF gt_bdcdata.

DATA: BEGIN OF gt_messtab OCCURS 10. "message table
        INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF gt_messtab.
DATA: gt_imesg LIKE mesg OCCURS WITH HEADER LINE.
*-----------------------------------------------------------------------
*                  Variables
*-----------------------------------------------------------------------
DATA: gv_group(12) TYPE VALUE 'INTERNAL_ORD',      "BDC Name
      gv_user(12)  TYPE c,                           "BDC User
      gv_keep(1)   TYPE VALUE 'X',                 " ' '=Delete,'X'=keep after processing
      gv_holddate  LIKE sy-datum.                    "Date

DATA:  gv_flag(1) TYPE c,
       gv_lin TYPE i.                                "number of orders

DATA: gv_c170(170),
      gv_c_uline(50) VALUE '__________________________________________________'.
DATA: tab TYPE filetable.
DATA: rc TYPE i.
DATA: rs TYPE c.
DATA: l_file TYPE string.
*-----------------------------------------------------------------------
*                   Selection Screen
*-----------------------------------------------------------------------
PARAMETERS: bdctype(1) TYPE DEFAULT 'B' NO-DISPLAY,
            bdcmode    LIKE bdcrun-bdc_amodus DEFAULT 'A' NO-DISPLAY.
PARAMETERS: in_file TYPE LENGTH 128 DEFAULT 'C:/TEMP/*.txt'.
SELECTION-SCREEN SKIP 1.

*--------- AT SELECTION-SCREEN ON VALUE-REQUEST ----------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR in_file.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
       window_title            = 'Select a valid file'
       file_filter             = 'All files(*.*)|*.*|Text file(*.txt)|*.txt|Word file(*.doc)|*.doc'
    CHANGING
       file_table              = tab
       rc                      = rc
    EXCEPTIONS
       file_open_dialog_failed = 1
       cntl_error              = 2
       error_no_gui            = 3
       not_supported_by_gui    = 4
       OTHERS                  5.
    IF sy-subrc = AND rc = 1.
       READ TABLE tab INTO in_file INDEX 1.
    ENDIF.

AT SELECTION-SCREEN.
  l_file = in_file.
  CALL METHOD cl_gui_frontend_services=>file_exist
    EXPORTING
      file                 = l_file
    RECEIVING
      result               = rs
          .
  IF sy-subrc <> OR rs NE 'X'.
    MESSAGE i001(00) WITH 'The file do not exist'.
    STOP.
  ENDIF.
*--------- START-OF-SELECTION ----------
START-OF-SELECTION.

  REFRESH gt_table.
  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename            = in_file
      filetype            = 'DAT'
    TABLES
      data_tab            = gt_table
    EXCEPTIONS
      conversion_error    = 1
      file_open_error     = 2
      file_read_error     = 3
      invalid_table_width = 4
      invalid_type        = 5
      no_batch            = 6
      unknown_error       = 7
      OTHERS              8.

  IF sy-subrc <> 0.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                 'Unable to upload input file '
                                 in_file '' ''.
  ENDIF.

  SORT gt_table BY  aufnr gsber DESCENDING.
  DELETE ADJACENT DUPLICATES FROM gt_table COMPARING aufnr.

  PERFORM open_group.
  PERFORM fill_bdc_data.
  PERFORM bdc_close_group.
  PERFORM write_report.

FORM open_group.
  gv_user = sy-uname.
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      client   = sy-mandt
      group    = gv_group
      holddate = gv_holddate
      keep     = gv_keep
      user     = gv_user.

  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.                               " OPEN_GROUP


FORM fill_bdc_data.

  CLEAR gt_table.

  LOOP AT gt_table.
    CLEAR gt_messtab.
    CLEAR gt_bdcdata.
    REFRESH gt_bdcdata.
    REFRESH gt_messtab.
    CLEAR gv_flag.

*   Check if Profit Center exists.
    SELECT SINGLE FROM cepc
           WHERE prctr = gt_table-prctr.

    IF sy-subrc <> 0.
      CLEAR gt_prft_cntr.
      MOVE-CORRESPONDING gt_table TO gt_prft_cntr.
      APPEND gt_prft_cntr.
      gv_flag = 'X'.
    ENDIF.

*   check if Internal Order has already been created.
    SELECT SINGLE FROM coas
       WHERE aufnr = gt_table-aufnr.

    IF sy-subrc = 0.
      CLEAR gt_exists.
      MOVE-CORRESPONDING gt_table TO gt_exists.
      APPEND gt_exists.
      gv_flag = 'X'.
    ENDIF.
    IF gv_flag <> 'X'.
      PERFORM bdcdata USING:   'X' 'SAPMKAUF' '0100',                 "order type
                               ' ' 'COAS-AUART' gt_table-auart,
                               ' ' 'BDC_OKCODE' '=KOKR'.
      PERFORM bdcdata USING:   'X' 'SAPLSPO4' '0300',                 "control area
                               ' ' 'SVALD-VALUE(01)' '1000',
                               ' ' 'BDC_OKCODE' '=FURT'.
      PERFORM bdcdata USING:   'X' 'SAPMKAUF' '0100',                 "ok code
                               ' ' 'BDC_OKCODE' '/00'.
      PERFORM bdcdata USING:   'X' 'SAPMKAUF' '0600',                 "order master data
                               ' ' 'COAS-AUFNR' gt_table-aufnr,
                               ' ' 'COAS-KTEXT' gt_table-ktext,
                               ' ' 'COAS-BUKRS' gt_table-bukrs,
                               ' ' 'COAS-GSBER' gt_table-gsber,
                               ' ' 'COAS-PRCTR' gt_table-prctr,
                               ' ' 'COAS-FUNC_AREA' gt_table-funca,
                               ' ' 'BDC_OKCODE' '=SICH'.
      PERFORM bdc_insert.
      MOVE-CORRESPONDING gt_table TO gt_submit.
      APPEND gt_submit.
    ENDIF.
  ENDLOOP.
ENDFORM.                               " FILL_BDC_DATA

FORM bdc_insert.
  CALL FUNCTION 'BDC_INSERT'
    EXPORTING
      tcode     = 'KO01'
    TABLES
      dynprotab = gt_bdcdata.

  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.                               " BDC_INSERT

FORM bdc_close_group.
  CALL FUNCTION 'BDC_CLOSE_GROUP'.

  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.                               " BDC_CLOSE_GROUP


FORM call_transaction.
  CALL TRANSACTION 'KO01' USING gt_bdcdata
                           MODE bdcmode
                       MESSAGES INTO gt_messtab.
ENDFORM.                               " CALL_TRANSACTION

FORM bdcdata USING p_begin p_field1 p_field2.

  CLEAR gt_bdcdata.
  CASE p_begin.
    WHEN 'X'.
      gt_bdcdata-program  = p_field1.
      gt_bdcdata-dynpro   = p_field2.
      gt_bdcdata-dynbegin = 'X'.
    WHEN space.
      gt_bdcdata-fnam  = p_field1.
      gt_bdcdata-fval  = p_field2.
  ENDCASE.
  APPEND gt_bdcdata.

ENDFORM.                               " BDCDATA

FORM write_report.
   DESCRIBE TABLE gt_exists LINES gv_lin.
  IF gv_lin >= 1.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                'The following Internal Orders already exist.' '' '' ''.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                    gv_c_uline '' '' ''.
    LOOP AT gt_exists.
      PERFORM collect_messages USING 'Z3' 'I' '000'
                                gt_exists-aufnr '' '' ''.
    ENDLOOP.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                 gv_c_uline '' '' ''.
  ENDIF.
  DESCRIBE TABLE gt_prft_cntr LINES gv_lin.
  IF gv_lin >= 1.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                  'The following Profit centers do not exist.' '' '' ''.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                   gv_c_uline '' '' ''.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                    'Internal Order Profit Center.' '' '' ''.
    LOOP AT gt_prft_cntr.
      PERFORM collect_messages USING 'Z3' 'I' '000'
                                gt_prft_cntr-aufnr
                                gt_prft_cntr-prctr '' ''.
    ENDLOOP.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                 gv_c_uline '' '' ''.
  ENDIF.
  DESCRIBE TABLE gt_submit LINES gv_lin.
  IF gv_lin >= 1.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                   'BDC was created for the following Internal Orders.'
                    '' '' ''.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                   gv_c_uline '' '' ''.
    LOOP AT gt_submit.
      PERFORM collect_messages USING 'Z3' 'I' '000'
                                gt_submit-aufnr '' '' ''.
    ENDLOOP.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                                   gv_c_uline '' '' ''.
  ENDIF.
  PERFORM collect_messages USING 'Z3' 'I' '000'
                  'The following Internal Orders have no Business Area.'
                  '' '' ''.
  PERFORM collect_messages USING 'Z3' 'I' '000'
                                 gv_c_uline '' '' ''.
  DELETE gt_table WHERE NOT gsber = ' '.
  LOOP AT gt_table.
    PERFORM collect_messages USING 'Z3' 'I' '000'
                              gt_table-aufnr '' '' ''.
  ENDLOOP.
  PERFORM collect_messages USING 'Z3' 'I' '000'
                                 gv_c_uline '' '' ''.
ENDFORM.                               " WRITE_REPORT


FORM collect_messages USING    p_msgid
                               p_msgty
                               p_msgnr
                               p_msgv1
                               p_msgv2
                               p_msgv3
                               p_msgv4.

  CLEAR gt_imesg.

  gt_imesg-arbgb = p_msgid.
  gt_imesg-msgty = p_msgty.
  gt_imesg-txtnr = p_msgnr.
  gt_imesg-msgv1+0(2) = '@ '.
  gt_imesg-msgv1+2(48) = p_msgv1.
  gt_imesg-msgv2 = p_msgv2.
  gt_imesg-msgv3 = p_msgv3.
  gt_imesg-msgv4 = p_msgv4.
  APPEND gt_imesg.

  CONCATENATE p_msgv1 p_msgv2 p_msgv3 p_msgv4
              INTO gv_c170 SEPARATED BY space.
  WRITE:/ gv_c170.

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值