BDC学习案例---OA接口传参数,创建采购配额(粗略版)

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.

重要关注点:这一部分代码是属于提交的部分的

  1. MODE ‘N’"A是前台执行,N是后台执行,调试的时候需要设置成A,这样才知道那里报错
  2. 要看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程序的执行是如何执行的,要明白这个的执行过程(后续要做的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值