如何在表的动态选择中实现并行处理

2020-08-31 10:49发布

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

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


我有这个要求,我应该能够从选择屏幕中动态选择表及其字段,并通过文件拆分来下载数据。但是由于下载需要大量时间,我想在我的系统中实现并行处理 代码。那么如何在下面的代码中实现并行处理?

报告zaa_fdatexta1。

表:dd02l。
DATA:ls_fieldcat类型slis_fieldcat_alv,
lt_fieldcat类型slis_t_fieldcat_alv,
ls_fieldcatlog类型slis_fieldcat_alv,
lt TYPE slis_layout_alv。

DATA:w_dref TYPE REF TO数据。
FIELD-SYMBOLS: TYPE STANDARD TABLE,"动态内部表,用于从数据库读取数据。
TYPE TYPE。

数据:w_dref1对数据的类型引用。
字段符号: TYPE STANDARD TABLE,"该表将从t_itab加载1000条记录。
TYPE ANY。
< br>类型:ty_header的开头,"以在xlsx文件中创建字段头。
fname(100)TYPE c,
ty_header的末尾。

数据:it_header ty_header的类型表,
wa_header TYPE ty_header。

数据:inttab OCCURS 100的开头。"表读取给定表的文件
包含结构dfies。
数据:选中TYPE复选框。 "用于检查选定字段条件的附加字段
数据:inttab的结尾。

数据:wa_tab类似于inttab的行。

类型:BEGIN OF ty_int1,"用于选择字段的结构 在选择屏幕上
字段名TYPE字段名,
ty_int1的结尾。

数据:inttab1 ty_int1的类型表,"以加载给定数据库表的字段名。
wa_tab1类似于LINE OF inttab1。


参数:p_table类型dd02l-tabname强制默认值'MARA'。
参数:count TYPE i默认值'1000'。
参数:p_file类似于rlgrap文件名。 >参数:p_enable作为复选框默认值''用户命令uc1。
gv_rc类型i。
调用方法cl_gui_frontend_services => file_open_dialog
导出
window_title ='选择文件'
更改
file_table = gt_file_table
rc = gv_rc。
如果sy-subrc =0。
读取表g t_file_table INTO gwa_file_table INDEX 1.
p_file = gwa_file_table-filename。
ENDIF。

在选择屏幕输出处。


IF p_enable ='X'。 > CALL FUNCTION'DDIF_FIELDINFO_GET'"以获取表字段信息
导出
标签名= p_table

langu = sy-langu

表格
dfies_tab = inttab
< br> EXCEPTIONS
not_found = 1
internal_error = 2
其他=3。


PERFORM popup_display。

ENDIF。

*& -------------------------------------------------- ------------------- *
*&表格popup_display
*&------------------ -------------------------------------------------- -*
*文本
* --------------------------------------- ------------------------------- *
FORM popup_display。

*用于弹出选择的字段目录
清除ls_fieldcat。
ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='1'。
ls_fieldcat-fieldname ='CHECK'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='SELECT'。< br>附加ls_fieldcat至lt_fieldcat。
清除ls_fieldcat。


ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='2'。
ls_fieldcat-fieldname ='FIELDNAME'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='FIELDNAME'。
ls_fieldcat-outputlen =50。
附加ls_fieldcat到lt_fieldcat。

ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='3'。
ls_fieldcat-fieldname ='FIELDTEXT'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='DESCRIPTION'。
附加ls_fieldcat到lt_fieldcat。
清除ls_fieldcat。

*在POPUP中显示数据以选择字段
调用功能'REUSE_ALV_POPUP_TO_SELECT'
导出
i_zebra ='X'
it_fieldcat = lt_fieldcat
i_tabname ='INTTAB'
i_checkbox_fieldname ='CHECK'

t_outtab = inttab。
清除p_enable。

ENDFORM。 " popup_display

选择开始。

PERFORM选择
PERFORM下载。

