创建有WBS分配规则的生产订单

发布时间 2023-04-26 17:02:17作者: 萧静默

有时候的生产订单是需要挂WBS的,但是使用如下代码创建不了

DATA:LS_ORDERDATA TYPE BAPI_PP_ORDER_CREATE.
  DATA:ls_return         TYPE bapiret2,
       LV_ORDER_NUMBER TYPE BAPI_ORDER_KEY-ORDER_NUMBER.
  LS_ORDERDATA-MATERIAL_LONG = IS_INPUT-MATNR."物料号
  LS_ORDERDATA-PLANT = IS_INPUT-WERKS.   "工厂
  LS_ORDERDATA-ORDER_TYPE = IS_INPUT-auart.    "订单类型
  LS_ORDERDATA-QUANTITY = IS_INPUT-gamng.   " 订单数量
  LS_ORDERDATA-QUANTITY_uom = IS_INPUT-GMEIN.   "计量单位
  LS_ORDERDATA-PROD_VERSION = IS_INPUT-VERID.   "订单类型
  LS_ORDERDATA-BASIC_START_DATE = SY-DATUM ."SY-DATUM. "      基本开始日期
  LS_ORDERDATA-BASIC_END_DATE = IS_INPUT-GLTRP.           "基本结束日期
  LS_ORDERDATA-WBS_ELEMENT = IS_INPUT-PS_PSP_PNR.           "wbs
  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' "单位
       EXPORTING
         input          = iS_input-gmein
*        LANGUAGE       = SY-LANGU
       IMPORTING
         output         = LS_ORDERDATA-quantity_uom
       EXCEPTIONS
         unit_not_found = 1
         OTHERS         = 2.
     IF sy-subrc <> 0.
     ENDIF.

  CALL FUNCTION 'BAPI_PRODORD_CREATE'
    EXPORTING
      ORDERDATA    = LS_ORDERDATA
*     FSH_PRODORD_SEASON       =
    IMPORTING
      RETURN       = ls_return
      ORDER_NUMBER = LV_ORDER_NUMBER
*     ORDER_TYPE   =
    .
 IF ls_return-TYPE = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ROLLBACK WORK.
    CONCATENATE '创建生产订单报错:' ls_return-MESSAGE INTO EV_MESSAGE.
   ev_status = 'E'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
    ev_status = 'S'.
    ev_AUFNR = LV_ORDER_NUMBER.
    MOVE  '生产订单创建成功' TO EV_message.
  ENDIF.

此时想到使用录频来实现

FUNCTION ZFM_ORDER_WBS_CREATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(MATNR) TYPE  MATNR OPTIONAL
*"     VALUE(WERKS) TYPE  WERKS_D OPTIONAL
*"     VALUE(AUART) TYPE  CAUFVD-AUART OPTIONAL
*"     VALUE(GAMNG) TYPE  CAUFVD-GAMNG OPTIONAL
*"     VALUE(GMEIN) TYPE  CO_GMEIN OPTIONAL
*"     VALUE(GLTRP) TYPE  CO_GSTRP OPTIONAL
*"     VALUE(GSTRP) TYPE  CO_GSTRP OPTIONAL
*"     VALUE(ZWBS) TYPE  PS_POSID OPTIONAL
*"  TABLES
*"      TT_RETURN STRUCTURE  BAPIRET1
*"----------------------------------------------------------------------

DATA:ZUNIT TYPE LAGME.

  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' "单位
    EXPORTING
      INPUT          = GMEIN
*     LANGUAGE       = 'ZH'
    IMPORTING
      OUTPUT         = GMEIN
    EXCEPTIONS
      UNIT_NOT_FOUND = 1
      OTHERS         = 2.
  IF SY-SUBRC <> 0.
  ENDIF.

  PERFORM FRM_CREAT_WBS_ORDER TABLES TT_RETURN USING  MATNR WERKS AUART GAMNG GMEIN GLTRP GSTRP ZWBS.

