前言:本人曾查遍了包括SAP官网在内的大小网站来研究发票计划。发票计划是个冷门的业务,很多顾问也是第一次听说。经过两周的研究,终于把它搞明白了。
问题的根源:
VBKD-FPLNR 这个字段在做完创建完成销售订单之后不存在。即使我使用一些方法在FPLA中导入了fplnr字段,也不能得到我们想要的结果。
只有打开了如图上所示的页签,我们才可以得到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重新打开,才能映射到行项目的发票计划