原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
标准单据表都允许通过增强添加字段.
添加的字段类型有两种可能
• 文本型: 包含日期,NUMC等实际是文本的类型
• 数字型: 包含整数,数量,金额等非文本的类型.
添加的方式有两种
• 通过系统预留的结构增强
• 通过附加字段增强
一般情况下,标准单据增强字段需要完成以下方面的增强
• 屏幕增强: 增强的字段允许在标准屏幕上创建/修改/显示.随单据的保存存入标准表
• BAPI增强: 增强的字段通过BAPI EXTENSION段传入BAPI函数,最终写入标准表.
**本文主要介绍怎么解决数字型字段在BAPI中的传递** .
为了说明清楚问题, 后文以采购订单行项目增强字段为例.
二
一个矛盾
标准单据中增强字段如果是字符型,一切好说. 如果是数字型, 为了解决BAPI传递的问题(BAPI-
EXTENSION是只能传递字符型内容),一般开发往往会把数字型强制定义成文本型.
这种数字定义成文本可能带来的问题:表字段类型与业务实际类型不一致,可能引起一系列的存储,计算问题.
比如:如果数据不小心存入了A01之类的字符. 实际运算时因为无法转换成数字, 可能会引起程序DUMP.
BAPI中的EXTENSION
三
解决办法思路
表按数字类型定义, 同时定义一个同名的文本字段,在BAPI传递时使用文本字段类型. 在BAPI增强段处理的时候,同名字段赋值到表字段中.
四
增强字段定义
以采购订单为例
_**01** _
**数据定义**
采购订单行项目表有增强的结构 CI_EKPODB. 增强的字段最好放入该结构中.以便使用系统预定义好的一些内容.
如果充分了解了增强字段的处理逻辑, 使用附加字段方式增强也可以.
_**02** _
**嵌套定义增强字段**
把增强字段整体放入一个结构,以便后续复用该结构
该结构中再嵌入其它结构(其中常规字段是字符型的字段, 数量/金额字段分开放或者集中放到一个结构中)
金额字段的内容
_**03** _
**文本类型结构**
再定义一组结构(数量/金额字段使用文本类型),其中 ZSEKPO_ATTR复用
_**04** _
**标记结构**
标记结构中的字段类型CHAR长度都是1 . (有些单据字符类型必须用数据元素 CHAR1定义,比如销售订单中会检测字符类型是CHAR1 ).
五
最终定义的结构
最终的定义包含三组结构
• 原始字段组
• 金额字符化组
• 标记组
**原始字段**
• **ZSEKPO** EKPO 附加结构
• **ZSEKPO_ATTR** EKPO 附加结构-常规字段
• **ZSEKPO_JE** EKPO 附加结构-金额字段
• **ZSEKPO_QTY** EKPO 附加结构-数量字段
**金额字符化**
• **ZSEKPO_C** EKPO 附加结构-BAPI金额字段(CHAR)
• **ZSEKPO_ATTR** EKPO 附加结构-常规字段
• **ZSEKPO_JE_C** EKPO 附加结构-金额字段(CHAR)
• **ZSEKPO_QTY_C** EKPO 附加结构-数量字段(CHAR)
**标记**
• **ZSEKPOX** 采购订单行项目增强
• **ZSEKPO_ATTRX** EKPO 附加结构-常规字段FLAG
• **ZSEKPO_JEX** EKPO 附加结构-金额字段
• **ZSEKPO_QTY_CX** EKPO 附加结构-数量字段(FLAG)
六
应用在标准结构
定义好的字段应用在标准结构中
CI_EKPODB
ZCI_EKPODB
CI_EKPODBX
七
调整标准结构
需要修改的标准结构
八
代码增强部分
最后,调整一下BAPI处理增强段的逻辑.
程序 L2012F23 中的增强点 move_extensionin_02
在该增强点创建是一个实施: 替换标准传递的结构.
九
BAPI增强段传递的方式优化
BAPI增强段赋值时,使用下面的语句把结构整体赋值到结构的某些字段中.
pt_ext+30(960) = bapi_te_mepoitem.
同时,可以考虑使用统一的函数赋值标记段
Z_BAPI_FILL_X
十
总结
本文以PO为例, 讲解了增强字段的优化处理方式.尤其是数量金额类的增强字段.
其它的单据比如销售订单,采购申请等与PO的处理类似.
应用本文的处理方式, 增强的数字类型字段可以通过BAPI传递内容. 存入表中的数字类型字段定义中. 后续新增字段时, 只需要修改特定的结构新增字段即可.
因为EXTENSION结构总长度960的限制, 单个表增强字段总长度如果超过960, 将无法通过EXTENSION段传递.
此时只能考虑其它传递方式(比如在调用BAPI函数调用之前EXPORT到内存ID. 在BAPI中处理EXTENSION段的地方,IMPORT 内存ID.
赋值到相应表增强字段中.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
**公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群**