我正在学习AMDP,我发现这样得到的结果与ABAP AS中的普通select查询有很大的不同。我在AMDP中使用了以下代码:
ex_gt_data = select a.vbeln,
a.kunnr,
a.bukrs_vf,
b.erdat,
b.lsmeng,
b.posnr,
b.matnr
from vbak as a
join vbap as b
on a.vbeln = b.vbeln;然后是APPLY_FILTER函数。此查询在BUKRS_VF字段中返回多个值。如果我使用如下所示的普通select查询:
SELECT a~vbeln,
a~bukrs_vf,
a~kunnr,
b~erdat,
b~lsmeng,
b~posnr,
b~matnr
FROM vbak AS a
JOIN vbap AS b
ON a~vbeln = b~vbeln
INTO TABLE @DATA(lt_vbak)
WHERE a~vbeln IN @s_vbeln.它会生成所需的结果。
谁能告诉我为什么AMDP和普通的select查询会有这种不同?
发布于 2020-04-16 12:54:18
我刚发现添加
MANDT字段解决了这个问题。我在方法中添加了一个按值传递的参数,并在查询中用作
其中a.mandt = im_mandt。
不知道这是否是正确的solution.Please建议。
发布于 2020-04-20 21:26:20
这里给出了许多离散的有用的部分,但我在这里给出一个全面的答案。
首先,ABAP CDS视图不像在OpenSQL中那样自动尊重客户端数据。顺便说一句,HANA CDS也是如此,但根据您的问题的间接指标判断,这是关于基于HANA后端的ABAP CDS,而不是HANA CDS。是吗?
在ABAP CDS视图中处理客户端的正确方式是什么?
必须将
@ClientHandling.type #CLIENT_DEPENDENT注释添加到视图中。默认类型是#INHERITED,但为了更直观,最好显式地指定dependent.@ClientHandling.algorithm,它是一个可选字段,可以省略。有一个a complex set of rules可确定如何计算客户端,但在您的情况下,您可以不指定它,将使用隐式#AUTOMATED方式,并且client列将隐式添加到连接的ON条件中。- selected via SELECT statement with either name or alias
- have MANDT name manually set
- if the latter is absent CLIENT column is used
- if neither CLIENT nor MANDT column is not found the syntax error is thrown
但!这里我们谈论的是AMDP程序,而不是简单的CDS,所以事情更棘手。
首先也是最重要的一点是,要实现这一切,一个特殊的CDS会话客户端当前的 AMDP声明在方法签名中是必需的:
AMDP OPTIONS READ-ONLY
CDS SESSION CLIENT CURRENT该声明将$session.client变量隐式传递到AMDP过程的实现中。在默认的CURRENT语法变体中,它等于ABAP的sy-mandt值。
之后,您可以显式地对AMDP中的表使用$session.client。
SELECT * FROM vbak WHERE vbak.mandt = $session.client;或隐式地使用依赖于客户端的视图
lt_vbak = APPLY_FILTER ("Z_CDS_VIEW", :iv_where);发布于 2020-04-20 11:37:03
在AMDP/生成的SQL脚本中,无需添加MANDT参数即可获得客户编号。相反,您可以使用SESSION_CONTEXT('CLIENT')
因此,上面的查询将如下所示:
ex_gt_data = select a.vbeln,
a.kunnr,
a.bukrs_vf,
b.erdat,
b.lsmeng,
b.posnr,
b.matnr
from vbak as a
join vbap as b
on a.vbeln = b.vbeln
and a.mandt = SESSION_CONTEXT('CLIENT');使用SESSION_CONTEXT还可以实现更多功能。如果使用得当,它是您可以随意使用的强大工具。
致以最好的问候,戈帕尔·奈尔。
https://stackoverflow.com/questions/61242781
复制相似问题