ENDFUNCTION.
*----------------------------------------------------------------------*
***INCLUDE LZFM_ORDER_WBS_CREATEF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_CREAT_WBS_ORDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_TT_RETURN  text
*      -->P_MATNR  text
*      -->P_WERKS  text
*      -->P_AUART  text
*      -->P_GAMNG  text
*      -->P_GMEIN  text
*      -->P_GLTRP  text
*      -->P_GSTRP  text
*      -->P_ZWBS  text
*&---------------------------------------------------------------------*
FORM FRM_CREAT_WBS_ORDER  TABLES   P_TT_RETURN STRUCTURE GT_RETURN
                          USING    P_MATNR
                                   P_WERKS
                                   P_AUART
                                   P_GAMNG
                                   P_GMEIN
                                   P_GLTRP
                                   P_GSTRP
                                   P_ZWBS.
  DATA: ZMENGE    LIKE AFPO-PSMNG,
        FVAL2(13) TYPE C.
  DATA: LV_MES1 TYPE CHAR100.
  DATA: EV_INFNR TYPE CHAR10.
  PERFORM BDC_DYNPRO      USING 'SAPLCOKO1' '0100'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'AFPOD-PWERK'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=ENTK'.
  PERFORM BDC_FIELD       USING 'CAUFVD-MATNR'
        P_MATNR. "物料编码
  PERFORM BDC_FIELD       USING 'CAUFVD-WERKS'
        P_WERKS.    "工厂
  PERFORM BDC_FIELD       USING 'AUFPAR-PP_AUFART'
        P_AUART.    "订单类型
  PERFORM BDC_DYNPRO      USING 'SAPLCOKO1' '0115'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'CAUFVD-GSTRP'.

  PERFORM BDC_FIELD       USING 'CAUFVD-GAMNG'
        P_GAMNG.    "订单数量
  PERFORM BDC_FIELD       USING 'CAUFVD-GMEIN'
        P_GMEIN.     "订单基本单位
  PERFORM BDC_FIELD       USING 'CAUFVD-GLTRP'
        P_GLTRP.           "结束日期
  PERFORM BDC_FIELD       USING 'CAUFVD-GSTRP'
        P_GSTRP.     "开始日期
  PERFORM BDC_FIELD       USING 'CAUFVD-TERKZ'
        '2'.      "类型2向后  固定
  PERFORM BDC_FIELD       USING 'CAUFVD-FHORI'
        '000'.      "排产时间容余码  固定
  PERFORM BDC_DYNPRO      USING 'SAPLKOBS' '0130'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'DKOBR-EMPGE(02)'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD       USING 'DKOBR-EMPGE(02)'
        P_ZWBS.      "WBS
  PERFORM BDC_DYNPRO      USING 'SAPLKOBS' '0130'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'COBRB-PROZS(01)'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD       USING 'COBRB-PROZS(01)'
        '0'.     "分配比例?固定0.00
  PERFORM BDC_DYNPRO      USING 'SAPLKOBS' '0130'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'COBRB-KONTY(01)'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=BACK'.
  PERFORM BDC_DYNPRO      USING 'SAPMSSY0' '0120'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=&ONT'.
  PERFORM BDC_DYNPRO      USING 'SAPLCOKO1' '0115'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=BU'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'CAUFVD-GAMNG'.
  PERFORM BDC_FIELD       USING 'CAUFVD-GAMNG'
        P_GAMNG.
  PERFORM BDC_FIELD       USING 'CAUFVD-GLTRP'
        P_GLTRP.
  PERFORM BDC_FIELD       USING 'CAUFVD-GSTRP'
        P_GSTRP.
  PERFORM BDC_FIELD       USING 'CAUFVD-TERKZ'
        '2'.
  PERFORM BDC_FIELD       USING 'CAUFVD-FHORI'
        '000'.
