AS ABAP 7.50环境下CDS 18位MATNR转40位MATNR40仅补数字前导零的方案
AS ABAP 7.50环境CDS物料号40位适配实现
最终实现代码
case when trim( translate( matnr, from = '0123456789', to = ' ' ) ) = '' then lpad( rtrim( cast( matnr as matnr40 ) ), 40, '0' ) else cast( rtrim( matnr ) as matnr40 ) end as material_long
逻辑说明
- 纯数字判断:将物料号内所有0-9的数字字符逐位替换为空格,再去除字符串首尾所有空格,若结果为空字符串则证明原物料号为纯数字类型,触发左补零逻辑;若替换后残留非数字字符、去空后结果不为空,则属于字母数字混合类型,直接完成类型转换,不执行补零。
- 补零逻辑修正:纯数字分支中,先将原物料号转换为MATNR40类型,去除右侧因长度对齐填充的冗余空格,再执行左补零操作。避免直接对cast结果做lpad时,因cast后字符串已达到40位长度(右侧为对齐空格)导致lpad无法触发补零的问题。
- 原有代码问题修正:之前的CASE判断逻辑方向完全颠倒——原代码是“检测到非数字字符时执行补零”,和需求中“仅纯数字物料号补零”的规则完全相反,因此结果始终不符合预期。同时原LIKE模式不支持ABAP环境下的正则字符类匹配,条件实际无法生效。
用例验证
- 纯数字物料号
000000000000000142:经替换、去空后结果为空,触发补零逻辑,最终输出固定40位长度的字符串0000000000000000000000000000000000000142,符合预期。 - 字母数字混合物料号
MATERIAL_2:经替换后残留非数字字符,不触发补零,直接转换为MATNR40类型保留原字符串内容,左侧无额外补零,符合预期。
内容的提问来源于stack exchange,提问作者RaTiO
相关产品推荐
相关产品推荐

