BDC 的使用

PP01 成本中心创建

DATA:GT_BDCDATA         TYPE TABLE OF BDCDATA,
     LS_OPT             TYPE CTU_PARAMS,
     LT_MES             TYPE TABLE OF BDCMSGCOLL.  

  DATA: LV_TCODE         TYPE SY-TCODE.

 LV_TCODE = 'PP01'.
  
LOOP AT ET_ZHRS_CREATE_COST_CENTER ASSIGNING FIELD-SYMBOL().

CLEAR:GT_BDCDATA,LT_MES.
    PERFORM FRM_BDC_DYNPRO      USING 'SAPMH5A0' '5000'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_OKCODE' '=INSE'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-PLVAR' '1'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-OTYPE' 'O'.
    PERFORM FRM_BDC_FIELD       USING 'PM0D1-SEARK' -OBJID.
    PERFORM FRM_BDC_FIELD       USING 'BDC_CURSOR' 'TT_T777T-ITEXT(02)'.
    PERFORM FRM_BDC_FIELD       USING 'PM0D1-TIMR6' 'X'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-BEGDA' '1800.01.01'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-ENDDA' '9999.12.31'.
    PERFORM FRM_BDC_FIELD       USING 'MARKFELD(02)' 'X'.

    PERFORM FRM_BDC_DYNPRO      USING 'MP100100' '2000'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_CURSOR' 'P1001-SOBID'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_OKCODE' '=UPD'.
    PERFORM FRM_BDC_FIELD       USING 'P1001-BEGDA' -BEGDA.
    PERFORM FRM_BDC_FIELD       USING 'P1001-ENDDA' '99991231'.
    PERFORM FRM_BDC_FIELD       USING 'P1001-RSIGN' 'A'.
    PERFORM FRM_BDC_FIELD       USING 'P1001-RELAT' '011'.
    PERFORM FRM_BDC_FIELD       USING 'P1001-SCLAS' 'K'.
    PERFORM FRM_BDC_FIELD       USING 'P1001-SOBID' -KOSTL.

    PERFORM FRM_BDC_DYNPRO      USING 'MP100100' '5010'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_CURSOR' 'PKEYK-KOSTL'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_OKCODE' '=UPD'.
    PERFORM FRM_BDC_FIELD       USING 'PKEYK-KOSTL' -KOSTL.
    PERFORM FRM_BDC_FIELD       USING 'PKEYK-KOKRS' 'QDMG'.

    PERFORM FRM_BDC_DYNPRO      USING 'SAPMH5A0' '5000'.
    PERFORM FRM_BDC_FIELD       USING 'BDC_OKCODE' '=BACK'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-PLVAR' '01'.
    PERFORM FRM_BDC_FIELD       USING 'PPHDR-OTYPE' 'O'.
    PERFORM FRM_BDC_FIELD       USING 'PM0D1-SEARK' -OBJID.


    LS_OPT-DISMODE = 'N'.
    LS_OPT-UPDMODE = 'S'.
    LS_OPT-DEFSIZE = 'X'.
    LS_OPT-CATTMODE = 'A'.
    CALL TRANSACTION LV_TCODE USING GT_BDCDATA[] OPTIONS FROM LS_OPT MESSAGES INTO LT_MES.

    READ TABLE LT_MES ASSIGNING FIELD-SYMBOL() WITH KEY MSGTYP = 'E'.
    IF SY-SUBRC EQ 0.
      -TYPE = -MSGTYP.
      MESSAGE ID -MSGID TYPE -MSGTYP NUMBER -MSGNR
            WITH -MSGV1 -MSGV2 -MSGV3 -MSGV4
            INTO -MESSAGE.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      -TYPE = 'S'.
      -MESSAGE = TEXT-S05.

    ENDIF.
  ENDLOOP.

*&---------------------------------------------------------------------*
*&      Form  fRM_bdc_dynpro
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PROG       text
*      -->SCR        text
*----------------------------------------------------------------------*


FORM FRM_BDC_DYNPRO USING IV_PROG IV_SCR.
  DATA LS_BDCDATA TYPE BDCDATA.

  LS_BDCDATA-PROGRAM  = IV_PROG.
  LS_BDCDATA-DYNPRO   = IV_SCR.
  LS_BDCDATA-DYNBEGIN = 'X'.
  APPEND LS_BDCDATA TO GT_BDCDATA.
  CLEAR LS_BDCDATA.
