Проблемы с несколькими экранами выбора

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.
Другие вопросы по тегам