转一个关于VOFM的文章

 

转自:http://blog.imalex.net/2007/09/28/abap-%e4%be%8b%e7%a8%8b-%e4%bc%a0%e8%be%93-%e6%97%a0%e6%b3%95%e6%bf%80%e6%b4%bb/

问题描述

SAP ERP 实施中,经常会用到例程开发(TCODE:VOFM)。创建例程需要ACCESS KEY,这个可以通过申请得到,创建后例程会被包含在一个REQUEST下,例程创建之后还不能马上使用,需要激活,如图所示。

否则无法正常使用。

REQUEST释放后可以传输到目标系统,但是问题就出现在传输。如果只是传输,是无法正常使用的。这是SAP的一个BUG。要了解这个BUG,先要了解SAP例程的工作原理。

例程工作原理

例程,即Fomula,是使用在销售、采购、发票、交货等单据中定价过程的一小段程序。之所以有Fomula存在,是因为在不同的业务场景下,定价过程可能千差万别,但是却可以拆分为一些关键的组成部分,如复制请求、数据传输、要求、公式,每个例程就是一小段专用程序,这些例程程序会被标准程序动态调用:如:PERFORM XXX IN XXXX IF FOUND. 我们可以在例程中编写代码片段,修改运行环境中的数据。具体的每种例程都有不同的环境变量和接口数据,在此就不详细说明了。

创建例程的过程,实际上是做了以下几件事,我们以要求–定价–998例程为例说明

1 创建了程序:RV61A998,改程序可通过SE38查看

2 在表TFRM、TFRMT中添加数据,记录创建的例程编号等信息

3 激活例程时,RV61A998被INCLUDE 在RV61ANNN,即在RV61ANNN中添加一行:INCLUDE RV61A998.

下面解释下传输后无法正常使用

CHANGE REQUEST释放后传输,1、2两步可以正常完成,但是第三步,虽然在目标系统中激活了,但是未能INCLUDE在RV61ANNN程序中,因此定价过程配置好之后,会出现ABAP DUMP.

解决方法:在目标系统中运行程序:RV80HGEN即可修复BUG,而不需要在目标系统中通过VOFM激活例程。该程序的作用是根据表TFRM,TFRMT在RV61ANNN等程序中增加INCLUDE RV61A998这样的代码,如此才能正常运行。具体见Notes:28683

