ALV报告在海量数据上变得缓慢

2020-08-13 15:30发布

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

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


嗨窥视,

我已经开发了此Z报告。 我面临的问题是,它在25-100种材料上都能正常工作,但是一旦我扩大范围,该报告就需要花费大量时间来处理,并且在大型环境下运行时,我会超时并出现错误 范围。 请帮助我修复代码。 我在这里附上我的代码。

FORM set_data。

选择matnr,werks,lgort,charg,vfdat,hsdat到表@DATA(it_data)中
从matdoc那里matnr输入@so_matnr和werks输入@so_werks和lgort IN @ so_lgort。


在it_data处将其放入数据(ls_data)。
从makt处将单个maktx输入到ls_output-maktx中,将其EQ放在ls_data-matnr中。 。
从mara到ls_output-mtart中选择单个mtart,在mnr EQ ls_data-matnr中选择
从mch1到ls_output-qndat中选择单个qndat。 "添加下一个检查日期
从mchb到ls_output-clabs中选择单个实验室,在其中EQ ls_data-werks和werks EQ ls_data-werks和lgort EQ ls_data-lgort和charg EQ ls_data-charg。
_ss -matnr左删除引导数为'0'。

ls_output-matnr = ls_data-matnr。

ls_output-werks = ls_data-werks。
ls_output-lgort = ls_data-lgort。
ls_output-charg = ls_data-charg。
ls_output-hsdat = ls_data-hsdat。
ls_output-vfdat = ls_data-vfdat。





APPEND ls_output到它_输出 ..

通过matnr charg werks lgort对IT_SORT进行排序。
从it_output中删除相邻的重复文件。
*
ENDLOOP。


ENDFORM。< br>
*&------------------------------------------- -------------------------- *
*&表单build_layout
*&----------- -------------------------------------------------- -------- *
*设置ALV显示的布局
* ---------------------------- ------------------------------------------ *
表格显示_ alv。

*/..为alv
PERFORM get_fieldcatalog设置字段目录。

调用功能'REUSE_ALV_GRID_DISPLAY'
导出
i_callback_program = sy-repid
i_callback_top_of_page ='TOP-OF-PAGE'
is_layout = gs_layout
it_fieldcat = gt_fcat
i_save ='A'
表格
t_outtab = it_output
例外情况
program_error = 1
其他=2。



ENDFORM。

**&------------------- -------------------------------------------------- *
**&表格GET_FIELDCATALOG
**&----------------------------------- ---------------------------------- *
**从字典结构创建字段目录
* * ------------------------------------------------- --------------------- *
**-> p_struc_name结构名称
**-> p_rtname参考表名称
** -> p_repid程序名称
** <-> c_fcat字段目录
** ---------------------------- ------------------------------------------ *
FORM get_fieldcatalog。< br>
清除:gs_fcat。
刷新:gt_fca t。

gs_fcat-col_pos =1。
gs_fcat-fieldname ='MATNR'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='材料编号'。
APPEND将gs_fcat转到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =2。
gs_fcat-fieldname ='MAKTX'。
gs_fcat-tabname ='IT_OUTPUT'。 -seltext_m ='材料说明'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos = 3.
gs_fcat- 字段名称='MTART'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='材料类型'。
gs_fcat-outputlen ='12'。
将gs_fcat附加到gt_fcat。
>清除gs_fcat。

gs_fcat-col_pos = 4.
gs_fcat-fieldname ='CHARG'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='批次'。 br> gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =5。
gs_fcat-fieldname ='WERKS'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='Plant'。
gs_fcat-outputlen ='12'
APPEND将gs_fcat添加到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =6。
gs_fcat-fieldname ='LGORT'。
gs_fcat-tabname ='IT_OUTPUT'。< br> gs_fcat-seltext_m ='存储位置'。
gs_fcat-outputlen ='12'。
将gs_fcat添加到gt_fcat。
清除gs_fcat。



gs_fcat-col_pos = 7 。
gs_fcat-fieldname ='HSDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='制造日期'。
gs_fcat-outputlen ='12'。
APPEND gs_fcat TO gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =8。
gs_fcat-fieldname ='VFDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='到期日期'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =9。
gs_fcat-fieldname = 'QNDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='下次检验日期'。
gs_fcat-outputlen ='12'。
将gs_fcat附加到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =10。
gs_fcat-fieldname ='CLAB S'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='批次数量'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat 。

ENDFORM。

