根据结构动态生成内表的梗

最近有人问我个问题,

说根据结构动态生成内表时会出错,

就像这样

所以到底为什么会这样呢,

我们来做一个测试

首先定义1000列,每个字段200长度,看看效果

上图红框中的400000就是1000列乘以200长度再乘以2转换出来的字节长度

然后我们再调整列数为2000,每个字段还是200,再看看效果就发现了同样的错误结构大小计算方法大致就是所以字段长度和*2即可(好像存在长度不是2的倍数的情况,可能比2的倍数少1,但是想不起来这种场景)

接着看2004的来源报的消息0K000的组件信息

来源于上图中的三个参数,

l_message,l_line,l_word,

而这三者来源于generate subroutine pool

的内表lt_source.

根据上图得知:2004是构建结构结束语所在行,关键词是DATA。从这,我们可以得出一个结论,使用2004这个行号 - 4就可以知道结构的列数。

对524287这个数字,使用系统跟踪方式也没法调试generate subroutine pool的代码,通过代码检索的办法,找到一些线索。贴图如下

上图中,有个co_max_abap_structure_width. 我想根据英文就应该明白了吧,系统规定了结构的长度最大是2^19-1,如果超过这个长度,就会出现错误,消息为DT492。

同样的,se11创建结构也是如此

我们尝试创建10个30000长度字段的结构ps:关于此类的限制,可以查看包STDB中相关定义。例如:表的大小限制是4030,视图大小限制是4096,详见note:2458652

好啦,

今天的问题就说到这了,

下期再见。

图文来源:成旭平

责任编辑:泰 古

责任审核:泰 古

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值