List 多个选择屏幕的问题

List 多个选择屏幕的问题,list,events,abap,dynpro,List,Events,Abap,Dynpro,开始选择未在我的程序中触发。我正在尝试使用ABAP中的多个选择屏幕,根据书名和作者获取书籍详细信息。有两个按钮,并根据这些选择打开屏幕。当我单击任何按钮时,选择屏幕将打开。但在我从下拉列表中选择条目并单击execute按钮后,事务将进入带有按钮的初始屏幕。根本不显示书本的详细信息选择开始未触发。请帮忙,我是ABAP的新手。这是我的节目 REPORT y_multiple_screen. TABLES: sscrfields. TYPE-POOLS: vrm. DATA

开始选择
未在我的程序中触发。我正在尝试使用ABAP中的多个选择屏幕,根据书名和作者获取书籍详细信息。有两个按钮,并根据这些选择打开屏幕。当我单击任何按钮时,选择屏幕将打开。但在我从下拉列表中选择条目并单击execute按钮后,事务将进入带有按钮的初始屏幕。根本不显示书本的详细信息<代码>选择开始未触发。请帮忙,我是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.
报告y\u多个屏幕。
表:sscrfields。
类型池:vrm。
数据:参数类型vrm_id,
值类型vrm_值,
wa_值类似于值行。
数据:它是ybook的ybook类型表,
wa_ybook类型ybook。
字段符号:键入ybook。
块拦截器的选择屏幕开始,帧标题文本-001无间隔。
选择屏幕跳过。
选择行的屏幕开始。
选择屏幕按钮(30)w_butn1用户命令but1。
选择屏幕结束行。
选择屏幕跳过。
选择行的屏幕开始。
选择屏幕按钮(30)w_butn2用户命令but2。
选择屏幕结束行。
选择屏幕跳过。
选择块拦截器的屏幕末端。
选择屏幕1100的屏幕开始。
参数:p_作者输入char255作为列表框可见长度20。
选择屏幕1100的屏幕末端。
选择屏幕1200的屏幕开始。
参数:p_bname类型char255作为列表框可见长度20。
选择屏幕1200的屏幕末端。
初始化。
w_butn1='按作者姓名搜索'。
w_butn2='按书名搜索'。
“在选择屏幕输出时。
在选择屏幕上。
如果sscrfields ucomm等式'BUT1'。
呼叫选择屏幕1100。
其他sscrfields ucomm EQ'BUT2'。
呼叫选择屏幕1200。
恩迪夫。
在选择屏幕输出时。
把它清理干净。
挑选*
来自iBook
把它放进桌子里。
明确的价值观。
清除wa_ybook。
清除wa_值。
在它上面打圈,然后把它变成一本书。
wa_value-key=wa_ybook-book_作者。
wa_value-text=wa_ybook-book_作者。
将wa_值附加到值。
清除wa_ybook。
清除wa_值。
结束循环。
把它清理干净。
调用函数“VRM\u设置\u值”
出口
id='P_作者'
值=值
例外情况
id\u非法\u名称=1
其他=2。
把它清理干净。
挑选*
来自iBook
把它放进桌子里。
“明确价值观。
清除wa_ybook。
清除wa_值。
在它上面打圈,然后把它变成一本书。
wa_value-key=wa_ybook-book_name。
wa_value-text=wa_ybook-book_name。
将wa_值附加到值。
清除wa_ybook。
清除wa_值。
结束循环。
把它清理干净。
调用函数“VRM\u设置\u值”
出口
id='P_BNAME'
值=值
例外情况
id\u非法\u名称=1
其他=2。
开始选择。
书写:/10“图书ID”,40“图书名称”,70“图书作者”,100“图书价格”。
把它清理干净。
清除wa_ybook。
挑选*
来自iBook
把它放进桌子里
其中book\u name=p\u bname。
在它上面打圈,然后把它变成一本书。
写入:/10 wa_ybook-book\u id,40 wa_ybook-book\u姓名,70 wa_ybook-book\u作者,100 wa_ybook-book\u价格。
清除wa_ybook。
结束循环。
书写:/10“图书ID”,40“图书名称”,70“图书作者”,100“图书价格”。
把它清理干净。
清除wa_ybook。
挑选*
来自iBook
把它放进桌子里
其中book_author=p_author。
在它上面打圈,然后把它变成一本书。
写入:/10 wa_ybook-book\u id,40 wa_ybook-book\u姓名,70 wa_ybook-book\u作者,100 wa_ybook-book\u价格。
清除wa_ybook。
结束循环。

选择开始
只会触发主屏幕(当您在第一个屏幕上点击execute时)

您可以通过更改选择屏幕上的
块来强制事件:

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

START-OF-SELECTION
只会触发主屏幕(当您在第一个屏幕上点击execute时)

您可以通过更改选择屏幕上的
块来强制事件:

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

您完全不需要
开始选择
块就可以实现这一点。
首先,将用户命令添加到参数中:

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.
然后将下拉编码移动到
初始化
块:

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.
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.
并将您的输出编码也放在这里。您的列表将在选择下拉列表中的值时正确输出

请记住,选择屏幕参数在默认情况下转换为大写,因此您的输出选择将不会返回上述给定形式的任何行。因此,为了正确使用,您应该将它们转换为小写,如下所示:

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.
更新:
保留到列表处理
中断当前的Dynpro序列处理(但完成当前的Dynpro!),并切换到在该时刻之前已缓冲的列表。你应该在这里了解更多。这种技术被认为是过时的,但是,当您选择它时,您应该明确地知道它:)
SET PF-STATUS space
SET列表的默认对话框状态。您可以从中了解对话框状态。
与代码有关的是,您可以将两条循环语句合并为一条。另一个建议是在输出过程中完全消除DB选择:这里不做任何数据修改,这样在
初始化
块之后数据就不会更改。最后,您可以加强字段符号的使用