【ABAP CDS系列】ABAP CDS中的系統信息


公眾號: matinal
本文作者: matinal
 

前言部分

在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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM