关闭

BDC 开发步骤

1116人阅读 评论(0) 收藏 举报
分类:
Step 1. 录制 BDC.
        SM35/SHDB 进入 BDC 录制界面, 开始录制.
Step 2. 把录制好的 BDC 转成 ABAP 程式.
  定义通过 EXCEL 上传用到的参数,
DATAif_intern TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE.
DATAvf_start_col TYPE i,
      vf_start_row TYPE i,
      vf_end_col   TYPE i,
      vf_end_row   TYPE i.
DATAvf_index TYPE i.
FIELD-SYMBOLS: <fs>.
  定义 BDC 用到的参数.
DATABEGIN OF bdcdata OCCURS 0.
        INCLUDE STRUCTURE bdcdata.
DATAEND OF bdcdata.
DATABEGIN OF messtab OCCURS 0.
        INCLUDE STRUCTURE bdcmsgcoll.
DATAEND OF messtab.
DATABEGIN OF errlist OCCURS 0.
        INCLUDE STRUCTURE itab0.
DATAEND OF errlist.
DATAcnt TYPE i.
DATAtcode LIKE tstc-tcode,
      cnt_input TYPE i,
      cnt_error TYPE i,
      cnt_update TYPE i,
      c_update TYPE c VALUE 'S'.

Start-of-selection.
  PERFORM upload_from_pc USING i_file1.
  PERFORM modify.
  PERFORM output_result.
  PERFORM output_error USING i_file2.
*********************************************************
FORM modify .
  DESCRIBE TABLE itab0 LINES cnt.
  IF cnt <> 0.
    LOOP AT itab0.
      PERFORM check_data.
      PERFORM pre_bdcdata.
      PERFORM call_transaction_form.
    ENDLOOP.
  ENDIF.
ENDFORM.
***********************************************************
FORM pre_bdcdata .
  REFRESHbdcdata.
  PERFORM scr_1.
  PERFORM scr_2.
  PERFORM scr_3.
  PERFORM scr_4.
ENDFORM.
************************************************************
FORM scr_1 .
  PERFORM bdc_dynpro USING 'SAPLAIST' '0100'.
  PERFORM bdc_field USING 'BDC_CURSOR' 'ANLA-ANLN1'.
  PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
  PERFORM bdc_field USING 'ANLA-ANLN1' itab0-anln1.
  PERFORM bdc_field USING 'ANLA-BUKRS' itab0-bukrs.
ENDFORM
***********************************************************
FORM bdc_dynpro  USING  program dynpro.
  CLEAR bdcdata.
  bdcdata-program program.
  bdcdata-dynpro  dynpro.
  bdcdata-dynbegin  'X'.
  APPEND bdcdata.
ENDFORM                   BDC_DYNPRO
*&---------------------------------------------------------------------*
*&      Form  BDC_FIELD
*&---------------------------------------------------------------------*
FORM bdc_field  USING  fnam fval.
  CLEAR bdcdata.
  bdcdata-fnam fnam.
  bdcdata-fval  fval.
  APPEND bdcdata.
ENDFORM                   BDC_FIELD
**************************************************************************
FORM call_transaction_form .
  CALL TRANSACTION tcode
    USING bdcdata
    MODE s_mode
    UPDATE c_update
    MESSAGES INTO messtab.
  IF sy-subrc NE 0.
    ADD 1 TO cnt_error.
    PERFORM append_err_file.
  ELSE.
    ADD 1 TO cnt_update.
  ENDIF.
ENDFORM.  
*******************************************************
FORM append_err_file .
  MOVE-CORRESPONDING itab0 TO errlist.
  APPEND errlist.
  CLEAR errlist.
ENDFORM                   APPEND_ERR_FILE
*&---------------------------------------------------------------------*
*&      Form  OUTPUT_RESULT
*&---------------------------------------------------------------------*
FORM output_result .
  SKIP 2.
  ULINE.
  WRITE'Number of input: '20 cnt_input.
  WRITE'Number of update: '20 cnt_update.
  WRITE'Number of error: '20 cnt_error.
ENDFORM                   OUTPUT_RESULT

Note:
   上面的方式执行者也必须有执行 Tcode 的权限, 某些情况下 User 可能没此权限, 这种情况下就要换另外一种方式去做(会话).
   1.  数据传输程序从数据文件中获取数据传输信息,生成批输入会话, 会话通常以后台模式调用 SAP 事务并模拟用户对话进行数据传输. 同时, 会话中还包含所有需要传输的数据, 这些数据将在处理会话时输入应用事务的各个屏幕, 并更新数据库.
   2. 会话的创建过程与处理过程是分开进行的. 在创建批输入对话之后, 可以通过程序 RSBDCSUB 或批输入监控器(SM35)来处理该会话, 会话的处理过程即通过事务将数据传输到 SAP 系统的过程.
   3. 创建批输入会话之后, 如果会话以后台模式处理(包括提交后台作业或者在批输入监按器中以后台模式运行), 系统将使用会话创建用户来进行相关事务的权限检查. 如果以交互模式处理会话, 则将检查在线处理该会话的用户权限.
   4. 对于某些字段类型为 QUAN 的, 如果定义上传的内表字段的类型也为 QUAN, 则程式执行时,可能出现 "Input value is longer than screen field." 解决这个的办法就是把这个定义成 char 型.
   5. F1, F4 功能以及自定义的 F1, F4帮助都不能被录制.
   6. 系统(system)和(Help)菜单中的功能均无法录制.
   7. 默认变式, 即事务变式中的字段值不能被录制
   8. 错误和警告信息不能被录制
   9. 有些较新的 SAP 控件不支持录制及批量输入的功能.
   10. 有些新的 Tcode 不支持录制
   11. 滚动条功能不能被录制, 录制时应使用功能键 F21-F24.
   12. 最好使用字符型来定义内表字段, 不要用 Like 去参照其它数据对象来定义, 那样容易报错, 不同用户定义的日期风格会存在差异, 使用 write date2 to date1 来实现日期格式的转换.
