zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    位图索引,数据库索引浅浅的学习
    Java 锁的学习
    Redis学习
    如何通俗理解相机标定公式推导与Python编程实践教程
    编译orb slam遇到的一些bug和错误解决方案
    ubuntu cmake Fatal error: iostream: No such file or directory
    cv2 drawKeypoints 使用自定义数组来绘制关键点
    报错信息ax = axes if axes else plt.gca() ValueError: The truth value of an array with more than one ele
    如何理解二值图连通域快速标记算法快速连通物体检测Fast-Connected-Component教程附带python代码实现
    如何理解图像处理中的Otsu's 二值化算法(大津算法)Python编程实践
  • 原文地址:https://www.cnblogs.com/SAPmatinal/p/10221093.html
Copyright © 2011-2022 走看看