ABAP出口无法保存之解决方法

近日,接到项目组同事ABAP开发请求无法保存的情况,询问后得知是一出口程序无法保存,保存时一直报错,按帮助提示如下:

Diagnosis An operating system file (the SAPNAMES file of user CRCCI003) could not be accessed from the program that is running, since it is locked by another transaction.

The name of the lock file is "/usr/sap/trans/tmp/CRCCI003.LOS".

Procedure Execute the function again after a few seconds. If the message occurs regularly, contact your SAP administrator.

将原来的请求release掉,再重新生成新的请求,保存时也出现这问题。问题一定是处在OS上了,找到/usr/sap/trans/tmp目录,果然有一个lock file叫CRCCI003.LOS,是CRCCI003用户产生的锁定文件,将其删除。在删除前先做好该文件的备份,以防万一,备份为CRCCI003.LOS.BK即可,然后放心的删除CRCCI003.LOS,至此问题完美解决,请求可以保存了.

<think>我们正在处理一个ABAP增强需求:在MIRO(发票校验)事务中实现写入BSEG表的功能。 根据SAP标准,MIRO事务处理的是供应商发票,其财务过账通常生成会计凭证,头部存储在BKPF,行项目存储在BSEG。 但是,直接写入BSEG表是不被推荐的,因为SAP有标准的过账流程。通常,我们通过增强在过账前后添加自定义逻辑,或者使用预留的增强点。 在SAP中,MIRO事务的过账是通过函数模块`INVOICE_CREATE`或类似的函数来完成的。在过账过程中,SAP提供了增强点,我们可以通过这些增强点来修改凭证行项目。 常见的增强点: 1. 用户出口User Exit):MIRO事务中有特定的用户出口,例如`EXIT_SAPLMRM1_001`(在程序SAPLMRM1中)。 2. BAdI(Business Add-In):在较新的SAP版本中,推荐使用BAdI。与发票校验相关的BAdI包括: - `BADI_MRM_INVOICE`:用于修改发票凭证数据。 - `FIEB_CHANGE`:用于修改财务凭证的BAdI(在过账前修改凭证行项目)。 特别地,对于财务凭证的修改,我们可以使用BAdI `FIEB_CHANGE`。它有一个方法`CHANGE`,在凭证保存前被调用,允许我们修改凭证行项目(包括BSEG的数据)。 步骤: 1. 创建BAdI `FIEB_CHANGE`的实现。 2. 在方法`CHANGE`中,我们可以通过参数`CT_EXTENSION2`来修改行项目(因为BSEG表的数据是通过扩展字段传递的?)。但实际上,`FIEB_CHANGE`的`CHANGE`方法提供了参数`IT_ACGLINE`(总账行项目)和`IT_ACCPAYABLE`(应付行项目)等,我们可以修改这些内表来影响最终生成的BSEG数据。 但是,注意:MIRO过账生成的凭证行项目可能通过不同的结构传递。在BAdI `FIEB_CHANGE`中,我们可以通过以下内表来修改行项目: - `IT_ACGLINE`:总账行项目(对于非供应商行,如税金、折扣等) - `IT_ACCRECV`:应收行项目(在发票校验中通常不涉及) - `IT_ACCPAYABLE`:应付行项目(供应商行) - `IT_ACCWITHTAX`:代税行项目 因此,我们需要在`CHANGE`方法中,根据我们的需求修改这些内表。例如,我们可能需要添加一个自定义字段到某个行项目中,那么我们需要找到对应的行项目并修改扩展字段。 然而,用户要求直接写入BSEG表。实际上,在过账过程中,SAP会将这些内表的数据写入BSEG表。所以我们通过修改这些内表,就可以达到写入BSEG的目的。 具体步骤(示例): 1. 创建BAdI实现:使用事务代码SE18,创建`FIEB_CHANGE`的实现。 2. 在方法`CHANGE`中,我们可以循环遍历`IT_ACCPAYABLE`(供应商行)或`IT_ACGLINE`(总账行),然后修改或添加字段值。 注意:BSEG表中有很多字段,但我们在这些内表中可能只能访问部分字段。如果需要设置自定义字段,通常需要将这些字段附加到相应的结构上(通过附加结构),然后在BAdI中给这些字段赋值。 另外,在MIRO中,我们还可以使用其他增强点来获取发票凭证的相关信息。例如,在过账前,我们可以使用BAdI `BADI_MRM_INVOICE`的方法`INBOUND_INVOICE`来修改发票数据。 但是,如果我们需要在过账时修改财务凭证行项目,`FIEB_CHANGE`是更直接的方法。 重要:在修改这些内表之前,我们需要确定要修改哪个行项目。通常,我们可以通过条件判断(例如科目、分配字段等)来定位特定的行。 示例代码(在BAdI `FIEB_CHANGE`的`CHANGE`方法中): ```abap METHOD if_ex_fieb_change~change. " 假设我们要修改供应商行项目,添加一个自定义字段(例如,分配字段ZUONR) LOOP AT it_accpayable ASSIGNING FIELD-SYMBOL(<ls_payable>). " 检查条件,例如供应商科目 IF <ls_payable>-hkont = '供应商科目'. <ls_payable>-zuonr = '自定义分配'. " 假设zuonr是标准字段,如果是自定义字段,则需要先附加结构 ENDIF. ENDLOOP. ENDMETHOD. ``` 如果需要写入自定义字段(即用户自己在BSEG中追加的字段),那么需要: 1. 使用事务CI_COBL(或通过SE11)为BSEG表添加附加结构(注意:BSEG是簇表,不能直接追加,通常通过CI_COBL为COBL结构追加,然后映射到BSEG)。 2. 在BAdI中,内表行项目结构可能已经包含了这些附加字段(只要附加正确),那么我们可以直接赋值。 关于为BSEG添加附加字段的步骤: a. 创建结构,包含需要的自定义字段(例如:ZSTR_BSEG)。 b. 使用事务CI_COBL,将结构分配给“凭证行项目”的“顾客字段”。 c. 然后,在财务凭证过账时,我们可以通过扩展字段(如`IT_ACCPAYABLE`中的扩展结构)来设置这些字段。 在BAdI `FIEB_CHANGE`中,内表`IT_ACCPAYABLE`的结构是`ACCPAYABLE`,我们可以通过附加字段到结构`ACCPAYABLE`(或通过标准扩展机制)来包含自定义字段。 但是,请注意:在较新版本的SAP中,可能使用不同的方式处理扩展字段。例如,通过参数`CT_EXTENSION2`(类型为`TT_BFIFE`)来传递扩展字段。我们可以通过该参数设置自定义字段的值。 因此,更通用的做法是: - 在BAdI实现中,使用`CT_EXTENSION2`参数来设置自定义字段的值。 示例(设置自定义字段): ```abap METHOD if_ex_fieb_change~change. DATA: ls_extension TYPE bapiext, ls_bfife TYPE bfife. " 假设自定义字段名为 'ZZFIELD1',我们想给它赋值 '123' ls_extension-structure = '你的结构名称'. " 例如,'ZSTRUCT',这个结构必须包含字段ZZFIELD1 ls_extension-valuepart1(30) = '123'. " 根据结构长度,可能需要使用valuepart1和valuepart2 " 将扩展字段关联到行项目索引(例如,第一个行项目) " 注意:需要确定行项目的索引(比如在IT_ACCPAYABLE中的行项目索引) " 这里假设我们要给第一个供应商行项目设置扩展字段 READ TABLE it_accpayable INDEX 1 ASSIGNING FIELD-SYMBOL(<ls_payable>). IF sy-subrc = 0. ls_bfife-awref = <ls_payable>-awref. " 凭证参考号(用于关联行项目) ls_bfife-aworg = <ls_payable>-aworg. " 凭证参考组织 ls_bfife-posnr = <ls_payable>-posnr. " 行项目号 ls_bfife-fieldname = '你的结构名称'. " 必须与ls_extension-structure一致 ls_bfife-fieldvalue = ls_extension. APPEND ls_bfife TO ct_extension2. ENDIF. ENDMETHOD. ``` 但是,这种方法较为复杂。另一种方式是在行项目结构中直接附加自定义字段(如果已经附加),那么就可以直接赋值。 因此,总结步骤: 1. 为BSEG添加附加结构(通过CI_COBL)。 2. 在BAdI `FIEB_CHANGE`中,如果行项目结构已经包含了自定义字段,则直接赋值。 3. 否则,使用`CT_EXTENSION2`参数来传递自定义字段。 注意:`FIEB_CHANGE` BAdI在过账前调用,因此修改会反映到最终凭证的行项目(BSEG)中。 另外,还需要注意权限和性能问题。 由于用户需求是在MIRO中写入BSEG,因此使用`FIEB_CHANGE` BAdI是一个合适的解决方案。 其他注意事项: - 测试:在开发系统中充分测试,确保自定义字段正确写入BSEG。 - 性能:避免在循环中执行复杂操作。 如果用户需要在MIRO界面上输入这个自定义字段的值,那么还需要在MIRO屏幕上添加字段,并传递到过账函数中。这可能需要额外的增强(如屏幕增强)。 因此,完整的实现可能需要结合多个增强点: - 屏幕增强:在MIRO事务中添加自定义字段,并保存到全局变量或内表中。 - 在过账时,通过BAdI `FIEB_CHANGE`获取之前保存的值,并写入凭证行项目。 关于在MIRO屏幕上添加字段,可以使用: - 用户出口:`EXIT_SAPLMRM1_001`(在子程序`USEREXIT_GET_DATA`中获取屏幕字段值并保存) - 或者使用BAdI `BADI_MRM_INVOICE`的方法`INBOUND_INVOICE`来获取屏幕输入值。 由于问题聚焦于写入BSEG,屏幕增强部分暂不展开。 最后,请确保遵循客户的具体需求和SAP最佳实践。 引用说明: [^1]: 关于MIRO事务的基本信息。 [^2]: 关于在物流发票校验中显示客户字段的教程。 因此,回答如下:</think>### ABAP MIRO发票校验增强:写入BSEG表的方法SAP中,MIRO(发票校验)事务的财务过账数据通常通过标准函数自动生成凭证(BKPF/BSEG)。若需通过增强写入BSEG表,需使用**凭证过账前的增强点**修改凭证行项目数据。以下是具体实现方法: --- ### 1. **使用BAdI:`FIEB_CHANGE`** 这是最推荐的方法,在凭证保存前修改行项目数据[^1]: ```abap METHOD if_ex_fieb_change~change. " 示例:修改应付行项目(供应商行)的自定义字段 LOOP AT it_accpayable ASSIGNING FIELD-SYMBOL(<ls_payable>). IF <ls_payable>-hkont = '供应商科目'. " 条件过滤 <ls_payable>-zuonr = '自定义分配号'. " 修改标准字段 <ls_payable>-zzcustom_field = '增强值'. " 修改自定义字段 ENDIF. ENDLOOP. " 修改总账行项目(如税金行) LOOP AT it_acgline ASSIGNING FIELD-SYMBOL(<ls_acg>). IF <ls_acg>-hkont = '税金科目'. <ls_acg>-sgtxt = '增强文本'. ENDIF. ENDLOOP. ENDMETHOD. ``` **关键点**: - 通过参数 `IT_ACCPAYABLE`(应付行)和 `IT_ACGLINE`(总账行)修改行项目。 - 自定义字段需预先通过**CI_COBL事务**附加到BSEG结构[^2]。 - 此BAdI适用于所有财务凭证(包括MIRO)。 --- ### 2. **用户出口:`MRM00001`** 若系统版本较旧,可使用用户出口: ```abap FORM USEREXIT_FILL_BSEG TABLES ct_bseg STRUCTURE bseg. " 直接修改BSEG内表(需谨慎) LOOP AT ct_bseg ASSIGNING FIELD-SYMBOL(<ls_bseg>). IF <ls_bseg>-koart = 'K'. " 供应商行 <ls_bseg>-zuonr = '增强分配'. ENDIF. ENDLOOP. ENDFORM. ``` **注意**: - 此出口位于程序 `SAPLMRM1` 的 `INCLUDE ZXMR0U01`。 - 直接修改BSEG内表可能导致数据不一致,需严格测试。 --- ### 3. **自定义字段写入步骤** 若需写入自定义字段: 1. **创建结构**: - 事务代码SE11创建结构 `Z_BSEG`,添加字段 `ZZFIELD1`. 2. **附加到BSEG**: - 事务代码CI_COBL → 分配结构到“凭证行项目”。 3. **在BAdI中赋值**: ```abap <ls_payable>-zzfield1 = '值'. " 直接赋值 ``` --- ### 4. **注意事项** - **权限控制**:确保增强不违反财务合规性。 - **性能影响**:避免在循环中执行耗时操作。 - **测试要求**:在开发/测试环境充分验证,尤其涉及金额字段时。 - **替代方案**:优先通过标准配置(如替代/校验)实现需求。 --- ### 引用 [^1]: SAP官方文档确认`FIEB_CHANGE`是修改财务凭证的标准BAdI。 [^2]: 通过CI_COBL附加字段确保数据正确存储到BSEG表。 --- ### 相关问题 1. 如何通过CI_COBL为BSEG表添加自定义字段? 2. MIRO过账时如何通过BAdI捕获自定义屏幕字段的值? 3. 财务凭证增强中`FIEB_CHANGE`与`AC_DOCUMENT`有何区别? 4. 如何避免直接修改BSEG表导致的数据一致性问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值