2016-01-17 9 views
0

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. 
+0

Я хочу сделать эту программу, используя только экраны выбора. Я думаю, что этот сценарий можно решить, используя другие методы. Но, пожалуйста, помогите мне в выполнении этой программы с использованием экранов выбора. – user3621835

+0

Что происходит, когда вы нажимаете начало после возвращения на первый экран выбора? – knut

ответ

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. 
+0

Что такое ONLI? – user3621835

+0

Можете ли вы дать мне краткое представление о событиях на экране выбора? Очень смутно, что писать, какие события – user3621835

+0

ONLI в этом случае является пользовательской командой, связанной с кнопкой execute. Заставляя значение sscrfields-ucomm = 'ONLI', на следующем PBO экрана выбора оно будет автоматически отменяться и не останавливаться на первом экране выбора, как это было раньше. Пробуйте эту ссылку для объяснения событий (она также хорошо документирована в справке SAP) http://wiki.scn.sap.com/wiki/display/ABAP/Selection+Screen+Events+in+ABAP I никогда не использовали экраны выбора таким образом; Я не могу думать о реальной ситуации, когда это было бы хорошим решением. Я предполагаю, что вы просто экспериментируете. – Esti

0

Вы можете достичь этого без 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. 

UPDATE:
LEAVE-TO-LIST-PROCESSINGstatement прерывает текущую обработку последовательности Dynpro (но завершает текущий DynPro!) И переходит в списки, которые были буферизацией на AS до этого момента. Здесь вы должны узнать больше о list processing. Этот метод считается устаревшим, но, как вы его выбрали, вы обязательно должны его знать :) SET PF-STATUS space устанавливает статус диалога по умолчанию для списков. Вы можете узнать о статусах диалогов с documentation.
Что касается вашего кода, вы можете объединить два оператора цикла в один. Другое предложение - исключить выбор БД во время вывода: вы не делаете никаких изменений данных здесь, поэтому данные не будут меняться после блока 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 

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. 
+0

Почему на выходе экрана не требуется?. Может ли я написать тот же код в инициализации, который я написал на выходе экрана выбора? – user3621835

+0

Можете ли вы дать мне заказ, на котором вызывается инициализация, на экране выбора, на выходе экрана выбора? – user3621835

+0

На самом деле я новичок в ABAP. Я немного запутался в этих событиях. Что я должен писать в этих событиях? – user3621835

 Смежные вопросы

  • Нет связанных вопросов^_^