转自:http://blog.vsharing.com/MilesForce/A638984.html

问题的提出:

很多企业在晚上运行后台作业来开具到期发票。问题是这些自动运行的到期清单,是以怎样的逻辑被拆分、合并的?本文档将解释标准系统的工作逻辑并提供事例来说明怎样对标准逻辑作自定义增强。

发票(Billing Documents)是用功能函数RV_INVOICE_CREATE来创建的,这个函数将被VF01/SAPMV60A、VF04/SDBILLDL等事务码调用。在此函数运行之前,会有一个内含一条或者多条数据的内表传入。这些数据将以客户、销售组织、开票类型等字段排序,排序的结果是这些数据被分成了几个小组。对每一个小组,系统逻辑试图合并他们从而开除一张发票。在发票创建的过程中,系统将从上述内表中提取出抬头和行项目数据,填充至带开票的内存数据中。

r3中包含了一种用于数据传输控制的可配置的函数逻辑(Routines),叫Data Transfer Routine,它可以更改数据从源凭证到目的凭证的传递方式。本例中将对发票凭证进行讨论。

一旦待开票的数据(内存数据)被填充,系统逻辑将循环对照次行数据与前行数据,如果基本字段一致,两者将被合并。如果不同,新的发票将被创建。发票里有几个特殊的字段,他们不能作为拆分依据。下一节将说明标准合并规则(Standard Combination Criteria),里面列举了这些不能作为拆分依局的字段。

标准合并规则(Standard Combination Criteria)

程序SAPMV60A/MV60ATOP中,有如下定义:

DATA: BEGIN OF AUSNAHME_TAB,
        FELD1(5)  VALUE 'VBELN',
        FELD2(5)  VALUE 'NETWR',
        FELD3(5)  VALUE 'KNUMV',
        FELD4(5)  VALUE 'VBELN',
        FELD5(5)  VALUE 'ERNAM',
        FELD6(5)  VALUE 'ERDAT',
        FELD7(5)  VALUE 'ERZET',
        FELD8(5)  VALUE 'AEDAT',
        FELD9(5)  VALUE 'BELNR',
        FELD10(5) VALUE 'RFBSK',
        FELD12(5) VALUE 'SFAKN',
        FELD13(5) VALUE 'MWSBK',
        FELD14(5) VALUE 'FKTYP',
      END OF AUSNAHME_TAB.

存在于AUSNAHME_TAB结构中的字段将不会作为拆分依据。具体判断逻辑在函数SPLIT_TREE_LIST_DISPLAY、子例程SPLIT_EXAMINE中:

IF I_HEADER_EXCEPTION_FIELDS NS GT_HEADER_NAMETAB-FIELDNAME.
          GT_HEADER_FIELD_SPLIT-VBELN_F  = LS_VBRK_F-VBELN.
          GT_HEADER_FIELD_SPLIT-VBELN_S  = LS_VBRK_S-VBELN.
          GT_HEADER_FIELD_SPLIT-FIELD    = GT_HEADER_NAMETAB-FIELDTEXT.
          GT_HEADER_FIELD_SPLIT-VALUE_F  = .
          GT_HEADER_FIELD_SPLIT-VALUE_S  = .
          APPEND GT_HEADER_FIELD_SPLIT.
        ENDIF.

数据传输例程(Data Transfer Routine)

正确的控制合并和拆分的方法是采用数据传输例程(Data Transfer Routines)。数据传输例程的主要目的是将前导文件数据传到待创建的后续文件的内存结构中。我们可以在VOFM中找到系统标准的例程。

在VOFM里定义自己的逻辑后,再在发票拷贝关系(TCode:VTFL)中分配给相关的单据。

1、强制拆分

在发票抬头中有一个用来强制拆分开票的特殊字段:VBRK-ZUKRI。如001例程中,SPART字段和VTWEG字段分别代表产品组合分销渠道。所以,001例程的含义就是,不同的产品组、不同的分销渠道,要出具不同的发票!

