amdp性能调整失败,无法从表中获取不必要的所有数据

2020-08-27 08:34发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我认为AMDP无法处理选择选项。 在下面的代码中,我为select-option放置了标记,因此select-option如果有值就可以工作,因此所有数据都不会被提取,假设我们有10个表prps,mara,vbap等。然后从所有表中提取程序并 如果选择选项为空,则应用过滤器,那么它将从数据库表中获取所有数据,并且性能非常低。 这样的查询就像从mara中选择*,从vbap中选择*,从prps中选择*,这在静态上是可以避免的。

我们如何在性能调整中使用选择选项? 用户可以在S_MATNR-LOW中填写10个值,并且可以将范围S_MATNR-LOW设置为S_MATNR-HIGH,并将S_WERKS值保留为空白。 如果S_WERKS为空,我们不想获取所有值,如果s_werks为空,则不希望获取所有值,那么避免从marc获取所有数据是可以避免的,所以我添加了标志,但是在标志之后,我没有任何输出,但是如果我删除了标志条件,那么我就可以了 数据,意味着选择选项为空,它将获取整个数据库表,但是从明智的角度来看,如果我们有很多选择选项,那么有人会帮助我,那么如何避免从表中获取所有数据是错误的。

还可以像abap一样逐行调试查询吗? 假设我们有两个选择队列:it_mara =内部连接mara和makt和it_marc =内部连接marc和mard。 那么有可能像abap一样调试吗? 我在课堂上设置了断点,但是我做不到,只能检查决赛桌的数据。

选择选项:S_MATNR FOR MARA-MATNR。
 选择选项:S_WERKS用于MARC-WERKS。

   如果S_MATNR不是INITIAL。
     数据(LV_WHERE)= CL_SHDB_SELTAB => COMBINE_SELTABS(
         IT_NAMED_SELTABS = VALUE#((NAME ='MATNR'DREF = REF#(S_MATNR []))))。
     DATA(FLAG_MATNR)='X'
   万一。

   如果S_WERKS不是初始的。
     DATA(FLAG_WERKS)='X'。
     数据(LV_WHERE1)= CL_SHDB_SELTAB => COMBINE_SELTABS(
          IT_NAMED_SELTABS = VALUE#((NAME ='WERKS'DREF = REF#(S_WERKS []))))。
   万一。

   呼叫方法ZJAYAMDP2 => GET_MATERIAL_DETAILS
     出口
       LV_WHERE = LV_WHERE
       LV_WHERE1 = LV_WHERE1
       FLAG_WERKS = FLAG_WERKS
       FLAG_MATNR = FLAG_MATNR
     输入
       ET_MAT = IT_FINAL。
 _________________________________________________________________________________

 如果(FLAG_MATNR ='X')THEN
        RESULT_1 = APPLY_FILTER(MARA,:LV_WHERE);
        万一;
 如果(FLAG_WERKS ='X')THEN
          RESULT_2 = APPLY_FILTER(MARC,:LV_WHERE1);
        万一;
  ET_MAT = SELECT DISTINCT A.matnr,
                          ernam
                          阿斯达
                          b.maktx,
                          c。维克斯
                         FROM:result_1作为
                         INNER JOIN makt as b
                         在a.matnr = b.matnr
                         内部连接:result_2 as c
                             在a.matnr = c.matnr;
 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我认为AMDP无法处理选择选项。 在下面的代码中,我为select-option放置了标记,因此select-option如果有值就可以工作,因此所有数据都不会被提取,假设我们有10个表prps,mara,vbap等。然后从所有表中提取程序并 如果选择选项为空,则应用过滤器,那么它将从数据库表中获取所有数据,并且性能非常低。 这样的查询就像从mara中选择*,从vbap中选择*,从prps中选择*,这在静态上是可以避免的。

我们如何在性能调整中使用选择选项? 用户可以在S_MATNR-LOW中填写10个值,并且可以将范围S_MATNR-LOW设置为S_MATNR-HIGH,并将S_WERKS值保留为空白。 如果S_WERKS为空,我们不想获取所有值,如果s_werks为空,则不希望获取所有值,那么避免从marc获取所有数据是可以避免的,所以我添加了标志,但是在标志之后,我没有任何输出,但是如果我删除了标志条件,那么我就可以了 数据,意味着选择选项为空,它将获取整个数据库表,但是从明智的角度来看,如果我们有很多选择选项,那么有人会帮助我,那么如何避免从表中获取所有数据是错误的。

还可以像abap一样逐行调试查询吗? 假设我们有两个选择队列:it_mara =内部连接mara和makt和it_marc =内部连接marc和mard。 那么有可能像abap一样调试吗? 我在课堂上设置了断点,但是我做不到,只能检查决赛桌的数据。

选择选项:S_MATNR FOR MARA-MATNR。
 选择选项:S_WERKS用于MARC-WERKS。

   如果S_MATNR不是INITIAL。
     数据(LV_WHERE)= CL_SHDB_SELTAB => COMBINE_SELTABS(
         IT_NAMED_SELTABS = VALUE#((NAME ='MATNR'DREF = REF#(S_MATNR []))))。
     DATA(FLAG_MATNR)='X'
   万一。

   如果S_WERKS不是初始的。
     DATA(FLAG_WERKS)='X'。
     数据(LV_WHERE1)= CL_SHDB_SELTAB => COMBINE_SELTABS(
          IT_NAMED_SELTABS = VALUE#((NAME ='WERKS'DREF = REF#(S_WERKS []))))。
   万一。

   呼叫方法ZJAYAMDP2 => GET_MATERIAL_DETAILS
     出口
       LV_WHERE = LV_WHERE
       LV_WHERE1 = LV_WHERE1
       FLAG_WERKS = FLAG_WERKS
       FLAG_MATNR = FLAG_MATNR
     输入
       ET_MAT = IT_FINAL。
 _________________________________________________________________________________

 如果(FLAG_MATNR ='X')THEN
        RESULT_1 = APPLY_FILTER(MARA,:LV_WHERE);
        万一;
 如果(FLAG_WERKS ='X')THEN
          RESULT_2 = APPLY_FILTER(MARC,:LV_WHERE1);
        万一;
  ET_MAT = SELECT DISTINCT A.matnr,
                          ernam
                          阿斯达
                          b.maktx,
                          c。维克斯
                         FROM:result_1作为
                         INNER JOIN makt as b
                         在a.matnr = b.matnr
                         内部连接:result_2 as c
                             在a.matnr = c.matnr;
 
付费偷看设置
发送
1条回答
spaceman01
1楼 · 2020-08-27 09:07.采纳回答

在最终查询中使用当前的INNER JOIN实现,如果RESULT_1或RESULT_2为空,则不会获得任何结果,因为在这种情况下INNER JOIN查询无法获得结果。

您描述的行为。 如果由于未设置"标志"而不查询数据,则RESULT_1或RESULT_2为空-> INNER JOIN查询中无结果。 如果删除该标志并且您没有选择输入任何值,那么您就没有WHERE条件。 因此,所有内容都是从相应的表创建的-> INNER JOIN查询将得到一个结果(以防万一条目符合ON条件)。

总结:这不是AMDP问题,这只是您的行为 自己实现。

一周热门 更多>