*&------------- -------------------------------------------------- ------ *
*&形式SELEC
*&------------------------------- -------------------------------------- *
*文字
*- -------------------------------------------------- ------------------ *
*-> p1文本
* <-p2文本
* --------- -------------------------------------------------- ----------- *
格式选择。

创建数据w_dref类型标准表(p_table)。" 指向数据库表的结构
ASSIGN w_dref-> *至

创建数据w_dref1类型标准表(p_table)。 " 指向数据库表的结构
ASSIGN w_dref1-> * TO


IF sy-subrc EQ0。
数据:lv_temp TYPE字符串。 br> LOOP AT inttab INTO wa_tab WHERE check ='X'。"从inttab到inttab1选择字段名称

并按空格分隔lv_temp wa_tab-fieldname INTO lv_temp。

移动wa_tab-fieldname TO wa_header。
将wa_header附加到it_header。
清除:wa_tab,wa_header。
ENDLOOP。

从(p_table)
选择(lv_temp)
进入表的对应字段。

将inttab1循环到wa_tab1。

ENDLOOP。
ENDIF。


ENDFORM。
*&--------- -------------------------------------------------- ---------- *
*&表格下载
*&--------------------------- ------------------------------------------ *
*文字
* ------------------------------------------------ ---------------------- *
*-> p1文本
* <-p2文本
* ----- -------------------------------------------------- ------------ --- *
FORM下载。
数据:cnt TYPE字符串。 "以在fi_itab
DATA中加载n条记录:d TYPE字符串。"以创建多个excel e.x文件。 export1 export2 ....
数据:文件类型字符串。 "将p_file转换为字符串
file = p_file。
cnt =0。

LOOP AT ASSIGNING 。"包含所有记录的原始表

ASSIGN TO
追加 TO
cnt = cnt + 1.
*
如果cnt eq计数。
d = d + 1.
数据:lv_string1类型的字符串,lv_string2类型的字符串。
*
file = p_file。
在'。'处拆分p_file。 放入lv_string1 lv_string2。
合并lv_string1'_'d'。 lv_string2到文件中。
调用功能'GUI_DOWNLOAD'
导出

文件名=文件
文件类型='DAT'
附加='X'
write_field_separator ='X'< br> TABLES
data_tab =
字段名称= it_header


IF sy-subrc <> 0.

ENDIF。

< br>
cnt =0。
分配循环
删除
ENDLOOP。
ENDIF。

ENDLOOP。
>





ENDFORM。

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

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


我有这个要求,我应该能够从选择屏幕中动态选择表及其字段,并通过文件拆分来下载数据。但是由于下载需要大量时间,我想在我的系统中实现并行处理 代码。那么如何在下面的代码中实现并行处理?

报告zaa_fdatexta1。

表:dd02l。
DATA:ls_fieldcat类型slis_fieldcat_alv,
lt_fieldcat类型slis_t_fieldcat_alv,
ls_fieldcatlog类型slis_fieldcat_alv,
lt TYPE slis_layout_alv。

DATA:w_dref TYPE REF TO数据。
FIELD-SYMBOLS: TYPE STANDARD TABLE,"动态内部表,用于从数据库读取数据。
TYPE TYPE。

数据:w_dref1对数据的类型引用。
字段符号: TYPE STANDARD TABLE,"该表将从t_itab加载1000条记录。
TYPE ANY。
< br>类型:ty_header的开头,"以在xlsx文件中创建字段头。
fname(100)TYPE c,
ty_header的末尾。

数据:it_header ty_header的类型表,
wa_header TYPE ty_header。

数据:inttab OCCURS 100的开头。"表读取给定表的文件
包含结构dfies。
数据:选中TYPE复选框。 "用于检查选定字段条件的附加字段
数据:inttab的结尾。

数据:wa_tab类似于inttab的行。

类型:BEGIN OF ty_int1,"用于选择字段的结构 在选择屏幕上
字段名TYPE字段名,
ty_int1的结尾。

数据:inttab1 ty_int1的类型表,"以加载给定数据库表的字段名。
wa_tab1类似于LINE OF inttab1。