DATAp_groupid LIKE apqi-groupid.
DATAp_user LIKE sy-uname.
 PERFORM bdc_open_group.
 PERFORM pre_bdc.
 PERFORM bdc_insert_group.
 PERFORM bdc_close_group .
 PERFORM get_session_state USING p_groupid .
 PERFORM write_error.
**************************************************************
FORM bdc_open_group .
  CONCATENATE  sy-datum sy-uzeit INTO p_groupid.
  CALL FUNCTION 'BDC_OPEN_GROUP'  "open session
    EXPORTING
         client              sy-mandt
        DEST                FILLER8
         group               p_groupid
        HOLDDATE            FILLER8
         keep                'X'
         user                p_user
        RECORD              FILLER1
   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.
ENDFORM                   BDC_OPEN_GROUP
************************************************************
FORM pre_bdc .
  REFRESH bdcdata.
  PERFORM bdc_dynpro USING 'SAPLMR1M' '0300'.
  PERFORM bdc_field  USING 'BDC_CURSOR' 'G_BUDAT'.
  PERFORM bdc_field  USING 'BDC_OKCODE' '=CANC'.
  PERFORM bdc_field  USING 'RBKPV-BELNR' i_belnr.
  PERFORM bdc_field  USING 'RBKPV-GJAHR' i_gjahr.
  PERFORM bdc_field  USING 'UF05A-STGRD' i_stgrd.
  PERFORM bdc_field  USING 'G_BUDAT' i_budat.
ENDFORM
*************************************************************
FORM bdc_insert_group .
  CALL FUNCTION 'BDC_INSERT'
    EXPORTING
      tcode            tcode
    TABLES
      dynprotab        bdcdata
    EXCEPTIONS
      internal_error   1
      not_open         2
      queue_error      3
      tcode_invalid    4
      printing_invalid 5
      posting_invalid  6
      OTHERS           7.
ENDFORM                   BDC_INSERT_GROUP
*********************************************************
FORM bdc_close_group .
  CALL FUNCTION 'BDC_CLOSE_GROUP'
    EXCEPTIONS
      not_open    1
      queue_error 2
      OTHERS      3.

  SUBMIT rsbdcsub WITH mappe EQ p_groupid
               WITH von EQ sy-datum
               WITH bis EQ sy-datum
               WITH fehler EQ '.'
               EXPORTING LIST TO MEMORY
               AND RETURN.
  WAIT UP TO 10 SECONDS .

ENDFORM                   BDC_CLOSE_GROUP
**********************************************************
FORM get_session_state  USING   p_session.
  CLEARitab1,itab1[].
  itab1-groupid p_groupid.
  itab1-belnr i_belnr.
  itab1-gjahr i_gjahr.
  itab1-stgrd i_stgrd.
  itab1-budat i_budat.
  itab1-erdat sy-datum.
  itab1-uzeit sy-uzeit.
  itab1-ernam sy-uname.
  itab1-text i_text.
  APPEND itab1.
  PERFORM insert_zszd219.
  SELECT SINGLE apqi~mandant apqi~groupid apqi~qid apqi~qstate
               apql~temseid
    INTO (ijob-mandant,ijob-groupid,ijob-qid,ijob-qstate,ijob-temseid)
    FROM apqi INNER JOIN apql
             ON apql~mandant apqi~mandant
             AND apql~groupid apqi~groupid
             AND apql~qid apqi~qid
      WHERE apqi~groupid p_session
        AND apqi~datatyp 'BDC'
        AND apqi~mandant sy-mandt .
  IF sy-subrc 0 AND ijob-qstate 'F'.
    READ TABLE itab1 INDEX 1.
    itab1-state 'F'.
    MODIFY itab1 INDEX 1.
    PERFORM insert_zszd219.
    WRITE'Cancel Invoice Sucessful'.
  ELSEIF sy-subrc 0 AND ijob-qstate <> 'F'.
    PERFORM read_bdc_log_plain TABLES logtable USING ijob-temseid ijob-mandant.
  ELSEIF sy-subrc <> 0.
    WRITE:/ 'Job name: ',p_session,has not finish.'.
  ENDIF.

  CHECK NOT bdclm[] IS INITIAL.
  LOOP AT itab1.
    READ TABLE bdclm WITH KEY tcode 'MR8M'
                              tcnt sy-tabix.
    CHECK sy-subrc 0.
    MOVE-CORRESPONDING itab1 TO errtab.
    IF bdclm-mart 'E'.
      errtab-mess  bdclm-longtext.
    ELSE.
      errtab-mess 'Cancel Invoice Sucessful'.
    ENDIF.
    APPEND errtab.
    CLEAR errtab.
  ENDLOOP.
ENDFORM.  
*********************************************************
FORM write_error .
  DATAcount TYPE i.
  count 0.
  LOOP AT errtab.
    IF count 0.
      FORMAT COLOR 3 ON.
      WRITE/01 errtab.
      FORMAT COLOR 3 OFF.
      SKIP 1.
    ELSE.
      WRITE/01 errtab.
    ENDIF.
    count 1.
  ENDLOOP.
ENDFORM                   WRITE_ERROR


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3128790次
    • 积分:50653
    • 等级:
    • 排名:第57名
    • 原创:1886篇
    • 转载:2446篇
    • 译文:101篇
    • 评论:251条
    博客专栏
    最新评论
    微信公众号
      为你推荐最新的博文~更有惊喜等着你