FORM. DATEN_KOPIEREN_900.
  DATA: BEGIN OF ZUK,
          MODUL(3) VALUE '001',
          VTWEG LIKE VBAK-VTWEG,
          SPART LIKE VBAK-SPART,
          WERKS LIKE LIPS-WERKS,
        END OF ZUK.
  ZUK-SPART = VBAK-SPART.
  ZUK-VTWEG = VBAK-VTWEG.
  ZUK-WERKS = LIPS-WERKS. ‘新增工厂控制
  VBRK-ZUKRI = ZUK.
ENDFORM.

如果新增一行对工厂的限制(ZUK-WERKS = LIPS-WERKS),那么不同的工厂也要开出不同的发票。

2、阻止拆分

为了阻止拆分,可以将影响拆分的字段设置成相同的内容。例如,两个含有不同装运条件的交货单将被拆分开票,因为装运条件被拷贝到了发票抬头(VBRK)中。如果这个字段被清空了,那么拆分将不再发生。示例例程如下:

FORM. DATEN_KOPIEREN_900.
  DATA: BEGIN OF ZUK,
          MODUL(3) VALUE '001',
          VTWEG LIKE VBAK-VTWEG,
          SPART LIKE VBAK-SPART,
        END OF ZUK.
  ZUK-SPART = VBAK-SPART.
  ZUK-VTWEG = VBAK-VTWEG.
  VBRK-ZUKRI = ZUK.
  CLEAR VBRK-VSBED. ‘ 清空装运条件字段
ENDFORM.

新增一行:Clear VBRK-VSBED清空发票抬头(内存临时数据)的装运条件字段。激活后分配给到发票的复制控制,开票时,装运条件不再作为拆分依据了。

3、用自定义字段合并、拆分

如果客户每天发生多笔业务,那么每天就会有很多发货过账和发票。有些客户希望同一天同一个工厂开具一张发票,另一些客户希望为每一笔到达货物出具发票。

为满足上述需求,我们将创建一个自定义的数据传输例程,此例程基于一个自定义的客户数据字段(例如KNA1-KATR7)来决定交货单是否应该被合并或拆分到发票。为了实现它,订单号码将被添加到VBRK-ZUKRI字段中。

(1)本例中将使用KNA1-KATR7,将其描述更改为“Consolidated Invoice”。
(2)在SM30中,定义KATR7只允许有2个值:“”代表拆分、“X”代表合并。
(3)使KATR7字段在数据传输例程中生效。将KATR7添加到结构KUAGV中的字结构KUAGVZ中,激活。
(4)在数据传输例程中添加如下代码:

FORM. DATEN_KOPIEREN_900.
  DATA: BEGIN OF ZUK,
          MODUL(3) VALUE '001',
          VTWEG LIKE VBAK-VTWEG,
          SPART LIKE VBAK-SPART,
          WERKS LIKE LIPS-WERKS,
          VBELN LIKE VBAK-VBELN,
        END OF ZUK.
  ZUK-SPART = VBAK-SPART.
  ZUK-VTWEG = VBAK-VTWEG.
  ZUK-WERKS = LIPS-WERKS. ‘新增工厂控制
  IF VBAK-KATR7 IS INITIAL.
    ZUK-VBELN = VBAK-VBELN.
  ENDIF.
  VBRK-ZUKRI = ZUK.
ENDFORM.

如果在客户数据中维护了客户组7(KNA1-KATR7)为“X”,将集中出具发票。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16382943/viewspace-611073/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16382943/viewspace-611073/