*  PERFORM bdc_transaction USING 'CO01'.

  CALL TRANSACTION 'CO01' USING BDCDATA
        MODE P_MODE
        UPDATE P_UPDA
        MESSAGES INTO MESSTAB.

  LOOP AT MESSTAB WHERE MSGTYP = 'A' OR MSGTYP = 'E'.
  ENDLOOP.

  IF SY-SUBRC EQ 0.
    LOOP AT MESSTAB  WHERE MSGTYP = 'A' OR MSGTYP = 'E'.
      MESSAGE ID     MESSTAB-MSGID
      TYPE   MESSTAB-MSGTYP
      NUMBER MESSTAB-MSGNR
      INTO   LV_MES1
      WITH   MESSTAB-MSGV1 MESSTAB-MSGV2
      MESSTAB-MSGV3 MESSTAB-MSGV4.
      CLEAR:MESSTAB.
    ENDLOOP.
    TT_RETURN-TYPE = 'E'.
    TT_RETURN-MESSAGE = '创建失败!' && LV_MES1.
    APPEND TT_RETURN TO P_TT_RETURN.
    CLEAR:TT_RETURN.
  ELSE.
    LOOP AT MESSTAB WHERE MSGID = 'CO' AND MSGNR = '100'.
      EV_INFNR = MESSTAB-MSGV1+0(10).
    ENDLOOP.
    TT_RETURN-TYPE = 'S'.
    TT_RETURN-MESSAGE = '创建成功' && EV_INFNR.
    APPEND TT_RETURN TO P_TT_RETURN.
    CLEAR:TT_RETURN.
  ENDIF.

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.
  DATA: IT        LIKE AFPO-PSMNG,
        FVAL2(13) TYPE C.
  IF FNAM = 'CAUFVD-GAMNG'.
    CLEAR BDCDATA.
    BDCDATA-FNAM = FNAM.
    BDCDATA-FVAL = FVAL.
    CONDENSE BDCDATA-FVAL NO-GAPS.
    APPEND BDCDATA.
  ELSE.
    CLEAR BDCDATA.

    BDCDATA-FNAM = FNAM.
    BDCDATA-FVAL = FVAL.
    APPEND BDCDATA.
  ENDIF.
ENDFORM.

函数里有个单位转换问题:

SAP中的单位转换有时候弄的有点不顺手。在调用BDC的时候,发现了这个问题。如果输入英文单位,会提示单位在中文中没有创建。但是在表T006和T006A中均能找到此单位。可能是后台配置的问题。至今未找到在哪里可以解决这个问题。经过同事帮助,用这两个函数,解决了在调用BDC的时候出现的单位在中文中没有定义的问题,也可以解决单位显示为英文的问题。在此贴出来,希望对后来者有所帮助。 

可以通过SE37来测试。  
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
      EXPORTING
        input      =   “输入的英文单位
      IMPORTING
        output =      “输出的中文单位

还会遇到金额和数量长度问题

往往会出现错误提示:输入的字段比实际字段长。这时我们想明明输入的值和字段字义是一样的,为什么会出现这种错误提示呢?
其实这是做BDC的时候最需要注意的事,因为字段类型虽然一样,但是我们保存到BDCDaTA中的时候,数值等是按照默认长度保存的,但是我们输入的时候需要都这些多余的字符串删除掉,这时我们就需要对数据进行处理,有两种处理方法,一种就是用SHIFT移位操作删除多余的字符串,也可以通过修改子例程BDC_FIELD来实现。作者使用的是去除空格的方式。

还有如果发现不了问题,可以改BDC调试模式:

DATA:P_MODE TYPE CHAR1 VALUE 'N',
     P_UPDA TYPE CHAR1 VALUE 'L'.
*DATA:P_MODE TYPE CHAR1 VALUE 'A',  
*     P_UPDA TYPE CHAR1 VALUE 'A'.

具体可以按F1查看

Addition 1

... MODE mode

Effect

The addition MODE determines the processing mode for processing. mode can be specified as a character-like data object whose content and purpose are shown in the following table. If one of the additions MODE or OPTIONS FROM is not used, the effect is the same as if mode had the content "A".

mode Effect
"A" Processed with displayed screens
"E" Screens displayed only if an error occurs
"N" Processed without displayed screens. If a breakpoint is reached in one of the called transactions, processing is terminated with sy-subrc equal to 1001. The field sy-msgty contains "S", sy-msgid contains "00", sy-msgno contains "344", sy-msgv1 contains "SAPMSSY3", and sy-msgv2 contains "0131".
"P" Processed without displayed screens. If a breakpoint is reached in one of the called transactions, the system branches to the ABAP Debugger.
Others As for "A".


Addition 2

... UPDATE upd

Effect

The addition UPDATE determines the update mode for processing. upd can be specified as a character-like data object whose content and purpose are shown in the following table. If one of the additions UPDATE or OPTIONS FROM is not used, the effect is the same as if upd had the content "A".

upd Effect
"A" Asynchronous update. Updates of called programs are executed in the same way as if the addition AND WAIT were not specified in the statement COMMIT WORK.
"S" Synchronous update. Updates of the called programs are executed in the same way as if the addition AND WAIT were specified in the statement COMMIT WORK.
"L" Local updates. Updates of the called program are executed in the same way as if the statement SET UPDATE TASK LOCAL were executed in the program.
Others As for "A".

 

Note

This option is not available for execution of batch input sessions in batch input. Updates are always synchronous.