
前言部分
在ABAP語言中,我們習慣於系統字段,如sy-mandt,sy-uname,sy-langu以獲取系統信息。對於日期和時間,我們使用sy-uzeit和sy-datum,或使用時間戳(GET TIME STAMP)。ABAP CDS現在也提供了一些更方便的技巧。
session變量
如果SAP HANA數據庫充當AS ABAP的數據庫,那么我們可以訪問以下三個全局會話變量:
1、CLIENT
2、APPLICATIONUSER
3、LOCALE_SAP
ABAP運行時環境使用與上述系統字段的內容相對應的值填充這些數據庫變量。我們可以使用內置函數SESSION_CONTEXT本機訪問會話變量,即EXEC SQL,ADBC和AMDP 。AMDP示例:
METHOD get_session_variables_amdp BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT. clnt := session_context(‘CLIENT’); unam := session_context(‘APPLICATIONUSER’); lang := session_context(‘LOCALE_SAP’); ENDMETHOD.
我們知道ABAP 7.50有很多新功能:
我們可以在ABAP CDS視圖中訪問這些會話變量。不僅適用於SAP HANA數據庫,還適用於所有受支持的數據庫!語法是如下:
1、$ session.user
2、$ session.client
3、$ session.system_language
我來舉個具體的例子看一下:
@AbapCatalog.sqlViewName: ‘DEMO_CDS_SESSVAR’
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_session_variables
as
select
from demo_expressions
{ id,
$session.user as system_user,
$session.client as system_client,
$session.system_language as system_language }
請注意,對於除SAP HANA之外的其他數據庫,僅在使用Open SQL訪問CDS視圖時才定義這些變量的內容。
隱式參數
會話變量是訪問其中包含的信息的便捷方式 - 全局變量。我們知道全局變量的不要輕易使用。將AS ABAP中的信息傳遞給CDS視圖和CDS表函數的適當參數。為了方便我們使用ABAP 7.50 為CDS視圖和函數參數引入了新的ABAP注釋@ Environment.systemField 我們來看一下:
1、#CLIENT
2、#SYSTEM_DATE
3、#SYSTEM_TIME
4、#SYSTEM_LANGUAGE
5、#USER
如果我們在Open SQL中使用帶注釋的參數訪問CDS視圖或CDS表函數,則可以(對於#CLIENT)放棄顯式參數傳遞。Open SQL隱式傳遞相應系統字段的內容。
我來舉個栗子:
@AbapCatalog.sqlViewName: ‘DEMO_CDS_SYST’ @AccessControl.authorizationCheck: #NOT_REQUIRED define view demo_cds_system_fields with parameters @Environment.systemField : #CLIENT p_mandt : syst_mandt, @Environment.systemField : #SYSTEM_DATE p_datum : syst_datum, @Environment.systemField : #SYSTEM_TIME p_uzeit : syst_uzeit, p_langu : syst_langu @<Environment.systemField : #SYSTEM_LANGUAGE, p_uname : syst_uname @<Environment.systemField : #USER as select from demo_expressions { :p_mandt as client, :p_datum as datum, :p_uzeit as uzeit, :p_langu as langu, :p_uname as uname } where id = ‘1’;
使用OPEN SQL訪問,我也舉個栗子:
SELECT *
FROM demo_cds_system_fields( )
INTO TABLE @DATA(result).
可見參數是隱式傳遞的
SELECT * FROM demo_cds_system_fields( p_datum = @sy-datum, p_uzeit = @sy-uzeit, p_langu = @sy-langu, p_uname = @sy-uname ) INTO TABLE @DATA(result).
p_mandt的值不能再顯式傳遞。
隱式參數傳遞是為了方便起見,僅在Open SQL中可用。如果在CDS實體中使用帶參數的CDS實體,則必須再次顯式傳遞參數。我們可以傳遞上面提到的會話變量。
時間和日期
不知道你是否注意到我們可以隱式地將系統日期和時間的值從AS ABAP傳遞到CDS實體,但是沒有那些會話變量(至少在版本7.50中沒有)
相反,使用ABAP 7.50 ,ABAP CDS中提供了一組新的內置日期和時間功能。
重要的是TSTMP_CURRENT_UTCTIMESTAMP(),它返回當前時間戳。
以下示例顯示如何使用字符串函數從時間戳中提取當前日期和時間:
substring(cast(tstmp_current_utctimestamp()as abap.char(17)),1,8) substring(cast(tstmp_current_utctimestamp()as abap.char(17)),9,6)