参数:p_table类型dd02l-tabname强制默认值'MARA'。
参数:count TYPE i默认值'1000'。
参数:p_file类似于rlgrap文件名。 >参数:p_enable作为复选框默认值''用户命令uc1。
gv_rc类型i。
调用方法cl_gui_frontend_services => file_open_dialog
导出
window_title ='选择文件'
更改
file_table = gt_file_table
rc = gv_rc。
如果sy-subrc =0。
读取表g t_file_table INTO gwa_file_table INDEX 1.
p_file = gwa_file_table-filename。
ENDIF。

在选择屏幕输出处。


IF p_enable ='X'。 > CALL FUNCTION'DDIF_FIELDINFO_GET'"以获取表字段信息
导出
标签名= p_table

langu = sy-langu

表格
dfies_tab = inttab
< br> EXCEPTIONS
not_found = 1
internal_error = 2
其他=3。


PERFORM popup_display。

ENDIF。

*& -------------------------------------------------- ------------------- *
*&表格popup_display
*&------------------ -------------------------------------------------- -*
*文本
* --------------------------------------- ------------------------------- *
FORM popup_display。

*用于弹出选择的字段目录
清除ls_fieldcat。
ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='1'。
ls_fieldcat-fieldname ='CHECK'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='SELECT'。< br>附加ls_fieldcat至lt_fieldcat。
清除ls_fieldcat。


ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='2'。
ls_fieldcat-fieldname ='FIELDNAME'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='FIELDNAME'。
ls_fieldcat-outputlen =50。
附加ls_fieldcat到lt_fieldcat。

ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='3'。
ls_fieldcat-fieldname ='FIELDTEXT'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='DESCRIPTION'。
附加ls_fieldcat到lt_fieldcat。
清除ls_fieldcat。

*在POPUP中显示数据以选择字段
调用功能'REUSE_ALV_POPUP_TO_SELECT'
导出
i_zebra ='X'
it_fieldcat = lt_fieldcat
i_tabname ='INTTAB'
i_checkbox_fieldname ='CHECK'

t_outtab = inttab。
清除p_enable。

ENDFORM。 " popup_display

选择开始。

PERFORM选择
PERFORM下载。

*&------------- -------------------------------------------------- ------ *
*&形式SELEC
*&------------------------------- -------------------------------------- *
*文字
*- -------------------------------------------------- ------------------ *
*-> p1文本
* <-p2文本
* --------- -------------------------------------------------- ----------- *
格式选择。

创建数据w_dref类型标准表(p_table)。" 指向数据库表的结构
ASSIGN w_dref-> *至

创建数据w_dref1类型标准表(p_table)。 " 指向数据库表的结构
ASSIGN w_dref1-> * TO


IF sy-subrc EQ0。
数据:lv_temp TYPE字符串。 br> LOOP AT inttab INTO wa_tab WHERE check ='X'。"从inttab到inttab1选择字段名称

并按空格分隔lv_temp wa_tab-fieldname INTO lv_temp。

移动wa_tab-fieldname TO wa_header。
将wa_header附加到it_header。
清除:wa_tab,wa_header。
ENDLOOP。

从(p_table)
选择(lv_temp)
进入表的对应字段。

将inttab1循环到wa_tab1。

ENDLOOP。
ENDIF。


ENDFORM。
*&--------- -------------------------------------------------- ---------- *
*&表格下载
*&--------------------------- ------------------------------------------ *
*文字
* ------------------------------------------------ ---------------------- *
*-> p1文本
* <-p2文本
* ----- -------------------------------------------------- ------------ --- *
FORM下载。
数据:cnt TYPE字符串。 "以在fi_itab
DATA中加载n条记录:d TYPE字符串。"以创建多个excel e.x文件。 export1 export2 ....
数据:文件类型字符串。 "将p_file转换为字符串
file = p_file。
cnt =0。

LOOP AT ASSIGNING 。"包含所有记录的原始表