VOFM、Copy Control与合并开票 (ZT)相关推荐

  1. VOFM、Copy Control与合并开票

    问题的提出: 很多企业在晚上运行后台作业来开具到期发票.问题是这些自动运行的到期清单,是以怎样的逻辑被拆分.合并的?本文档将解释标准系统的工作逻辑并提供事例来说明怎样对标准逻辑作自定义增强. 发票(B ...

  2. C/C++:copy control (拷贝控制)

    前言:当定义一个类的时候,我们显示或者隐式地指定在此类型的对象拷贝,移动,赋值,销毁时做些什么,一个类通过定义五种特殊的成员函数来控制这些操作,包括拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值 ...

  3. 海康网络摄像头忘记密码_不要忘记网络性能

    海康网络摄像头忘记密码 Amazon released a famous statement in the late 2000s stating that every hundred millisec ...

  4. NetSuite合并采购开票

    今朝介绍一下合并"开票"的业务场景. 合并"开票"有两个,一个是供应商端的合并Vendor Bill,一个是客户端的合并Invoice.我们今天讲前者,后者可以 ...

  5. 销售订单按交货单合并Billing

    Tcode:VTFL 路径:Spro-销售和分销-出具发票-开票凭证-维护开票的复制控制-交货凭证到出具发票凭证. 选F2发票(LF外向交货)-项目,选择相应项目类别,数据 VBRK/VBRP选为00 ...

  6. ORACLE ERP的词汇表(ZT)

    A account hierarchy(帐户分层结构) Oracle 财务系统的一种特性,您可以用来执行汇总层资金检查.采用帐户分层结构,Oracle 采购管理系统和总帐管理系统可以快速确定明细帐户累 ...

  7. 手机快播的多!mv文件合并软件工具

    使用手机快播看完视频后,在p2pcache目录下形成若干个扩展名为!mv结尾的10M大小的文件,可以使用DOS的copy /b命令合并它们,但合并时有顺序问题(经验证并不是简单的按字典排序方式进行的) ...

  8. SAP 开票类型的确定

    今天遇到一个实际问题,销售订单类型都是一样的,默认的开票类型却不一样,Key user在开票时不得不手动再选择一下开票类型,才能保证开票类型的一致.那么,是什么原因导致的呢?按照正常的逻辑,开票类型是 ...

  9. XenServer中Fast Copy与Full Copy的区别

    详细跟踪了一下LVM-Based VDI与File-Based VDI的复制与链接过程,我们可以发现,Fast Copy与Full Copy有很大的区别,不同的形式对虚机VBD的性能具有一定的影响. ...

最新文章

  1. svn: Can't find a temporary directory 问题解决
  2. ThreadLocal父子线程传递实现方案
  3. Ubuntu下如何将普通用户提升到root权限
  4. 计算机视觉中 RNN 应用于目标检测
  5. JavaMail操作的总结(1)
  6. iOS开发 - ARC的开启与关闭
  7. 关联规则算法Apriori的学习与实现
  8. 详解C++ friend关键字
  9. 搭建mqtt服务器apollo
  10. Linu下建立svn版本库
  11. ArcGIS对tiff文件进行重分类
  12. 直播APP源码开发,直播APP源码搭建,如何优化程序?
  13. PSpice应用B-4
  14. 在线DES加密解密、DES在线加密解密、DES encryption and decryption
  15. VMware如何开机自动启动虚拟机也启动
  16. Redis持久化、备份:RDB和AOF
  17. Eggjs笔记:详解Mongoose的聚合管道以及populate实现关联查询
  18. python笔试题110题_吐血整理:110道python面试题(带答案)
  19. 计算机专业学单片机有用吗,“智能”占领电脑时代,当今为什么要学习单片机?...
  20. 移动互联网广告 全媒体广告平台怎么代理 利润点有多少

热门文章

  1. AMC16Z和AMC100数据中心集中监控多回路监控装置有哪些应用?
  2. RecurDyn在PNet二次开发Run时所遇到的异常
  3. 深圳南山科技园一公司年终发10台高尔夫奖优秀员工
  4. 烤仔观察 | Beeple 的局中局中局
  5. linux 文件编辑器,用于Linux的文本编辑器(除了Vi)?
  6. ansible 自动化运维工具——ansible Ad-Hoc 使用
  7. 【自用】simetrix/simplis使用体验及问题分析(2)
  8. 北斗三代卫星编号和发射数据
  9. 13个UI设计软件,一次满足你的UI设计需求
  10. C# 用 iTextSharp 将 PDF 转成文本的代码