*&--------------------------------- ------------------------------------ *
*&FORM build_HEADER
*&- -------------------------------------------------- ------------------ *
* alv
*的构建标头* ------------------- -------------------------------------------------- -*
FORM页面顶部。

*&------------------------------ --------------------------------------- *
*&常量声明
*&------------------------------------------------ --------------------- *
常量:lc_s类型c值'S',
lc_h类型c值'H'。
< br> *&---------------------------------------------- ----------------------- *
*&本地数据声明
*&------------- -------------------------------------------------- ------ *
DATA:lt_header类型slis_t_listheader,
ls_header类型slis_listheader,
l v_to(2)类型c,
lv_count类型i。



* ----------------------- ---------
*标题
* -------------------------------- -
ls_header-typ ='H'。
ls_header-info ='批处理信息报告'。
将ls_header附加到lt_header。
清除ls_header。

* ---- ----------------------------
*/..追加记录编号
* ------ ----------------------------


描述表it_output行lv_count。

* lv_count =行(it_output)。
*
ls_header-typ = lc_s。
ls_header-key ='记录数:'。
ls_header-info = lv_count。
附录ls_header TO lt_header 。
CLEAR ls_header。


调用功能'REUSE_ALV_COMMENTARY_WRITE'
导出
it_list_commentary = lt_header。

CLEAR lt_header。
ENDFORM。

此致

Hamza

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

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


嗨窥视,

我已经开发了此Z报告。 我面临的问题是,它在25-100种材料上都能正常工作,但是一旦我扩大范围,该报告就需要花费大量时间来处理,并且在大型环境下运行时,我会超时并出现错误 范围。 请帮助我修复代码。 我在这里附上我的代码。

FORM set_data。

选择matnr,werks,lgort,charg,vfdat,hsdat到表@DATA(it_data)中
从matdoc那里matnr输入@so_matnr和werks输入@so_werks和lgort IN @ so_lgort。


在it_data处将其放入数据(ls_data)。
从makt处将单个maktx输入到ls_output-maktx中,将其EQ放在ls_data-matnr中。 。
从mara到ls_output-mtart中选择单个mtart,在mnr EQ ls_data-matnr中选择
从mch1到ls_output-qndat中选择单个qndat。 "添加下一个检查日期
从mchb到ls_output-clabs中选择单个实验室,在其中EQ ls_data-werks和werks EQ ls_data-werks和lgort EQ ls_data-lgort和charg EQ ls_data-charg。
_ss -matnr左删除引导数为'0'。

ls_output-matnr = ls_data-matnr。

ls_output-werks = ls_data-werks。
ls_output-lgort = ls_data-lgort。
ls_output-charg = ls_data-charg。
ls_output-hsdat = ls_data-hsdat。
ls_output-vfdat = ls_data-vfdat。





APPEND ls_output到它_输出 ..

通过matnr charg werks lgort对IT_SORT进行排序。
从it_output中删除相邻的重复文件。
*
ENDLOOP。


ENDFORM。< br>
*&------------------------------------------- -------------------------- *
*&表单build_layout
*&----------- -------------------------------------------------- -------- *
*设置ALV显示的布局
* ---------------------------- ------------------------------------------ *
表格显示_ alv。

*/..为alv
PERFORM get_fieldcatalog设置字段目录。

调用功能'REUSE_ALV_GRID_DISPLAY'
导出
i_callback_program = sy-repid
i_callback_top_of_page ='TOP-OF-PAGE'
is_layout = gs_layout
it_fieldcat = gt_fcat
i_save ='A'
表格
t_outtab = it_output
例外情况
program_error = 1
其他=2。



ENDFORM。

**&------------------- -------------------------------------------------- *
**&表格GET_FIELDCATALOG
**&----------------------------------- ---------------------------------- *
**从字典结构创建字段目录
* * ------------------------------------------------- --------------------- *
**-> p_struc_name结构名称
**-> p_rtname参考表名称
** -> p_repid程序名称
** <-> c_fcat字段目录
** ---------------------------- ------------------------------------------ *
FORM get_fieldcatalog。< br>
清除:gs_fcat。
刷新:gt_fca t。

gs_fcat-col_pos =1。
gs_fcat-fieldname ='MATNR'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='材料编号'。
APPEND将gs_fcat转到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =2。
gs_fcat-fieldname ='MAKTX'。
gs_fcat-tabname ='IT_OUTPUT'。 -seltext_m ='材料说明'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos = 3.
gs_fcat- 字段名称='MTART'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='材料类型'。
gs_fcat-outputlen ='12'。
将gs_fcat附加到gt_fcat。
>清除gs_fcat。

