0

START-OF-SELECTION is not getting triggered in my program. I am trying to fetch book details based on book name and book author using multiple selection screens in ABAP. There are two pushbuttons and based on those selection screens are opened. When I click any of the push buttons, then selection screens are opened. But after I select entries from the dropdown list and click execute button, then the transaction goes to the initial screen with the pushbuttons. The book details are not displayed at all. START-OF-SELECTION is not triggered. Please help, I am a newbie in ABAP. Here is my program

 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.
4

2 回答 2

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.
于 2016-01-18T01:42:01.707 回答
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.

更新:
LEAVE-TO-LIST-PROCESSING 语句中断当前的 Dynpro 序列处理(但完成当前的 Dynpro!)并切换到在那一刻之前在 AS 上缓冲的列表。您应该在此处了解有关列表处理的更多信息。此技术已过时,但是,当您选择它时,您绝对应该知道它:)SET PF-STATUS space为列表设置默认对话框状态。您可以从文档中了解对话状态。
与您的代码有关的是,您可以将 2 个循环语句合并为一个。另一个建议是在输出期间完全消除 DB 选择:您不要在此处进行任何数据修改,因此数据在之后不会更改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.
于 2016-01-18T11:09:01.663 回答