1、增强需求
(1)销售订单交货后,在用 VF04 进行单个或合并开票时,携带客户简称(KNA1-SORTL)及交货增强信息中的报关发票号(ZTLIKP-ZBLNO)到财务凭证的项目文本字段(MSEG-SGTXT)中。
(2)携带销售凭证上的客户参考(VBKD-BSTKD)到财务凭证的增强字段合同号(MSEG-ZZFI001)中。
2、增强查找
2.1、查找增强点
执行TCODE:SE38,执行自定义程序:Z_FIND_ENHANCEMENT
通过单击,进入SMOD查看具体增强说明。
2.2、查看增强
通过 SMOD 查看增强组件:
(1)SDVFX004,用户出口:总分类帐行(传输到财务会计)
双击查看具体函数结构
输入参数及结构:
输出参数:
实测,对凭证行项目起作用,每个凭证有多少(H贷方)行项目就会被调用多少次。
(2)SDVFX008,用户退出:转移结构SD-FI的处理
入参结构:
表参数:
实测,对凭证行项目起作用,合并开票时,有多少个交货单就会被调用多少次。
3、增强实现
3.1、创建增强项目
执行TCODE:CMOD,创建项目: ZEH001
3.2、添加增强
说明:一个增强只能出现在一个增强项目中,不能重复。
此时,增强组件尚未实施,显示未激活红灯图标
双击功能出口,函数名,进入函数体
双击INCLUDE,提示该程序系统已预留,不能创建该程序。
3.3、实现增强
点击 显示对象列表 按钮,展开左侧包含目录,找到 ZXVVFU04
在对应INCLUDE程序名上,右击,创建
创建对象
保存激活,返回,显示已实施绿勾。
同理,实施第二个功能出口函数。
具体增强代码如下:
*&---------------------------------------------------------------------*
*& 包含 ZXVVFU04
*&---------------------------------------------------------------------*
BREAK XLEVON.
***** 以下代码仅对凭证 H贷方行项目起作用 *****
* 说明:此处的代码逻辑,也可以放到 ZXVVFU08 里实现,对应 XACCIT[] 中 KUNNR 为空的行
* 1、获取凭证抬头:客户简称 报关发票号
SELECT SINGLE SORTL
INTO @DATA(LV_SORTL)
FROM KNA1
WHERE KUNNR = @VBRK-KUNRG.
SELECT SINGLE ZBLNO
INTO @DATA(LV_ZBLNO)
FROM ZTLIKP
WHERE VBELN = @XVBRP-VGBEL.
CONCATENATE LV_SORTL LV_ZBLNO INTO DATA(LV_TEXT) SEPARATED BY SPACE.
XACCIT-SGTXT = LV_TEXT.
" 2、获取销售订单上的合同号
SELECT SINGLE BSTKD
INTO @DATA(LV_BSTKD)
FROM VBKD
WHERE VBELN = @XVBRP-AUBEL AND POSNR = ''.
XACCIT-ZZFI001 = LV_BSTKD.
***** 以上代码仅对凭证 H贷方行项目起作用 *****
*&---------------------------------------------------------------------*
*& 包含 ZXVVFU08
*&---------------------------------------------------------------------*
BREAK XLEVON.
***** 以下代码更新S借方行项目 *****
* 说明:去掉 where KUNNR IS NOT INITIAL 则对凭证借贷方行项目都执行,此处结合 ZXVVFU04 进行
LOOP AT XACCIT[] ASSIGNING FIELD-SYMBOL(<FS_XACCIT>) where KUNNR IS NOT INITIAL. " 对应凭证 S借方
READ TABLE CVBRP INTO DATA(LS_CVBRP) WITH KEY VBELN = DOC_NUMBER.
IF SY-SUBRC = 0.
" 1、获取凭证抬头:客户简称 报关发票号
SELECT SINGLE SORTL
INTO @DATA(LV_SORTL)
FROM KNA1
WHERE KUNNR = @CVBRK-KUNRG.
SELECT SINGLE ZBLNO
INTO @DATA(LV_ZBLNO)
FROM ZTLIKP
WHERE VBELN = @LS_CVBRP-VGBEL.
CONCATENATE LV_SORTL LV_ZBLNO INTO DATA(LV_TEXT) SEPARATED BY SPACE.
<FS_XACCIT>-SGTXT = LV_TEXT.
" 2、获取销售订单上的合同号
SELECT SINGLE BSTKD
INTO @DATA(LV_BSTKD)
FROM VBKD
WHERE VBELN = @LS_CVBRP-AUBEL AND POSNR = ''.
<FS_XACCIT>-ZZFI001 = LV_BSTKD.
ENDIF.
ENDLOOP.
***** 以上代码更新S借方行项目 *****
3.4、激活项目
此时,增强组件已实施,显示已激活绿灯图标。
4、注意事项
原来X得实施的代码,存在bug,因为当合并多单开票时,该出口会被调用多次,XACCIT是每一单对应的凭证信息,但其中的CVBRP为对应合并的多单开票信息。故不能以CVBRP为循环依据。
*&---------------------------------------------------------------------*
*& 包含 ZXVVFU08
*&---------------------------------------------------------------------*
DATA: LV_TEXT TYPE STRING.
SELECT SINGLE SORTL
INTO @DATA(LV_SORTL)
FROM KNA1
WHERE KUNNR = @CVBRK-KUNRG. " 合并开票时,会取到最后一单的
SELECT SINGLE ZBLNO
INTO @DATA(LV_ZBLNO)
FROM ZTLIKP
WHERE VBELN = @CVBRP-VGBEL. " 合并开票时,会取到最后一单的
CLEAR LV_TEXT.
CONCATENATE LV_SORTL LV_ZBLNO INTO LV_TEXT SEPARATED BY SPACE.
"项目文本
LOOP AT XACCIT[] INTO DATA(LS_ACCIT).
LS_ACCIT-SGTXT = LV_TEXT.
MODIFY XACCIT[] FROM LS_ACCIT TRANSPORTING SGTXT.
ENDLOOP.
LOOP AT CVBRP[] INTO LY_VBRP. " 合并开票时,每单凭证都会循环多次,且会取到最后一单的对应数据
"合同号替代
SELECT SINGLE
BSTKD
INTO @DATA(LV_BSTKD)
FROM VBKD
WHERE VBELN = @LY_VBRP-AUBEL
AND POSNR = ''.
IF LV_BSTKD IS NOT INITIAL.
LOOP AT XACCIT INTO LS_ACCIT WHERE KUNNR IS NOT INITIAL .
LS_ACCIT-ZZFI001 = LV_BSTKD.
MODIFY XACCIT FROM LS_ACCIT.
CLEAR LS_ACCIT.
ENDLOOP.
ENDIF.
ENDLOOP.