ASSIGN TO
追加 TO
cnt = cnt + 1.
*
如果cnt eq计数。
d = d + 1.
数据:lv_string1类型的字符串,lv_string2类型的字符串。
*
file = p_file。
在'。'处拆分p_file。 放入lv_string1 lv_string2。
合并lv_string1'_'d'。 lv_string2到文件中。
调用功能'GUI_DOWNLOAD'
导出

文件名=文件
文件类型='DAT'
附加='X'
write_field_separator ='X'< br> TABLES
data_tab =
字段名称= it_header


IF sy-subrc <> 0.

ENDIF。

< br>
cnt =0。
分配循环
删除
ENDLOOP。
ENDIF。

ENDLOOP。
>





ENDFORM。

付费偷看设置
发送
5条回答
1楼-- · 2020-08-31 11:37

您能详细说明一下并行处理的含义吗? 或者,也许最好告诉您所面临的确切问题是程序运行缓慢吗? 还是SQL需要花很多时间才能获取记录

我认为存在SQL性能问题是因为没有" WHERE"语句。尤其是在使用HANA时,基本SQL会进行精益处理(仅选择所需的内容,以及仅选择所需的字段) ,但也只会提取您需要的记录)。 您的SQL将为所选表中的所有记录获取一组列。添加WHERE语句可能会大大降低性能问题

kr

SAP砖家
2楼-- · 2020-08-31 11:56

有人可以告诉我如何从上述代码的选择屏幕中选择多个表,因为我在这里只处理单个表。

SAP浪
3楼-- · 2020-08-31 11:45
< p>尝试下面的代码,使用光标读取并下载数据块

表格:dd02l。
数据:ls_fieldcat TYPE slis_fieldcat_alv,
lt_fieldcat类型slis_t_fieldcat_alv,
ls_fieldcatlog类型slis_fieldcat_alv,
lt_fieldcatlog类型slis_t_fieldcat_alv,
lt_layout类型slis_layout_alv。

数据:w_dref TYPE REF TO数据。
FIELD-SYMBOLS: TYPE STANDARD TABLE,"用于从数据库读取数据的动态内部表
TYPE任意。

数据:w_dref1类型参考数据。
FIELD-SYMBOLS: TYPE STANDARD TABLE,"表,用于从t_itab加载1000条记录
TYPE任意。

类型:开始于ty_header,"以在xlsx文件中创建字段标题。
fname(100)TYPE c,
结束于ty_header。

数据:ty_header的it_header类型表,
wa_header TYPE ty_header。

数据:inttab OCCURS 100的开头。"表读取给定表的文件
包含结构dfies。
数据:选中类型复选框。 "用于检查所选字段条件的附加字段
数据:inttab的结尾。

数据:wa_tab与inttab类似。

类型:BEGIN OF ty_int1,"用于在选择屏幕上选择字段的结构
字段名TYPE字段名,
结束于ty_int1。

数据:inttab1类型表ty_int1,"以加载给定数据库表的字段名称。
wa_tab1与inttab1类似。

数据:d TYPE字符串。 "以创建excel e.x的多个文件。export1 export2 ....

参数:p_table类型dd02l-tabname强制默认'MARA'。
参数:计数TYPE i默认值" 1000"。
参数:p_file像rlgrap-文件名。
参数:p_enable AS CHECKBOX DEFAULT''USER-COMMAND uc1。


在p_file值请求的选择屏幕上。
数据:gt_file_table TYPE文件表,
gwa_file_table TYPE文件表,
gv_rc TYPE i。
呼叫方法cl_gui_frontend_services => file_open_dialog
出口
window_title ='选择文件'
改变
file_table = gt_file_table
rc = gv_rc。
如果sy-subrc =0。
读取表gt_file_table INTO gwa_file_table索引1。
p_file = gwa_file_table-filename。
ENDIF。

在选择屏幕输出时。


IF p_enable ='X'。
CALL FUNCTION'DDIF_FIELDINFO_GET'"以获取表字段信息
出口
tabname = p_table
langu = sy-langu
表格
dfies_tab = inttab
例外情况
not_found = 1
internal_error = 2
其他=3。


执行popup_display。

ENDIF。

