1.BDC怎么用!!–输入SHDB事务代码
2.点击新建记录
3.填写信息,开始录制
4.录制完成之后,点击保存
5.保存好之后,返回可以看到有一个记录明细在里面,选中需要变更的一行,点击程序,并输入程序名称
6.填写相关数据之后,点击源代码
7.打开源代码之后,我们需要的内容只有DO 循环里面的部分,把子例程一并拷贝过去,即可使用,如:
perform bdc_dynpro
perform bdc_field
perform bdc_transaction
这类的子例程
8.此时,BDC循环部分的代码,我们得到了,接下来,我们就要做OA调用BDC的内容了
FUNCTION zrfc_mm_meq1.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" IT_EQUKU STRUCTURE EQUKU
*" IT_UEQUP STRUCTURE UEQUP
*" IT_EQUKU_1 STRUCTURE EQUKU
*" IT_UEQUP_1 STRUCTURE UEQUP
*" RETURN STRUCTURE ZRFC_RETURN_MESSAGE
*"----------------------------------------------------------------------
"用于OA流程--供应商物料报价审批汇总单,报价类型为新品且为独家供货调用产生100%配额
INCLUDE zgen_bc_x_fmlog_first_phase.
TABLES :equk.
DATA : iw_equku TYPE equku.
DATA: iw_uequp TYPE uequp.
DATA : it_equk TYPE TABLE OF equk.
DATA: iw_uequp-quote_c TYPE c LENGTH 3."用于类型的强制转换
CLEAR:iw_equku.
* READ TABLE it_xequk INTO iw_equk.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
* EXPORTING
* input = iw_equk-matnr
* IMPORTING
* output = iw_equk-matnr.
LOOP AT it_equku INTO iw_equku.
READ TABLE it_uequp INTO iw_uequp INDEX sy-tabix.
SELECT * INTO CORRESPONDING FIELDS OF TABLE it_equk FROM equk WHERE matnr = iw_equku-matnr AND werks = iw_equku-werks.
IF sy-subrc = 0.
DELETE it_equku INDEX sy-tabix.
DELETE it_uequp INDEX sy-tabix.
ELSE.
ENDIF.
IF it_equku IS NOT INITIAL.
iw_uequp-quote_c = iw_uequp-quote."用于类型的强制转换
PERFORM bdc_dynpro USING 'SAPDM06Q' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EQUK-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=KOPF'.
PERFORM bdc_field USING 'EQUK-MATNR'
iw_equku-matnr.
PERFORM bdc_field USING 'EQUK-WERKS'
iw_equku-werks.
PERFORM bdc_dynpro USING 'SAPDM06Q' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EQUK-SCMNG(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=POSI'.
PERFORM bdc_field USING 'EQUK-BDATU(01)'
iw_equku-bdatu..
PERFORM bdc_dynpro USING 'SAPDM06Q' '0215'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EQUP-QUOTE(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EQUP-BESKZ(01)'
iw_uequp-beskz.
PERFORM bdc_field USING 'EQUP-LIFNR(01)'
iw_uequp-lifnr.
PERFORM bdc_field USING 'EQUP-QUOTE(01)'
iw_uequp-quote_c.
PERFORM bdc_dynpro USING 'SAPDM06Q' '0215'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EQUP-QUOTE(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
PERFORM bdc_transaction USING 'MEQ1'.
ELSE.
return-type = 'E'.
return-message = '配额已经存在!'.
APPEND return TO return[].
ENDIF.
ENDLOOP.
INCLUDE zgen_bc_x_fmlog_last_phase.
ENDFUNCTION.
DATA:session TYPE c VALUE 'X'.
DATA :smalllog TYPE c VALUE 'X'.
* Batchinputdata of single transaction
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
* messages of call transaction
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
* error session opened (' ' or 'X')
DATA: e_group_opened.
* message texts
TABLES: t100.
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
* IF FVAL <> NODATA.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
* ENDIF.
ENDFORM.
FORM bdc_transaction USING tcode.
DATA: l_mstring(480).
DATA: l_subrc LIKE sy-subrc.
DATA: lx_auth_check TYPE REF TO cx_root.
DATA: l_auth_check_text TYPE string.
* batch input session
IF session <> 'X'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = tcode
TABLES
dynprotab = bdcdata[].
IF smalllog <> 'X'.
WRITE: / 'BDC_INSERT'(i03),
tcode,
'returncode:'(i05),
sy-subrc,
'RECORD:',
sy-index.
ENDIF.
* call transaction using
ELSE.
REFRESH messtab.
TRY.
CALL TRANSACTION tcode WITH AUTHORITY-CHECK USING bdcdata[]
MODE 'N'"A是前台执行,N是后台执行
UPDATE 'B'
MESSAGES INTO messtab.
CATCH cx_sy_authorization_error INTO lx_auth_check.
* Authorization missing for user when executing transaction
l_auth_check_text = lx_auth_check->get_text( ).
sy-subrc = 99.
ENDTRY.
l_subrc = sy-subrc.
IF smalllog <> 'X'.
WRITE: / 'CALL_TRANSACTION',
tcode,
'returncode:'(i05),
l_subrc,
'RECORD:',
sy-index.
IF l_subrc <> 99.
LOOP AT messtab.
MESSAGE ID messtab-msgid
TYPE messtab-msgtyp
NUMBER messtab-msgnr
INTO l_mstring
WITH messtab-msgv1
messtab-msgv2
messtab-msgv3
messtab-msgv4.
WRITE: / messtab-msgtyp, l_mstring(250).
ENDLOOP.
ELSE.
WRITE: / l_auth_check_text.
ENDIF.
SKIP.
ENDIF.
*** Erzeugen fehlermappe ************************************************
* IF L_SUBRC <> 0 AND L_SUBRC <> 99 AND E_GROUP <> SPACE.
* IF E_GROUP_OPENED = ' '.
* CALL FUNCTION 'BDC_OPEN_GROUP'
* EXPORTING CLIENT = SY-MANDT
* GROUP = E_GROUP
* USER = E_USER
* KEEP = E_KEEP
* HOLDDATE = E_HDATE.
* E_GROUP_OPENED = 'X'.
* ENDIF.
* CALL FUNCTION 'BDC_INSERT'
* EXPORTING TCODE = TCODE
* TABLES DYNPROTAB = BDCDATA.
* ENDIF.
ENDIF.
REFRESH bdcdata.
ENDFORM.
注意点:
子例程要拷贝过来,例如:缺乏的变量,子例程里面也是需要一并拷贝过来的
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
* IF FVAL <> NODATA.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
* ENDIF.
ENDFORM.
重要关注点:这一部分代码是属于提交的部分的
- MODE ‘N’"A是前台执行,N是后台执行,调试的时候需要设置成A,这样才知道那里报错
- 要看messtab表的报错内容!,例如本次的报错结果如下,那么我们就要去SE91,根据消息号码来找到对应的报错内容,来查看!
3. 打开SE91,msgid就是消息类别,输入就可查看到详细的内容
REFRESH messtab.
TRY.
CALL TRANSACTION tcode WITH AUTHORITY-CHECK USING bdcdata[]
MODE 'N'"A是前台执行,N是后台执行
UPDATE 'B'
MESSAGES INTO messtab.
CATCH cx_sy_authorization_error INTO lx_auth_check.
* Authorization missing for user when executing transaction
l_auth_check_text = lx_auth_check->get_text( ).
sy-subrc = 99.
ENDTRY.
l_subrc = sy-subrc.
IF smalllog <> 'X'.
WRITE: / 'CALL_TRANSACTION',
tcode,
'returncode:'(i05),
l_subrc,
'RECORD:',
sy-index.
IF l_subrc <> 99.
LOOP AT messtab.
MESSAGE ID messtab-msgid
TYPE messtab-msgtyp
NUMBER messtab-msgnr
INTO l_mstring
WITH messtab-msgv1
messtab-msgv2
messtab-msgv3
messtab-msgv4.
WRITE: / messtab-msgtyp, l_mstring(250).
ENDLOOP.
ELSE.
WRITE: / l_auth_check_text.
ENDIF.
SKIP.
ENDIF.
教训点:
1.BDC程序,可以设置成一步一步执行的,下次执行不成功的时候,改成一步步,查看定位的错误
2.BDC的金额/数量 一般常用char 类型 或者 STRING类型的
3.可以根据消息类的提示去SE91来查看
4.还要仔细研究BDC程序的执行是如何执行的,要明白这个的执行过程(后续要做的)