【SAP Abap】记录一次增强开发之销售交货开票VF04增强

ABAP 0 次阅读
【SAP Abap】记录一次增强开发之销售交货开票VF04增强

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.