gs_fcat-col_pos = 4.
gs_fcat-fieldname ='CHARG'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='批次'。 br> gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =5。
gs_fcat-fieldname ='WERKS'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='Plant'。
gs_fcat-outputlen ='12'
APPEND将gs_fcat添加到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =6。
gs_fcat-fieldname ='LGORT'。
gs_fcat-tabname ='IT_OUTPUT'。< br> gs_fcat-seltext_m ='存储位置'。
gs_fcat-outputlen ='12'。
将gs_fcat添加到gt_fcat。
清除gs_fcat。



gs_fcat-col_pos = 7 。
gs_fcat-fieldname ='HSDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='制造日期'。
gs_fcat-outputlen ='12'。
APPEND gs_fcat TO gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =8。
gs_fcat-fieldname ='VFDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='到期日期'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =9。
gs_fcat-fieldname = 'QNDAT'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='下次检验日期'。
gs_fcat-outputlen ='12'。
将gs_fcat附加到gt_fcat。
清除gs_fcat。

gs_fcat-col_pos =10。
gs_fcat-fieldname ='CLAB S'。
gs_fcat-tabname ='IT_OUTPUT'。
gs_fcat-seltext_m ='批次数量'。
gs_fcat-outputlen ='12'。
追加gs_fcat至gt_fcat。
清除gs_fcat 。

ENDFORM。

*&--------------------------------- ------------------------------------ *
*&FORM build_HEADER
*&- -------------------------------------------------- ------------------ *
* alv
*的构建标头* ------------------- -------------------------------------------------- -*
FORM页面顶部。

*&------------------------------ --------------------------------------- *
*&常量声明
*&------------------------------------------------ --------------------- *
常量:lc_s类型c值'S',
lc_h类型c值'H'。
< br> *&---------------------------------------------- ----------------------- *
*&本地数据声明
*&------------- -------------------------------------------------- ------ *
DATA:lt_header类型slis_t_listheader,
ls_header类型slis_listheader,
l v_to(2)类型c,
lv_count类型i。



* ----------------------- ---------
*标题
* -------------------------------- -
ls_header-typ ='H'。
ls_header-info ='批处理信息报告'。
将ls_header附加到lt_header。
清除ls_header。

* ---- ----------------------------
*/..追加记录编号
* ------ ----------------------------


描述表it_output行lv_count。

* lv_count =行(it_output)。
*
ls_header-typ = lc_s。
ls_header-key ='记录数:'。
ls_header-info = lv_count。
附录ls_header TO lt_header 。
CLEAR ls_header。


调用功能'REUSE_ALV_COMMENTARY_WRITE'
导出
it_list_commentary = lt_header。

CLEAR lt_header。
ENDFORM。

此致

Hamza

付费偷看设置
发送
6条回答
小灯塔
1楼 · 2020-08-13 16:08.采纳回答

你好 Kawish Nadeem

始终避免在循环中执行SELECT SINGLE。 替换以下代码:

 FORM set_data。
 SELECT matnr,werks,lgort,charg,vfdat,hsdat插入表@DATA(it_data)
 从matdoc那里,在@so_matnr中有matnr,在@so_werks中有werks,在@so_lgort中有lgort。

 循环到it_data INTO DATA(ls_data)。
 从MATCH到ls_output-maktx中选择单个maktx,在其中将EQ ls_data-matnr放在EQ中。
 从mara到ls_output-mtart中选择单个mtart,在哪里EQ ls_data-matnr。
 从mch1中将单个qndat选择到ls_output-qndat中,在其中将EQ ls_data-matnr和charg EQ ls_data-charg均衡。  "添加下一个检验日期
 从mchb中将单个表选择到ls_output-clabs中,其中EQ ls_data-matnr和Werks EQ ls_data-werks和lgort EQ ls_data-lgort和charg EQ ls_data-charg在其中。

 SHIFT ls_data-matnr左边删除为0。

 ls_output-matnr = ls_data-matnr。

 ls_output-werks = ls_data-werks。
 ls_output-lgort = ls_data-lgort。
 ls_output-charg = ls_data-charg。
 ls_output-hsdat = ls_data-hsdat。
 ls_output-vfdat = ls_data-vfdat。
 追加ls_output到it_output ..

 SORT it_output由matnr charg致敬lgort。
 从it_output中删除相邻的副本比较wrks lgort charg。
 *
 结局。
 ENDFORM。
 

