gpt4 book ai didi

abap - 仅向 CDS 中的数字字段添加前导零?

转载 作者:行者123 更新时间:2023-12-04 08:16:53 26 4
gpt4 key购买 nike

在我的 AS ABAP 7.50 系统中,我有一个表格,其中 Material 长度为 18,我需要通过 CDS 公开它,就像 Material 长度为 40 一样,就像在 S/4 中一样。系统中的 Material ID 可以是数字(带前导零)或字母数字。 Material 字段需要强制转换为MATNR40,如果ID为数字,则需要将前导零添加到40个字符。
首先,我尝试了`lpad。但当然,它还为字母数字值添加了前导零:

lpad( cast(matnr as matnr40), 40, '0' ) as material_long,
然后我加了一个 case但我无法使条件按我预期的那样工作。正如康斯坦丁在评论中确认的那样,我尝试在这里使用正则表达式是不可能的:
case when matnr like '%[^0-9.]%'
then lpad( cast(matnr as matnr40), 40, '0' )
else cast(matnr as matnr40)
end as material_long,
CDS 本身是否有针对此问题的解决方案?
来源表:


MATNR18
描述


000000000000000142
数字身份证 Material

Material _2
字母数字 ID


预期结果:


MATNR40
描述


0000000000000000000000000000000000000142
数字身份证 Material

Material _2
字母数字 ID

最佳答案

由于 CDS 语法的功能有限,我看到的唯一方法是嵌套 10 REPLACE删除数字并将结果与​​初始字符串进行比较的函数。如果它是初始的,那么你只有数字,所以你可以 LPAD他们用零。如果不是 - 使用原始值。
这是我的代码:

@AbapCatalog.sqlViewName: 'Z_V_TEST'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Test'
define view Z_TEST as select from /bi0/mmaterial {
cast(
case replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(material,
'0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '')
when ''
then lpad(material, 40, '0')
else material
end as abap.char(40)
) as MATERIAL_ALPHA,
material
}
结果是:
REPORT Z_TEST.

select *
from Z_V_TEST
where material in ('LAMP', '000000000000454445')

into table @data(lt_res)
.
cl_demo_output=>display( lt_res ).



MATERIAL_ALPHA | MATERIAL
-----------------------------------------+-------------------
0000000000000000000000000000000000454445 | 000000000000454445
LAMP | LAMP

关于abap - 仅向 CDS 中的数字字段添加前导零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65668980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com