帮助改善此代码段的性能

2020-09-01 04:59发布

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

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


大家好,

SAP ECC 6.0(SAP_ABA 701),因此不能在内部表中使用辅助键...:(

我们有一个报告来维护表MLEA的数据。

其中一项要求是,该表中的EAN11字段必须唯一,不允许在其他任何记录中使用相同的值。

该报告具有一个选择屏幕,因此可能不会显示所有数据库记录。

我们需要检查ALV的任何行在EAN11字段中是否具有相同的值,然后出错。

如果不是,我们需要检查数据库中的任何记录在EAN11字段中是否具有相同的值,但是在标记为错误之前,我们需要检查同一记录是否在ALV中并且在EAN11中具有其他值( 用户可以修改报告中的值...)

---

我不喜欢解决问题的方法。
有什么帮助改进代码的地方吗?

数据:
  lt_alv mlea类型标准表,
  lt_alv_sort_keys具有唯一键的mlea的类型排序表matnr meinh lifnr lfnum,
  lt_alv_sort_ean带有唯一键ean11的mlea类型排序表
  lt_ean_db具有非唯一键ean的mlea的类型排序表。

 将lt_alv的行插入表lt_alv_sort_keys。
 将lt_alv的行插入表lt_alv_sort_ean。

 *选择具有相同EAN的数据库记录
 如果lt_alv不是INITIAL。
  选择Matnr Meinh Lifnr lfnum ean11
  表lt_mlea_db的对应字段
  来自mlea
  对于lt_alv中的所有条目
  在ean11 EQ lt_alv-ean11中。
 万一。

 循环至lt_alv分配。

 *检查ALV中的其他行是否具有相同的EAN
  循环播放lt_alv_sort_ean
  分配
  在ean11 EQ  -ean11中," EAN11中的值相同
  AND(matnr NE  -matnr"不同的关键字段
  或meinh NE  -meinh
  或lifnr NE  -lifnr
  或lfnum NE  -lfnum)。

  "错误
   出口。
  结局。
  IF sy-subrc NE 0。
 
 *检查任何数据库记录是否具有相同的EAN
  循环播放lt_ean_db
  分配
  在ean11 EQ  -ean11中。
 
 *检查记录是否相同
  检查 -matnr NE  -matnr
  或 -meinh NE  -meinh
  或 -lifnr NE  -lifnr
  或 -lfnum NE  -lfnum。
 
 *检查ALV中是否存在其他值
  读取表lt_alv_sort_keys
  分配
  WITH KEY matnr =  -matnr
  meinh =  -meinh
  lifnr =  -lifnr
  lfnum =  -lfnum。
  如果sy-subrc NE 0
  或sy-subrc EQ 0和 -ean11 EQ  -ean11。
 
  "错误
   出口。
  万一。
 
  结局。

  万一。

 ENDLOOP。

谢谢。

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

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


大家好,

SAP ECC 6.0(SAP_ABA 701),因此不能在内部表中使用辅助键...:(

我们有一个报告来维护表MLEA的数据。

其中一项要求是,该表中的EAN11字段必须唯一,不允许在其他任何记录中使用相同的值。

该报告具有一个选择屏幕,因此可能不会显示所有数据库记录。

我们需要检查ALV的任何行在EAN11字段中是否具有相同的值,然后出错。

如果不是,我们需要检查数据库中的任何记录在EAN11字段中是否具有相同的值,但是在标记为错误之前,我们需要检查同一记录是否在ALV中并且在EAN11中具有其他值( 用户可以修改报告中的值...)

---

我不喜欢解决问题的方法。
有什么帮助改进代码的地方吗?

数据:
  lt_alv mlea类型标准表,
  lt_alv_sort_keys具有唯一键的mlea的类型排序表matnr meinh lifnr lfnum,
  lt_alv_sort_ean带有唯一键ean11的mlea类型排序表
  lt_ean_db具有非唯一键ean的mlea的类型排序表。

 将lt_alv的行插入表lt_alv_sort_keys。
 将lt_alv的行插入表lt_alv_sort_ean。

 *选择具有相同EAN的数据库记录
 如果lt_alv不是INITIAL。
  选择Matnr Meinh Lifnr lfnum ean11
  表lt_mlea_db的对应字段
  来自mlea
  对于lt_alv中的所有条目
  在ean11 EQ lt_alv-ean11中。
 万一。

 循环至lt_alv分配。

 *检查ALV中的其他行是否具有相同的EAN
  循环播放lt_alv_sort_ean
  分配
  在ean11 EQ  -ean11中," EAN11中的值相同
  AND(matnr NE  -matnr"不同的关键字段
  或meinh NE  -meinh
  或lifnr NE  -lifnr
  或lfnum NE  -lfnum)。

  "错误
   出口。
  结局。
  IF sy-subrc NE 0。
 
 *检查任何数据库记录是否具有相同的EAN
  循环播放lt_ean_db
  分配
  在ean11 EQ  -ean11中。
 
 *检查记录是否相同
  检查 -matnr NE  -matnr
  或 -meinh NE  -meinh
  或 -lifnr NE  -lifnr
  或 -lfnum NE  -lfnum。
 
 *检查ALV中是否存在其他值
  读取表lt_alv_sort_keys
  分配
  WITH KEY matnr =  -matnr
  meinh =  -meinh
  lifnr =  -lifnr
  lfnum =  -lfnum。
  如果sy-subrc NE 0
  或sy-subrc EQ 0和 -ean11 EQ  -ean11。
 
  "错误
   出口。
  万一。
 
  结局。

  万一。

 ENDLOOP。

谢谢。

付费偷看设置
发送
3条回答
我是小鹏鹏啊
1楼-- · 2020-09-01 05:42

拼写错误:我认为lt_ean_db和lt_mlea_db应该是同一内部表。

代码有错误,因为您用UNIQUE键定义了lt_alv_sort_keys和lt_alv_sort_ean。 它应该是非唯一的。

此外,不需要lt_ean_db,可以使用lt_alv_sort_ean。

除此之外,我看不到更好的解决方案(最终会降低性能) 通过用lt_alv初始化"索引表"并仅更新与更改的值相对应的行来获得收益,但我认为这是过大的:微小的性能收益与较差的代码可维护性。)

clever101
2楼-- · 2020-09-01 05:34

从ABAP 7.4开始 您可以尝试用LOOP ... GROUP BY直到ean11来查找组大小,然后从那里知道哪些记录是重复的。

因此,对于相同的理想情况,对于较旧的版本,也许在NEW ... AT END 可以做同样的事情。 理想的情况是,您可以通过在AT END事件中检查收集的记录来首先检查ALV的重复记录,将其删除或执行任何操作。

wang628962
3楼-- · 2020-09-01 05:53

很抱歉输入错误,这是原始报告的简化代码,我只写了一个很短的代码就发布了这个问题。 变量的名称与原始报告不同。

您是对的,lt_alv_sort_ean必须具有NON-UNIQUE KEY。 lt_ean_db是lt_mlea_db,我已经修复了。

代码中还有其他错别字,最后一次读取应使用而不是

但是,lt_ean_db和lt_alv_sort不能是同一表。 因为您在lt_alv中没有数据库中的所有记录,所以仅从选择屏幕中进行选择(此代码中未截断)。 用户可以在ALV中手动添加其他新行。 因此,您需要在验证之前从数据库中选择值。 可能是您在ALV中具有来自DB的相同记录,但是值已更改...

一周热门 更多>