与此:

 FORM set_data。
   选择matnr,werks,lgort,charg,vfdat,hsdat
     插入表@DATA(it_data)
     来自matdoc
     在@so_matnr中的matnr
       和在@so_werks中怪诞
       和lgort输入@so_lgort。
   检查sy-subrc = 0。

   SELECT Matnr,Maktx
     从MAkt到表@DATA(lt_maktx)
     对于@it_data中的所有条目
     matnr EQ @ it_data-matnr在哪里。

   SELECT Matnr,mtart
     从马拉
     插入表@DATA(lt_mtart)
     对于@it_data中的所有条目
     matnr EQ @ it_data-matnr在哪里。

   SELECT matnr,charg,qndat
     从mch1
     插入表@DATA(lt_qndat)
     对于@it_data中的所有条目
     在哪里matnr EQ @ it_data-matnr
       AND charg EQ @ it_data-charg。  "添加下一个检验日期

   SELECT matnr,werks,lgort,charg,clabs
     从mchb
     插入表@DATA(lt_clabs)
     对于@it_data中的所有条目
     在哪里matnr EQ @ it_data-matnr
       AND表示EQ @ it_data-werks
       与lgort EQ @ it_data-lgort
       AND charg EQ @ it_data-charg。

   循环到it_data INTO DATA(ls_data)。
     清除ls_output。
     SHIFT ls_data-matnr左边删除为0。
     ls_output-matnr = ls_data-matnr。
     ls_output-werks = ls_data-werks。
     ls_output-lgort = ls_data-lgort。
     ls_output-charg = ls_data-charg。
     ls_output-hsdat = ls_data-hsdat。
     ls_output-vfdat = ls_data-vfdat。

     读取表lt_maktx参考到数据(ld_maktx)
       WITH KEY matnr = ls_data-matnr。
     如果sy-subrc = 0。
       ls_output-maktx = ld_maktx-> maktx。
     万一。

     读取表lt_mtart参考数据(ld_mtart)
       WITH KEY matnr = ls_data-matnr。
     如果sy-subrc = 0。
       ls_output-mtart = ld_mtart-> mtart。
     万一。

     读取表lt_qndat参考到数据(ld_qndat)
       WITH KEY matnr = ls_data-matnr
                charg = ls_data-charg。
     如果sy-subrc = 0。
       ls_output-qndat = ld_qndat-> qndat。
     万一。

     读取表lt_clabs参考数据(ld_clabs)
       WITH KEY matnr = ls_data-matnr
                werks = ls_data-werks
                lgort = ls_data-lgort
                charg = ls_data-charg。
     如果sy-subrc = 0。
       ls_output-clabs = ld_clabs-> clabs。
     万一。

     附加ls_output到it_output。
   结局。

   SORT it_output由matnr charg致敬lgort。
   从it_output中删除相邻的副本比较wrks lgort charg。
 ENDFORM。
 

如果在SELECT语句之前定义LT_MAKTX,LT_MTART,LT_QNDAT和LT_CLABS内部表并将它们定义为已排序/已哈希,则可以使性能更好。

亲切的问候,

Mateusz

哎,真难
2楼-- · 2020-08-13 16:14

您应该首先学习如何使用SAT定位有问题的语句。

SAP砖家
3楼-- · 2020-08-13 16:15

Hello Kawish,

请务必遵循有关如何加快SELECT语句速度的建议(如Frederic和Sandra所述,SAT是一个不错的起点),但是当它要显示大量记录时,我经历过REUSE_ALV_GRID_DISPLAY会变慢。

看看哪个部分在消耗更多时间,提取数据或显示数据?

Baoming ROSE
4楼-- · 2020-08-13 16:23

Kawish Nadeem

请使用CODE Option发布代码

My梦
5楼-- · 2020-08-13 15:59

我记得在团队建设中有一场比赛。 我们需要优化将纸牌游戏放在桌子上的方式。

最后,领导者问我:"您确定已经优化了真正需要花费的时间吗?"

在优化中总是如此,首先分析了需要花费的时间,然后 什么可以优化。 而不是花时间进行不必要的重构。

悠然的二货
6楼-- · 2020-08-13 16:08

亲爱的 Mateusz Adamus

问题出在这一行。 现在工作正常。 非常感谢您的帮助!

 SHIFT ls_data-matnr左删除领先'0'。

一周热门 更多>