*&------------------------------------------------ --------------------- *
* *&FORM popup_display
* *&----------------------------------------------- ---------------------- *
* *文字
* * ------------------------------------------------ ---------------------- *
FORM popup_display。

*用于弹出选择的字段目录
清除ls_fieldcat。
ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='1'。
ls_fieldcat-fieldname ='CHECK'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='SELECT'。
追加ls_fieldcat至lt_fieldcat。
清除ls_fieldcat。


ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='2'。
ls_fieldcat-fieldname ='FIELDNAME'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='FIELDNAME'。
ls_fieldcat-outputlen =50。
追加ls_fieldcat至lt_fieldcat。

ls_fieldcat-row_pos ='1'。
ls_fieldcat-col_pos ='3'。
ls_fieldcat-fieldname ='FIELDTEXT'。
ls_fieldcat-tabname ='INTTAB'。
ls_fieldcat-seltext_m ='DESCRIPTION'。
追加ls_fieldcat至lt_fieldcat。
清除ls_fieldcat。

*在用于选择字段的弹出窗口中显示数据
通话功能'REUSE_ALV_POPUP_TO_SELECT'
出口
i_zebra ='X'
it_fieldcat = lt_fieldcat
i_tabname ='INTTAB'
i_checkbox_fieldname ='CHECK'
表格
t_outtab = inttab。
清除p_enable。

ENDFORM。 " popup_display

选择开始。

执行选择
进行下载。

*&------------------------------------------------ --------------------- *
*&FORM selec
*&------------------------------------------------ --------------------- *
*文字
* ------------------------------------------------- --------------------- *
*-> p1文字
* * <-p2文字
* * ------------------------------------------------ ---------------------- *
表格选择

DATA C1 TYPE光标。

创建数据w_dref类型标准表(p_table)。 " 指向数据库表的结构
ASSIGN w_dref-> *至

创建数据w_dref1类型标准表(p_table)。 " 指向数据库表的结构
ASSIGN w_dref1-> *至


IF sy-subrc EQ0。
数据:lv_temp TYPE字符串。
LOOP AT inttab INTO wa_tab WHERE检查='X'。 "从inttab到inttab1选择字段名称

合并lv_temp wa_tab字段名INTO lv_temp按空格分隔。

将wa_tab-fieldname移动到wa_header。
将wa_header附加到it_header。
清除:wa_tab,wa_header。
ENDLOOP。


打开光标@ c1以从(p_table)选择(lv_temp)到@count行。
做。
在表@ 的对应字段中获取下一个光标@ c1。
IF sy-subrc NE0。
退出。
ELSE。
进行下载。
ENDIF。

ENDDO。

关闭光标@ c1。
* LOOP AT inttab1 INTO wa_tab1。
*
* ENDLOOP。
ENDIF。


ENDFORM。
*&------------------------------------------------ --------------------- *
*&表格下载
*&------------------------------------------------ --------------------- *
*文字
* ------------------------------------------------- --------------------- *
*-> p1文字
* <-p2文字
* ------------------------------------------------- --------------------- *
表格下载。
数据:cnt TYPE字符串。 "以将n个记录加载到fi_itab
* DATA:d TYPE字符串。 "以创建excel e.x的多个文件。export1 export2 ....
数据:文件类型字符串。 "将p_file转换为字符串
文件= p_file。
* cnt =0。

d = d + 1.
数据:lv_string1 TYPE字符串,lv_string2 TYPE字符串。
*
文件= p_file。
分割p_file AT'。 INTO lv_string1 lv_string2。
CONCATENATE lv_string1'_'d'。' lv_string2 INTO文件。
通话功能'GUI_DOWNLOAD'
出口
文件名=文件
文件类型='DAT'
append ='X'
write_field_separator ='X'
表格
data_tab =
字段名称= it_header。
如果sy-subrc <> 0.

ENDIF。

ENDFORM。
Bunny_CDM
4楼-- · 2020-08-31 11:42

Alve 请不要混淆几个不同的问题 ,再问一个问题。