销售订单发票计划导入

前言:本人曾查遍了包括SAP官网在内的大小网站来研究发票计划。发票计划是个冷门的业务,很多顾问也是第一次听说。经过两周的研究,终于把它搞明白了。
问题的根源:
VBKD-FPLNR 这个字段在做完创建完成销售订单之后不存在。即使我使用一些方法在FPLA中导入了fplnr字段,也不能得到我们想要的结果。
销售订单发票计划导入_第1张图片
只有打开了如图上所示的页签,我们才可以得到FPLNR这个字段。不然批导的时候,就会DUMP.
解决的方法:
1.根据订单号和行项目去VBKD表找FPLNR,如果有任何一个找不到,使用BDC激活抬头的发票计划页签。

*------------------------------------------------------------*
*    DESC: BDC定义
*------------------------------------------------------------*
DATA: BEGIN OF BDCDATA OCCURS 0.
  INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDCDATA.
DATA: GV_STRING TYPE STRING.
DATA: TT1(100).
DATA: TT2(100).
DATA: BDC_MESSAGE LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.

DATA:GS_DATA TYPE VBAK,
      GT_DATA TYPE TABLE OF VBAK.
DATA:W_MESSAGE TYPE STRING.

DATA : L_MESSAGE LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
PERFORM FRM_BDC_VA02 USING GS_VBAP_COPY."参数传订单号即可
FORM FRM_BDC_VA02 USING ES_DATA LIKE GS_VBAP.
*               CHANGING " ev_mes TYPE zfi_bank_info-msg
*                         ev_msgst.
  DATA : V_MODE TYPE C VALUE 'E'.
  DATA: LS_BDCOPT TYPE  CTU_PARAMS.
  REFRESH:BDC_MESSAGE, BDCDATA.
  PERFORM  FRM_PROCESS_VA02  USING ES_DATA.
  LS_BDCOPT-DISMODE = 'E'.  " A 前台显示 E 出错显示 N 后台显示 P
  LS_BDCOPT-UPDMODE = 'S'.
  LS_BDCOPT-CATTMODE = 'A'.

  LS_BDCOPT-RACOMMIT = 'X'.
  LS_BDCOPT-NOBIEND = 'X'.
  CALL TRANSACTION 'VA02' USING BDCDATA OPTIONS FROM LS_BDCOPT MESSAGES INTO BDC_MESSAGE   .

  PERFORM GENERATE_MESSAGE CHANGING ES_DATA.

ENDFORM.
FORM FRM_PROCESS_VA02 USING IS_DATA LIKE GS_VBAP .
  " LOOP AT gt_data INTO gs_data.
***  修改凭证抬头文本
  PERFORM BDC_DYNPRO      USING 'SAPMV45A' '0102'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'VBAK-VBELN'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=ENT2'.
  PERFORM BDC_FIELD       USING 'VBAK-VBELN'
        IS_DATA-VBELN."record-VBELN_001.
  PERFORM BDC_DYNPRO      USING 'SAPMV45A' '4001'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=HEAD'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'RV45A-MABNR(02)'.
  PERFORM BDC_DYNPRO      USING 'SAPMV45A' '4002'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=T\05'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'VBAK-AUDAT'.
  PERFORM BDC_DYNPRO      USING 'SAPLCNMS' '1300'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'MLSTS-AUFNR'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=GO'.

  PERFORM BDC_DYNPRO      USING 'SAPLV60F' '4001'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=S\BACK'.
  PERFORM BDC_DYNPRO      USING 'SAPMV45A' '4001'.
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'
        'RV45A-MABNR(02)'.
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'
        '=S\SICH'.

ENDFORM.
*  BDC 消息
FORM GENERATE_MESSAGE CHANGING ES_DATA LIKE GS_VBAP.

  DATA:GT_MSG        LIKE TABLE OF BDCMSGCOLL,
       LT_BAPIRETURN LIKE TABLE OF BAPIRET2.

  IF SY-SUBRC = 0.
    CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
      TABLES
        IMT_BDCMSGCOLL = GT_MSG
        EXT_RETURN     = LT_BAPIRETURN.

  ELSE.

*    MESSAGE '出错了!!!' TYPE 'I'.
    ES_DATA-MESTY = '发票计划页签由于数据问题未激活!' .
  ENDIF.

ENDFORM. " generate_message

FORM BDC_DYNPRO USING PROGRAM DYNPRO.
  CLEAR BDCDATA.
  BDCDATA-PROGRAM  = PROGRAM.
  BDCDATA-DYNPRO   = DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM. "BDC_DYNPRO

FORM BDC_FIELD USING FNAM FVAL.
  CLEAR BDCDATA.
  BDCDATA-FNAM = FNAM.
  BDCDATA-FVAL = FVAL.
  APPEND BDCDATA.
ENDFORM.

2.此时fplnr已经生成,常规方法导入即可
CALL FUNCTION ‘SD_VBKD_READ_WITH_VBELN’
CALL FUNCTION ‘BILLING_SCHEDULE_READ’
CALL FUNCTION ‘BILLING_SCHEDULE_SAVE’
COMMIT WORK AND WAIT.

2022-04-03更新
发票计划的导入全部用BDC导入,因为导入发票计划之后还需要VA02打开,确保各个表都能写入。
举个例子,导入抬头的发票计划,行项目只有VA02重新打开,才能映射到行项目的发票计划

你可能感兴趣的:(ABAP基础开发,abap,sap)