Проблемы с несколькими экранами выбора
START-OF-SELECTION
не запускается в моей программе. Я пытаюсь получить сведения о книге на основе названия книги и автора книги, используя несколько экранов выбора в ABAP. Есть две кнопки и в зависимости от них открываются экраны выбора. Когда я нажимаю любую из кнопок, открываются экраны выбора. Но после того, как я выбрал записи из выпадающего списка и нажал кнопку "Выполнить", транзакция с помощью кнопок переходит на начальный экран. Детали книги не отображаются вообще. 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.
2 ответа
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.
И разместите здесь свою выходную кодировку. Ваши списки будут выведены прямо при выборе значения в выпадающем списке.
Помните, что параметры экрана выбора по умолчанию преобразуются в верхний регистр, следовательно, ваши выходные данные не будут возвращать строки в указанной выше форме. Поэтому для правильного использования вы должны преобразовать их в нижний регистр следующим образом:
TRANSLATE p_author TO LOWER CASE.
ОБНОВИТЬ: LEAVE-TO-LIST-PROCESSING
Оператор прерывает текущую обработку последовательности Dynpro (но завершает текущую Dynpro!) и переключается на списки, которые были буферизованы в AS до этого момента. Вы должны узнать больше об обработке списка здесь. Эта техника считается устаревшей, но, как вы ее выбрали, вы должны обязательно знать это:) SET PF-STATUS space
устанавливает статус диалога по умолчанию для списков. Вы можете узнать о статусах диалогов из документации.
Что касается вашего кода, вы можете объединить 2 оператора цикла в одно. Другое предложение заключается в том, чтобы вообще исключить выбор БД во время вывода: здесь вы не вносите никаких изменений в данные, поэтому данные не изменятся после INITIALIZATION
блок. И, наконец, вы можете активизировать использование полевых символов, поскольку они потребляют меньше ресурсов по сравнению с рабочими областями. Итак, ваш код должен выглядеть так:
INITIALIZATION.
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
НА ВЫБОР-ЭКРАН.
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.