SAP CDS view 如何將 CHAR 型別的資料欄位和當前系統日期比較

注销發表於2022-02-22

以資料庫表 ADR2 為例,其欄位 VALID_FROM 型別為 char14,儲存的日期格式為 YYYYMMDDHHMMSS

一些具體的例子資料:

現在有個需求,開發一個 CDS view,將 valid_from 小於當前日期的記錄全部讀取出來。

ABAP 752 版本之後,可以使用 $session.system_date 在 CDS view 的原始碼裡訪問當前 Application server 的當前日期。

下面是這個需求的實現步驟。

  1. 建立一個 CDS view ZITIME,
@AbapCatalog.sqlViewName: 'ZJERRYTIME'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'time'
define view zitime as select from adr2 {
    key addrnumber as addnumber,
    country,
    valid_from,
    cast(substring(valid_from,1,8) as abap.dats) as valid_from_date
} where valid_from <> ''

首先使用 substring 將 valid_from 欄位前8個字元提取出來,然後使用 cast 將其轉換成型別 abap.dats, 因為只有型別相同的兩個欄位,才能進行比較。我們使用 cast 將 substring 函式返回的 char 型別的值,轉換成和 $session.system_date 變數相同的型別。

轉換完畢之後,將這個新的欄位重新命名為 valid_from_date:

  1. 新建一個 CDS view ZCTIME,將前一個檢視的欄位 valid_from_date$session.system_date 比較即可:
@AbapCatalog.sqlViewName: 'ZCTIMEVIEW'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'consumption'
define view ZCTIME as select from zitime {
    key zitime.addnumber,
    zitime.country,
    zitime.valid_from_date
} where valid_from_date < $session.system_date

最後的執行效果:

更多Jerry的原創文章,盡在:"汪子熙":

相關文章