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(<fs_ZHRS_CREATE_COST_CENTER>).
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' <FS_ZHRS_CREATE_COST_CENTER>-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' <FS_ZHRS_CREATE_COST_CENTER>-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' <FS_ZHRS_CREATE_COST_CENTER>-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' <FS_ZHRS_CREATE_COST_CENTER>-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' <FS_ZHRS_CREATE_COST_CENTER>-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(<FS_MES>) WITH KEY MSGTYP = 'E'.
IF SY-SUBRC EQ 0.
<FS_ZHRS_CREATE_COST_CENTER>-TYPE = <FS_MES>-MSGTYP.
MESSAGE ID <FS_MES>-MSGID TYPE <FS_MES>-MSGTYP NUMBER <FS_MES>-MSGNR
WITH <FS_MES>-MSGV1 <FS_MES>-MSGV2 <FS_MES>-MSGV3 <FS_MES>-MSGV4
INTO <FS_ZHRS_CREATE_COST_CENTER>-MESSAGE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
<FS_ZHRS_CREATE_COST_CENTER>-TYPE = 'S'.
<FS_ZHRS_CREATE_COST_CENTER>-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在录屏的时候,有些情境会出现弹出选择框,让你选择是和否。此时这里勾选,并且OPT-NOBINPT = 'X'这个值设置为X。
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会有问题。)
转自: <ABAP (转)BDC常见问题_yiyuzz的博客-CSDN博客_abap bdc注意点>
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.