1、背景
SAP汇率表,有效日期(GDATU)比较特殊,如下表所示:
在实际使用时,需要利用转换例程,将其转换成正常的有效日期。
在写SQL语句批量查询时,不太友好,考虑写一个视图,对其进行转换,转换逻辑比较简单,定义正常的有效日期字段 ZGDATU = 99999999 - GDATU。
2、解决方案
(1)开发传统数据库视图
create view ZV_TCURR_BASE
as
select *, cast(99999999-GDATU as char) as ZGDATU from TCURR;
执行效果:
select * from ZV_TCURR_BASE;
优点:简单快速,无需激活,可以使用常规sql脚本语法编写;
缺点:ZV_TCURR_BASE 为非ABAP对象,OPENSQL无法使用,只能用于NATIVESQL。
(2)开发ABAP CDS视图
贴入如下脚本,保存激活
@AbapCatalog.sqlViewName: 'ZV_TCURR'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '汇率有效期转换'
define view ZV_TCURR_DDL as
select
kurst,
fcurr,
tcurr,
gdatu,
ukurs,
ffact,
tfact,
@EndUserText.label: '有效日期'
cast(left(cast((99999999-cast(cast(gdatu as abap.numc(8)) as abap.int4)) as abap.char(11)),8) as abap.dats) as ZGDATU
from tcurr
在SAP中 SE11 可以查看到该对象
在SAP中ABAP中引用
SELECT * FROM ZV_TCURR UP TO 10 ROWS INTO TABLE @DATA(LT_TCURR) .
CL_DEMO_OUTPUT=>DISPLAY( LT_TCURR ).
备注:代码检查,会报警告信息,建议使用“ZV_TCURR_DDL”。
实测发现简单语句场景可以使用“ZV_TCURR”,复杂语句场景需要使用“ZV_TCURR_DDL”,否则会报错误消息。
执行效果如下,自动识别日期类型,按日期格式显示
数据库执行效果如下:
select * from ZV_TCURR; --备注:ZV_TCURR_DDL 是不可识别的
优点:CDS对象,ABAP OPENSQL可以识别,在数据库也可以使用,通用性较强。
缺点:需要使用 ABAP ADT工具进行开发,需要符合CDS脚本语法规则。