ENDFORM. " fRM_bdc_dynpro


*&---------------------------------------------------------------------*
*&      Form  fRM_bdc_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FNAM       text
*      -->FVAL       text
*----------------------------------------------------------------------*


FORM FRM_BDC_FIELD USING IV_FNAM IV_FVAL.
  DATA LS_BDCDATA TYPE BDCDATA.

  LS_BDCDATA-FNAM  = IV_FNAM.
  LS_BDCDATA-FVAL  = IV_FVAL.
  APPEND LS_BDCDATA TO GT_BDCDATA.
  CLEAR LS_BDCDATA.
ENDFORM. " fRM_bdc_field

BDC 的使用_第1张图片

BDC 的使用_第2张图片

BDC 的使用_第3张图片

 需要注意的是BDC在录屏的时候,有些情境会出现弹出选择框,让你选择是和否。此时这里勾选,并且OPT-NOBINPT = 'X'这个值设置为X。

BDC 的使用_第4张图片

 1.在每一次call TRANSACTION 之后,可以适当延时几秒,可以防止在有些t-code过账的时候出现profit center被锁着的情况    WAIT UP TO p_wait SECONDS.

有时候,当你直接跑过账失败,而你debug跑的话就成功,也可以看看是不是锁的问题,然后可以考虑下对两次生成凭证进行延时。

2.可能会出现的A模式下过账成功,N模式过账不成功:

      原因是:有些事你的BDC在这一屏没有这个字段,然后会返回一个这个字段不存在的S类型的message,然后BDC退出了,就没有完全成功过账。

      同一个屏幕,不同的过账码+科目可能有不同的字段。所以录屏完写程序的时候,这个光标的问题,最好还是要有if判断或者是基本排除光标,这个基本没有用。在写BDC程序的时候,最好自己要对这个t-code的不同条件下会有不一样的屏幕显示有一定的了解,然后写程序的时候一定要注意使用if语句,去判断在这个公司代码下,这个屏幕有没有这个字段。

3.LOOP里面过账完,要记得清BDCDATA,和BDCMESSAGE(这个就是低级错误了)

4.

过账完了,生产的message里面,提取凭证号:

       LOOP AT L_BDCMSG.

      CALL FUNCTION 'MESSAGE_TEXT_BUILD'

        EXPORTING

          msgid               = L_BDCMSG-MSGID

          msgnr               = L_BDCMSG-MSGNR

          msgv1               = L_BDCMSG-MSGV1

          msgv2               = L_BDCMSG-MSGV2

          msgv3               = L_BDCMSG-MSGV3

          msgv4               = L_BDCMSG-MSGV4

        IMPORTING

          message_text_output = WA_LOG-MSG.

其中,L_BDCMSG-MSGV1就是返回的凭证号!

5.

一个FB60的BDC程序,有些成功并返回了凭证号,有些成功生成了凭证号,但是没有返回message。

     reason:这种问题通常是一些增强导致。

     方法:在S   F5  312 message前面设断点,然后跑N模式,查看没有返回凭证号的情况,是在前面那里跳出了而没有跑这个312的message。通常都是增强导致。(遇到一个是增强里面的更新表,然后commit work的时候直接跳出了,但是实际表已经更新成功了。因为modify是不需要commit work的。因为通过call transaction FB60的话,里面有个选项opt,通过这个选项可以选择执行commit work是否跳出。这也就是为什么FB60直接跑这段,即使有commit work也没有问题,但是通过call transaction会有问题。)

转自: 

6.可以把返回的消息转成BAPIRETURN内表

CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'

    TABLES

      imt_bdcmsgcoll = L_BDCMSG

      ext_return     = it_return.

  REFRESH bdcdata.

LOOP AT it_return WHERE type  CA 'AEX'.  只要有一个字符包含就是失败报错了

    cs_ret-type = 'E'.

    cs_ret-message = it_return-message && cs_ret-message.

ENDLOOP.

IF cs_ret-type  IS INITIAL.
成功
  ELSE.

失败

  ENDIF.

你可能感兴趣的:(ABAP,abap,开发语言,经验分享)