首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与OpenSQL相反,AMDP选择错误记录

与OpenSQL相反,AMDP选择错误记录
EN

Stack Overflow用户
提问于 2020-04-16 12:35:22
回答 3查看 959关注 0票数 1

我正在学习AMDP,我发现这样得到的结果与ABAP AS中的普通select查询有很大的不同。我在AMDP中使用了以下代码:

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
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查询会有这种不同?

EN

回答 3

Stack Overflow用户

发布于 2020-04-16 12:54:18

我刚发现添加

MANDT字段解决了这个问题。我在方法中添加了一个按值传递的参数,并在查询中用作

其中a.mandt = im_mandt。

不知道这是否是正确的solution.Please建议。

票数 3
EN

Stack Overflow用户

发布于 2020-04-20 21:26:20

这里给出了许多离散的有用的部分,但我在这里给出一个全面的答案。

首先,ABAP CDS视图不像在OpenSQL中那样自动尊重客户端数据。顺便说一句,HANA CDS也是如此,但根据您的问题的间接指标判断,这是关于基于HANA后端的ABAP CDS,而不是HANA CDS。是吗?

在ABAP CDS视图中处理客户端的正确方式是什么?

必须将

  1. @ClientHandling.type #CLIENT_DEPENDENT注释添加到视图中。默认类型是#INHERITED,但为了更直观,最好显式地指定dependent.
  2. @ClientHandling.algorithm,它是一个可选字段,可以省略。有一个a complex set of rules可确定如何计算客户端,但在您的情况下,您可以不指定它,将使用隐式#AUTOMATED方式,并且client列将隐式添加到连接的ON条件中。
  3. client列必须存在于视图中,并且应为

代码语言:javascript
复制
- 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

  1. 不需要其他操作,客户端就像在OpenSQL情况下一样被隐式寻址。

但!这里我们谈论的是AMDP程序,而不是简单的CDS,所以事情更棘手。

首先也是最重要的一点是,要实现这一切,一个特殊的CDS会话客户端当前的 AMDP声明在方法签名中是必需的:

代码语言:javascript
复制
 AMDP OPTIONS READ-ONLY     
              CDS SESSION CLIENT CURRENT

该声明将$session.client变量隐式传递到AMDP过程的实现中。在默认的CURRENT语法变体中,它等于ABAP的sy-mandt值。

之后,您可以显式地对AMDP中的表使用$session.client

代码语言:javascript
复制
SELECT * FROM vbak WHERE vbak.mandt = $session.client;

或隐式地使用依赖于客户端的视图

代码语言:javascript
复制
lt_vbak = APPLY_FILTER ("Z_CDS_VIEW", :iv_where);
票数 2
EN

Stack Overflow用户

发布于 2020-04-20 11:37:03

在AMDP/生成的SQL脚本中,无需添加MANDT参数即可获得客户编号。相反,您可以使用SESSION_CONTEXT('CLIENT')

因此,上面的查询将如下所示:

代码语言:javascript
复制
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还可以实现更多功能。如果使用得当,它是您可以随意使用的强大工具。

致以最好的问候,戈帕尔·奈尔。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61242781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档