<think>我们正在处理一个SD VOFM配置问题:将开票单据中的物料编号复制到财务凭证中。 在SAP SD中,VOFM(条件技术)用于配置定价和输出等,但这里我们关注的是如何将数据从开票单据传递到财务凭证(FI Document)。 通常,在开票(Billing)时,系统会生成财务凭证(FI Document)。我们希望将开票单据中的物料号(Material Number)传递到FI凭证的行项目字段中,比如分配到字段(Assignment Field, BSEG-ZUONR)或文本字段(BSEG-SGTXT)等。 实现这一需求通常有两种方法: 1. 使用VOFM的例程(Routine)在开票时触发,将物料号写入到财务凭证的某个字段。 2. 使用用户出口(User Exit)或BAdI(Business Add-In)来实现。 由于问题明确提到SD VOFM配置,我们重点讨论第一种方法:使用VOFM的复制需求(Copying Requirements)。 在SD模块中,复制需求(VOFM)用于控制从销售凭证到开票凭证的数据复制。但是,将数据从开票凭证传递到财务凭证,我们需要在开票凭证到财务凭证的传递过程中进行配置。 具体步骤: 步骤1:确定财务凭证中要填充的字段。例如,我们可能希望将物料号放入BSEG-ZUONR(分配字段)或BSEG-SGTXT(项目文本)中。 步骤2:在VOFM中创建复制需求(Copying Requirements): - 事务代码:VOFM - 选择“复制需求”(Copying Requirements)->“需求:凭证到凭证”(Requirement: Document to Document) - 创建新的需求(例如,需求编号9xx,其中xx是自定义编号) 步骤3:编写例程(ABAP代码)来将开票凭证中的物料号传递到财务凭证的字段。 - 在例程中,我们可以访问开票凭证的数据(如VBRP表,因为开票凭证行项目存储在VBRP中)。 - 然后,我们需要将物料号(VBRP-MATNR)传递给财务凭证的字段。财务凭证的字段在结构RV60A(用于开票凭证的传递结构)中可用,例如,RV60A-ZUONR(对应BSEG-ZUONR)或RV60A-SGTXT(对应BSEG-SGTXT)。 步骤4:将创建的需求分配给开票类型(Billing Type)的复制控制(Copy Control)中。 详细步骤: 1. **创建需求(Requirement)**: - 事务代码:VOFM - 菜单:需求 -> 凭证到凭证(Requirement -> Document to Document) - 点击“需求”(Requirement)按钮,然后新建(New Entries)。 - 输入一个编号(如900),并输入描述(例如:复制物料号到FI凭证)。 - 双击该行,进入ABAP编辑器,编写代码。 2. **编写例程**: 在例程中,我们需要将开票凭证行项目中的物料号(VBRP-MATNR)赋值给传递结构RV60A的相应字段(例如RV60A-ZUONR或RV60A-SGTXT)。 注意:RV60A是开票凭证传递到财务凭证的结构。在例程中,我们可以修改RV60A的字段。 示例代码(假设我们复制到分配字段ZUONR): ```abap FORM FRM_KODI_900. * 检查当前处理的是开票凭证行项目(VBRP) * 在凭证到凭证的复制需求中,系统会为每个行项目调用该例程 * 我们可以通过VBRP表获取当前行项目的物料号 DATA: lv_matnr TYPE VBRP-MATNR. lv_matnr = VBRP-MATNR. " 当前行项目的物料号 * 将物料号赋值给传递结构的分配字段 RV60A-ZUONR = lv_matnr. ENDFORM. ``` 注意:如果开票凭证有多个行项目,则每个行项目都会调用此例程。因此,每个行项目都会将物料号传递到对应生成的财务凭证行项目的分配字段。 3. **激活例程**: 保存并激活例程。 4. **将需求分配给复制控制**: - 事务代码:VOFA - 选择开票类型(Billing Type)和对应的开票凭证类型(如F2发票)的复制控制(Copy Control for Billing Documents)。 - 在“凭证到凭证”(Document to Document)选项卡中,找到“项目”(Item)部分,选择需要应用的行项目类别(例如,TAN表示标准行项目)。 - 在“需求”(Requirement)列中,输入我们创建的需求编号(900)。 - 保存配置。 5. **测试**: 创建一张开票凭证,检查生成的财务凭证行项目中的分配字段(或文本字段)是否包含了物料号。 注意事项: - 如果开票凭证行项目没有物料号(比如服务行项目),则可能不需要传递,或者传递其他值。在例程中应做适当判断。 - 如果多个字段需要传递,可以同时设置多个传递结构字段。 - 如果财务凭证需要多个信息组合(如物料号+行项目号),则可以将这些信息组合成一个字符串再赋值给目标字段(注意字段长度限制)。 替代方法: 如果VOFM无法满足需求(例如需要访问更多数据),可以考虑使用用户出口(User Exit)或BAdI。相关出口包括: - User Exit:RV60AFZZ(在include程序MV60AFZZ中) - BAdI:Billing document transfer to accounting (AC_DOCUMENT) 但是,使用VOFM例程通常更简单,且是标准配置的一部分。 因此,通过以上步骤,我们可以实现在生成财务凭证时,将开票凭证行项目中的物料号复制到财务凭证的指定字段中。</think>### 在SD VOFM中配置物料号复制到财务凭证的完整指南 在SAP SD模块中,通过VOFM(条件技术)将开票单据中的物料号复制到财务凭证(FI Document)需要配置**复制需求(Copying Requirements)**。以下是详细步骤和实现原理: --- #### 1. **核心配置路径** ```mermaid graph TD A[事务代码 VOFM] --> B[需求 > 凭证到凭证] B --> C[创建新需求编号] C --> D[编写ABAP例程] D --> E[事务代码 VOFA] E --> F[分配需求到开票类型] ``` --- #### 2. **具体配置步骤** ##### (1) 创建复制需求例程 - **事务代码**: VOFM - 路径: `需求` → `凭证到凭证` → `新建需求`(例程编号建议9xx范围) - **示例ABAP代码**: ```abap FORM FRM_KODI_900. " 例程900 * 从开票凭证行项目获取物料号 DATA lv_matnr TYPE matnr. lv_matnr = VBRP-MATNR. " VBRP是开票凭证行项目表 * 传递到财务凭证字段(以分配字段ZUONR为例) RV60A-ZUONR = lv_matnr. " RV60A是开票到会计的传递结构 ENDFORM. ``` [^1] 关键点: - `VBRP-MATNR` 包含开票物料的编号 - `RV60A-ZUONR` 映射到财务凭证的BSEG-ZUONR字段 - 若需传递到其他字段(如文本字段SGTXT),使用 `RV60A-SGTXT = lv_matnr` ##### (2) 分配需求到开票类型 - **事务代码**: VOFA - 选择开票类型(如F2/F8) - 进入`凭证到凭证`页签 → `项目`数据 - 在需求列输入创建的例程编号(如900) ![VOFA配置](https://help.sap.com/doc/saphelp_srm700/7.0.0.1/en-US/ce/4b2a1a3c3d11d1893f0000e8323d3a/content.png) *图:在行项目级别分配复制需求[^2]* --- #### 3. **技术实现原理** ```mermaid sequenceDiagram participant 开票凭证 as 开票凭证(VBRK/VBRP) participant VOFM as VOFM例程 participant FI_Doc as 财务凭证(BSEG) 开票凭证->>VOFM: 触发保存事件 VOFM->>VOFM: 执行FORM FRM_KODI_900 VOFM->>FI_Doc: RV60A-ZUONR = VBRP-MATNR FI_Doc->>FI_Doc: 生成BSEG-ZUONR字段值 ``` - **数据结构映射**: $$ \begin{array}{|c|c|c|} \hline \text{来源表} & \text{字段} & \text{目标表} \\ \hline \text{VBRP} & \text{MATNR} & \text{RV60A-ZUONR} \\ \hline \text{RV60A} & \text{ZUONR} & \text{BSEG-ZUONR} \\ \hline \end{array} $$ --- #### 4. **关键注意事项** 1. **字段长度验证**: - BSEG-ZUONR长度18字符,若物料号超长需截断: ```abap RV60A-ZUONR = lv_matnr(18). " 截取前18位 ``` 2. **增强点选择**: - 简单字段复制:使用VOFM例程(推荐) - 复杂逻辑:使用BAdI `AC_DOCUMENT` 或用户出口 `RV60AFZZ` 3. **测试建议**: - 使用[TCODE VF01](https://help.sap.com/viewer/8e6b7a0d89884b8a8b8d7f8f9e8f9e8f/6.18.07/en-US/4b2a1a3c3d11d1893f0000e8323d3a.html)创建开票凭证 - 通过[TCODE FB03](https://help.sap.com/viewer/8e6b7a0d89884b8a8b8d7f8f9e8f9e8f/6.18.07/en-US/4b2a1a3c3d11d1893f0000e8323d3a.html)检查财务凭证字段值 --- #### 5. **备选方案对比** | 方法 | 适用场景 | 事务代码 | 复杂度 | |--------------------|------------------|----------|--------| | VOFM复制需求 | 简单字段传递 | VOFM/VOFA| ★☆☆ | | BAdI AC_DOCUMENT | 复杂逻辑处理 | SE18/SE19| ★★★ | | 用户出口RV60AFZZ | 标准增强点 | CMOD | ★★☆ | > ⚠️ **重要**:若开票凭证无物料号(如服务项目),需在例程中添加空值检查: > ```abap > IF VBRP-MATNR IS NOT INITIAL. > RV60A-ZUONR = VBRP-MATNR. > ENDIF. > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值