公众号:SAP Technical
本文作者: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)

【ABAP CDS系列】ABAP CDS中的系统信息的更多相关文章

  1. ABAP CDS-介绍(ABAP CDS视图)

    前言 文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 在SAP发展到SAP HANA版本之后,SAP内部的技术正在快速地变化,SAP开发业务应用程序的方式已经发生了范式转变(根本 ...

  2. HANA CDS与ABAP CDS

    如果你在网络或者SCN上面搜索CDS,即SAP的Core Data Services,你会很容易地找到类似“Core Data Services(CDS)是一个在SAP HANA中用于定义和消费富语义 ...

  3. ABAP on HANA之CDS Association和Path Expression

    本文阐述了ABAP CDS association的概念,并且展示了在CDS视图中和SQL语句中写路径表达式(Path Expression)代码的方法.我也会解释如何在CDS asociation中 ...

  4. ABAP CDS-Part 1(ABAP CDS实体)

    文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 目录 预备条件 一.概述 二.ABAP CDS实体(CDS Entity) a.定义ABAP CDS Views b.ABAP C ...

  5. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

    原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...

  6. 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx EF 6 Code-First ...

  7. 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...

  8. 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...

  9. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

随机推荐

  1. leetcode — longest-valid-parentheses

    import java.util.Stack; /** * Source : https://oj.leetcode.com/problems/longest-valid-parentheses/ * ...

  2. 如何提升JavaScript的任务效率?学会后教给你同事

    本文由云+社区发表 一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事.前面的任务没做完,后面的任务只能等着.随着电脑计算能力的增强,尤其 ...

  3. solr概况

    1.solr对比lucence lucence vs solr 类似于引擎 vs 汽车. 2. solr架构 3. 对应lucence/solr源码分析 RequestHandler 处理一个url请 ...

  4. PHP中的__call和__callStatic方法

    如何防止调用不存在的方法而出错,使用__call魔术重载方法. __call方法原型如下: mixed __call(string $name,array $arguments) 当调用一个不可访问的 ...

  5. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  6. python字典类型

    字典类型简介 字典(dict)是存储key/value数据的容器,也就是所谓的map.hash.关联数组.无论是什么称呼,都是键值对存储的方式. 在python中,dict类型使用大括号包围: D = ...

  7. [转]php hash_pbkdf2 和 node.js crypto.pbkdf2

    http://php.net/manual/en/function.hash-pbkdf2.php https://nodejs.org/api/crypto.html#crypto_crypto_p ...

  8. echarts X轴显示不全 有省略

    代码如下: xAxis: [ { type: 'category', data: result.weekListAndYear,//result.weekList, axisLabel:{ // in ...

  9. redis实现高并发下的抢购/秒杀功能

    之前写过一篇文章,高并发的解决思路(点此进入查看),今天再次抽空整理下实际场景中的具体代码逻辑实现吧:抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢 ...

  10. Docker介绍基本概念(一)

    Docker介绍基本概念 1.什么是Docker? 说实话关于Docker是什么并太好说,下面我通过四点向你说明Docker到底是个什么东西. Docker是世界领先的软件容器平台. Docker使用 ...