多重选择屏幕的问题
Problems with multiple selection screens
START-OF-SELECTION
在我的程序中没有被触发。我正在尝试使用 ABAP 中的多个 selection 屏幕根据书名和书作者获取书籍详细信息。有两个按钮,基于这些按钮 select 打开离子屏幕。当我单击任何按钮时,selection 屏幕就会打开。但是在我从下拉列表中输入 select 项并单击执行按钮后,事务将转到带有按钮的初始屏幕。根本不显示书籍详细信息。 START-OF-SELECTION
未触发。请帮忙,我是ABAP的新手。这是我的程序
REPORT y_multiple_screen.
TABLES: sscrfields.
TYPE-POOLS: vrm.
DATA: param TYPE vrm_id,
values TYPE vrm_values,
wa_value LIKE LINE OF values.
DATA: it_ybook TYPE TABLE OF ybook,
wa_ybook TYPE ybook.
FIELD-SYMBOLS: <fs_book> TYPE ybook.
SELECTION-SCREEN BEGIN OF BLOCK blocker WITH FRAME TITLE text-001 NO INTERVALS.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (30) w_butn1 USER-COMMAND but1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (30) w_butn2 USER-COMMAND but2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK blocker.
SELECTION-SCREEN BEGIN OF SCREEN 1100.
PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20.
SELECTION-SCREEN END OF SCREEN 1100.
SELECTION-SCREEN BEGIN OF SCREEN 1200.
PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20.
SELECTION-SCREEN END OF SCREEN 1200.
INITIALIZATION.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
"At selection-screen output.
AT SELECTION-SCREEN.
IF sscrfields-ucomm EQ 'BUT1'.
CALL SELECTION-SCREEN 1100.
ELSEIF sscrfields-ucomm EQ 'BUT2'.
CALL SELECTION-SCREEN 1200.
ENDIF.
AT SELECTION-SCREEN OUTPUT.
CLEAR it_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook.
CLEAR values.
CLEAR wa_ybook.
CLEAR wa_value.
LOOP AT it_ybook INTO wa_ybook.
wa_value-key = wa_ybook-book_author.
wa_value-text = wa_ybook-book_author.
APPEND wa_value TO values.
CLEAR wa_ybook.
CLEAR wa_value.
ENDLOOP.
CLEAR it_ybook.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_AUTHOR'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
CLEAR it_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook.
"CLEAR values.
CLEAR wa_ybook.
CLEAR wa_value.
LOOP AT it_ybook INTO wa_ybook.
wa_value-key = wa_ybook-book_name.
wa_value-text = wa_ybook-book_name.
APPEND wa_value TO values.
CLEAR wa_ybook.
CLEAR wa_value.
ENDLOOP.
CLEAR it_ybook.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_BNAME'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
START-OF-SELECTION.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
CLEAR it_ybook.
CLEAR wa_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook
WHERE book_name = p_bname.
LOOP AT it_ybook INTO wa_ybook.
WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price.
CLEAR wa_ybook.
ENDLOOP.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
CLEAR it_ybook.
CLEAR wa_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook
WHERE book_author = p_author.
LOOP AT it_ybook INTO wa_ybook.
WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price.
CLEAR wa_ybook.
ENDLOOP.
START-OF-SELECTION
只会触发您的主屏幕(当您在第一个屏幕上点击执行时)。
您可以通过更改 AT SELECTION-SCREEN
块来强制执行此事件:
AT SELECTION-SCREEN.
IF sscrfields-ucomm EQ 'BUT1'.
CALL SELECTION-SCREEN 1100.
if sy-subrc = 0. "the user clicked the execute button
sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute
endif.
ELSEIF sscrfields-ucomm EQ 'BUT2'.
CALL SELECTION-SCREEN 1200.
if sy-subrc = 0. "the user clicked the execute button
sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute
endif.
ENDIF.
你完全可以在没有 START-OF-SELECTION
阻塞的情况下实现这一点。
首先,将用户命令添加到您的参数中:
PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND auth.
PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND name.
然后将您的下拉编码移动到 INITIALIZATION
块:
INITIALIZATION.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
CLEAR it_ybook.
SELECT *
FROM ybook
...
...
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_BNAME'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
然后像这样更正 AT-SELECTION-SCREEN
事件:
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'BUT1'.
CALL SELECTION-SCREEN 1100.
WHEN 'BUT2'.
CALL SELECTION-SCREEN 1200.
WHEN 'AUTH'.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
SUPPRESS DIALOG.
WHEN 'NAME'.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
SUPPRESS DIALOG.
WHEN OTHERS.
ENDCASE.
并将您的输出编码也放在这里。您的列表将在下拉列表中选择值时立即输出。
请记住,选择屏幕参数默认转换为大写,因此您的输出选择将 return 上面给定形式中没有行。因此,为了正确使用,您应该像这样将它们转换为小写字母:
TRANSLATE p_author TO LOWER CASE.
更新:
LEAVE-TO-LIST-PROCESSING
statement interrupts the current Dynpro sequence processing (but finishes the current Dynpro!) and switches to lists that were buffered on AS until that moment. You should learn more about list processing here. This technique is treated obsolete, but, as you chose it, you should definitely know it:) SET PF-STATUS space
sets default dialog status for lists. You can learn about dialog statuses from the documentation.
关于你的代码,你可以将 2 个循环语句合并到一。另一个建议是完全消除输出期间的数据库选择:您不在此处进行任何数据修改,因此数据在 INITIALIZATION
块后不会更改。最后,您可以加强对 field-symbols 的使用,因为与工作区相比,它们消耗的资源更少。所以你的代码应该是这样的:
初始化。
TYPE-POOLS: vrm.
DATA: it_ybook TYPE TABLE OF ybook.
DATA: param TYPE vrm_id,
values_auth TYPE vrm_values,
values_name TYPE vrm_values,
wa_value_auth TYPE LINE OF vrm_values,
wa_value_name TYPE LINE OF vrm_values.
FIELD-SYMBOLS: <fs_ybook> TYPE ybook.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
CLEAR: it_ybook, wa_value_auth, wa_value_name.
SELECT *
FROM ybook
INTO TABLE it_ybook.
LOOP AT it_ybook ASSIGNING <fs_ybook>.
wa_value_auth-key = <fs_ybook>-book_author.
wa_value_auth-text = <fs_ybook>-book_author.
wa_value_name-key = <fs_ybook>-book_name.
wa_value_name-text = <fs_ybook>-book_name.
APPEND wa_value_auth TO values_auth.
APPEND wa_value_name TO values_name.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES' "for authors
CALL FUNCTION 'VRM_SET_VALUES' "for names
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
...
ENDCASE.
TRANSLATE P_BNAME TO LOWER CASE.
LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_name = P_BNAME.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price.
ENDLOOP.
TRANSLATE P_AUTHOR TO LOWER CASE.
LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_author = P_AUTHOR.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price.
ENDLOOP.
START-OF-SELECTION
在我的程序中没有被触发。我正在尝试使用 ABAP 中的多个 selection 屏幕根据书名和书作者获取书籍详细信息。有两个按钮,基于这些按钮 select 打开离子屏幕。当我单击任何按钮时,selection 屏幕就会打开。但是在我从下拉列表中输入 select 项并单击执行按钮后,事务将转到带有按钮的初始屏幕。根本不显示书籍详细信息。 START-OF-SELECTION
未触发。请帮忙,我是ABAP的新手。这是我的程序
REPORT y_multiple_screen.
TABLES: sscrfields.
TYPE-POOLS: vrm.
DATA: param TYPE vrm_id,
values TYPE vrm_values,
wa_value LIKE LINE OF values.
DATA: it_ybook TYPE TABLE OF ybook,
wa_ybook TYPE ybook.
FIELD-SYMBOLS: <fs_book> TYPE ybook.
SELECTION-SCREEN BEGIN OF BLOCK blocker WITH FRAME TITLE text-001 NO INTERVALS.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (30) w_butn1 USER-COMMAND but1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (30) w_butn2 USER-COMMAND but2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK blocker.
SELECTION-SCREEN BEGIN OF SCREEN 1100.
PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20.
SELECTION-SCREEN END OF SCREEN 1100.
SELECTION-SCREEN BEGIN OF SCREEN 1200.
PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20.
SELECTION-SCREEN END OF SCREEN 1200.
INITIALIZATION.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
"At selection-screen output.
AT SELECTION-SCREEN.
IF sscrfields-ucomm EQ 'BUT1'.
CALL SELECTION-SCREEN 1100.
ELSEIF sscrfields-ucomm EQ 'BUT2'.
CALL SELECTION-SCREEN 1200.
ENDIF.
AT SELECTION-SCREEN OUTPUT.
CLEAR it_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook.
CLEAR values.
CLEAR wa_ybook.
CLEAR wa_value.
LOOP AT it_ybook INTO wa_ybook.
wa_value-key = wa_ybook-book_author.
wa_value-text = wa_ybook-book_author.
APPEND wa_value TO values.
CLEAR wa_ybook.
CLEAR wa_value.
ENDLOOP.
CLEAR it_ybook.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_AUTHOR'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
CLEAR it_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook.
"CLEAR values.
CLEAR wa_ybook.
CLEAR wa_value.
LOOP AT it_ybook INTO wa_ybook.
wa_value-key = wa_ybook-book_name.
wa_value-text = wa_ybook-book_name.
APPEND wa_value TO values.
CLEAR wa_ybook.
CLEAR wa_value.
ENDLOOP.
CLEAR it_ybook.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_BNAME'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
START-OF-SELECTION.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
CLEAR it_ybook.
CLEAR wa_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook
WHERE book_name = p_bname.
LOOP AT it_ybook INTO wa_ybook.
WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price.
CLEAR wa_ybook.
ENDLOOP.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
CLEAR it_ybook.
CLEAR wa_ybook.
SELECT *
FROM ybook
INTO TABLE it_ybook
WHERE book_author = p_author.
LOOP AT it_ybook INTO wa_ybook.
WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price.
CLEAR wa_ybook.
ENDLOOP.
START-OF-SELECTION
只会触发您的主屏幕(当您在第一个屏幕上点击执行时)。
您可以通过更改 AT SELECTION-SCREEN
块来强制执行此事件:
AT SELECTION-SCREEN.
IF sscrfields-ucomm EQ 'BUT1'.
CALL SELECTION-SCREEN 1100.
if sy-subrc = 0. "the user clicked the execute button
sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute
endif.
ELSEIF sscrfields-ucomm EQ 'BUT2'.
CALL SELECTION-SCREEN 1200.
if sy-subrc = 0. "the user clicked the execute button
sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute
endif.
ENDIF.
你完全可以在没有 START-OF-SELECTION
阻塞的情况下实现这一点。
首先,将用户命令添加到您的参数中:
PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND auth.
PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND name.
然后将您的下拉编码移动到 INITIALIZATION
块:
INITIALIZATION.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
CLEAR it_ybook.
SELECT *
FROM ybook
...
...
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_BNAME'
values = values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
然后像这样更正 AT-SELECTION-SCREEN
事件:
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'BUT1'.
CALL SELECTION-SCREEN 1100.
WHEN 'BUT2'.
CALL SELECTION-SCREEN 1200.
WHEN 'AUTH'.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
SUPPRESS DIALOG.
WHEN 'NAME'.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
SUPPRESS DIALOG.
WHEN OTHERS.
ENDCASE.
并将您的输出编码也放在这里。您的列表将在下拉列表中选择值时立即输出。
请记住,选择屏幕参数默认转换为大写,因此您的输出选择将 return 上面给定形式中没有行。因此,为了正确使用,您应该像这样将它们转换为小写字母:
TRANSLATE p_author TO LOWER CASE.
更新:
LEAVE-TO-LIST-PROCESSING
statement interrupts the current Dynpro sequence processing (but finishes the current Dynpro!) and switches to lists that were buffered on AS until that moment. You should learn more about list processing here. This technique is treated obsolete, but, as you chose it, you should definitely know it:) SET PF-STATUS space
sets default dialog status for lists. You can learn about dialog statuses from the documentation.
关于你的代码,你可以将 2 个循环语句合并到一。另一个建议是完全消除输出期间的数据库选择:您不在此处进行任何数据修改,因此数据在 INITIALIZATION
块后不会更改。最后,您可以加强对 field-symbols 的使用,因为与工作区相比,它们消耗的资源更少。所以你的代码应该是这样的:
初始化。
TYPE-POOLS: vrm.
DATA: it_ybook TYPE TABLE OF ybook.
DATA: param TYPE vrm_id,
values_auth TYPE vrm_values,
values_name TYPE vrm_values,
wa_value_auth TYPE LINE OF vrm_values,
wa_value_name TYPE LINE OF vrm_values.
FIELD-SYMBOLS: <fs_ybook> TYPE ybook.
w_butn1 = 'Search by author name'.
w_butn2 = 'Search by book name'.
CLEAR: it_ybook, wa_value_auth, wa_value_name.
SELECT *
FROM ybook
INTO TABLE it_ybook.
LOOP AT it_ybook ASSIGNING <fs_ybook>.
wa_value_auth-key = <fs_ybook>-book_author.
wa_value_auth-text = <fs_ybook>-book_author.
wa_value_name-key = <fs_ybook>-book_name.
wa_value_name-text = <fs_ybook>-book_name.
APPEND wa_value_auth TO values_auth.
APPEND wa_value_name TO values_name.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES' "for authors
CALL FUNCTION 'VRM_SET_VALUES' "for names
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
...
ENDCASE.
TRANSLATE P_BNAME TO LOWER CASE.
LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_name = P_BNAME.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price.
ENDLOOP.
TRANSLATE P_AUTHOR TO LOWER CASE.
LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_author = P_AUTHOR.
WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'.
WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price.
ENDLOOP.