Abap 是否仅将前导零添加到CD中的数字字段?

Abap 是否仅将前导零添加到CD中的数字字段?,abap,cds,Abap,Cds,在我的AS ABAP 7.50系统中,我有一个表,其中材料长度为18,我需要通过CD将其曝光,就像S/4中的材料长度为40一样。系统中的物料ID可以是带前导零的数字或字母数字。需要将material字段转换为MATNR40,如果ID为数字,则需要将前导零添加到40个字符 首先,我尝试了“lpad”。但当然,它也会将前导零添加到字母数字值中: lpad( cast(matnr as matnr40), 40, '0' ) as material_long, 然后,我添加了一个案例,但我无法使条件

在我的AS ABAP 7.50系统中,我有一个表,其中材料长度为18,我需要通过CD将其曝光,就像S/4中的材料长度为40一样。系统中的物料ID可以是带前导零的数字或字母数字。需要将material字段转换为MATNR40,如果ID为数字,则需要将前导零添加到40个字符

首先,我尝试了“lpad”。但当然,它也会将前导零添加到字母数字值中:

lpad( cast(matnr as matnr40), 40, '0' ) as material_long,
然后,我添加了一个案例,但我无法使条件像我预期的那样工作。正如konstantin在评论中确认的那样,在这里不可能使用正则表达式,因为我试图:

case when matnr like '%[^0-9.]%'
     then lpad( cast(matnr as matnr40), 40, '0' )
     else cast(matnr as matnr40)
end as material_long,
CD本身是否有解决此问题的方法

源表:

MATNR18 描述 000000000000000142 数字标识材料 材料2 字母数字标识
由于CDS语法中的功能有限,我看到的唯一方法是嵌套10个替换函数来删除数字,并将结果与初始字符串进行比较。如果它是初始值,那么您只有数字,所以您可以用零对它们进行LPAD。如果不是-使用原始值

这是我的密码:

@AbapCatalog.sqlViewName:'Z_V_TEST' @AbapCatalog.compiler.compareFilter:true @AbapCatalog.preserveKey:true @AccessControl.authorizationCheck:检查 @EndUserText.label:“测试” 将视图Z_测试定义为从/bi0/mmamaterial中选择{ 铸造 案例替换材料, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 什么时候 然后lpadmaterial,40,'0' 其他材料 以abap.char40结束 作为材料_α, 布料 } 结果是:

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 


数据只是读取限制/偏移量/全部,还是感兴趣的列也被过滤或用于一些更复杂的查询?因为如果您试图转换的数据用于任何简单的过滤器,比如OData,那么这些过滤器可能无法理解您的强制转换、大小写结构、正则表达式等等。最初用意良好且简洁的CDS代码可能会成为一个巨大的、难以调试的性能瓶颈,其中有许多不可预见的bug。您最好编写一个经过单元测试的DPC_EXT方法来为您进行转换,而不是尝试在普通的CDS/SQL中解决这个问题。顺便说一句:LIKE比较不理解正则表达式。它更多的是通配符,但并不像你想做的那样花哨。请参阅sap官方文档vs。如果您想在某些ABAP代码中使用正则表达式,您可以使用正则表达式只匹配数值,如果所有非数值都包含下划线,则可以使用正则表达式不匹配SQL/CDS中的%\%。@konstantin问题是,系统中的某些表已具有40个字符的长度,我需要使用不同的字符串在表之间创建联接和关联字段长度。我不允许在这一点上改变字段长度,所以现在我只想在CD中解决它。否则,我将在ABAP中进行中间处理,并用于所有条目…非常聪明,谢谢,但仍然不是很优雅。如果没有其他人提供更好的解决方案,我会将其标记为正确答案。哇,这是一种多么残酷的打破CD限制的方法:是的,这很奇怪,但这看起来像是在HANA生成的BW转换中应用alpha的方式:stringif ltrimstring\0DOC\u NUMBER\,'0123456789'=,string alphanum trim string\0DOC\u NUMBER\,10,中特鲁尔特里姆\0文件编号\,1,10。因此,由于使用了方便的trim函数,允许删除CD中未显示的多个字符,并且对于Oracle和DB2中的ex,某些DBMS中未显示此类多字符trim。。