Abap 如何在上一个模式对话框上提高PBO?

Abap 如何在上一个模式对话框上提高PBO?,abap,Abap,我有两个对话框,一个调用另一个。为了阐明我的意思,让我们来看看第一个对话框: 正如您在屏幕上看到的,它包含ALV。当我单击该行时,它将打开第二个对话框: 当我关闭第二个对话框时,我想在第一个is屏幕上触发PBO以执行RERERENDER ALV。如何存档 更新 代码,调用第二个屏幕: METHOD handle_double_click. FIELD-SYMBOLS <lt_task> TYPE STANDARD TABLE. FIELD-SYMBOLS &

我有两个对话框,一个调用另一个。为了阐明我的意思,让我们来看看第一个对话框:

正如您在屏幕上看到的,它包含ALV。当我单击该行时,它将打开第二个对话框:

当我关闭第二个对话框时,我想在第一个is屏幕上触发PBO以执行RERERENDER ALV。如何存档

更新 代码,调用第二个屏幕:

  METHOD handle_double_click.

    FIELD-SYMBOLS <lt_task> TYPE STANDARD TABLE.
    FIELD-SYMBOLS <ls_task> TYPE any.
    FIELD-SYMBOLS <ls_clicked_data> TYPE any.

    DATA(lo_task_provider) = lcl_alv_task_provider=>get_instance( ).
    DATA(lt_task) = lo_task_provider->c_gt_data.

    ASSIGN lt_task->* TO <lt_task>.

    IF sy-subrc <> 0 OR <lt_task>[] IS INITIAL.
      RETURN.
    ENDIF.

    CREATE DATA lo_task_provider->c_gs_clicked_data LIKE LINE OF <lt_task>.
    ASSIGN lo_task_provider->c_gs_clicked_data->* TO <ls_clicked_data>.

    READ TABLE <lt_task> ASSIGNING <ls_task> INDEX e_row.
    <ls_clicked_data> = <ls_task>.

    zdp2_planning_split = me->fill_splitt_info( <ls_task> ).

    DATA(ls_planning_split_alv) = VALUE zdp2_planning_split_alv( matnr = zdp2_planning_split-matnr
                                                                 lfdat = zdp2_planning_split-lfdat
                                                                 sollmng = zdp2_planning_split-sollmng
                                                                 meins = zdp2_planning_split-meins ).
    DATA(lt_planning_split_alv) = VALUE zdp2_planning_split_alv_t( ).
    INSERT ls_planning_split_alv INTO TABLE lt_planning_split_alv.

    lcl_alv_split_provider=>get_instance( )->insert_data( lt_planning_split_alv ).

    CALL SCREEN '0100' STARTING AT 8 8.

  ENDMETHOD. 
双击方法句柄。 字段符号类型标准表。 字段符号类型任意。 字段符号类型任意。 数据(lo_任务_提供程序)=lcl_alv_任务_提供程序=>get_实例()。 数据(lt_任务)=lo_任务提供程序->c_gt_数据。 将lt_任务->*分配给。 如果sy subrc 0或[]是首字母。 返回。 恩迪夫。 创建数据lo_任务\u提供程序->c_gs\u单击\u数据,如第行。 将lo_任务\u提供程序->c_gs\u单击的\u数据->*分配给。 读取分配索引e_行的表。 = . zdp2_planning_split=me->fill_splitt_info()。 数据(ls_planning_split_alv)=值zdp2_planning_split_alv(matnr=zdp2_planning_split-matnr lfdat=zdp2\u规划\u分割-lfdat sollmng=zdp2\u规划\u分割-sollmng meins=zdp2\u计划\u分割meins)。 数据(lt_planning_split_alv)=值zdp2_planning_split_alv_t()。 将ls_planning_split_alv插入表lt_planning_split_alv。 lcl\u alv\u split\u provider=>get\u instance()->insert\u data(lt\u planning\u split\u alv)。 从8点开始呼叫屏幕“0100”。 ENDMETHOD。 更新

我想这些图片并没有阐明我的意思。现在应该更好了:


第一个模态调用第二个模态。当第二个模式关闭时,应刷新第一个屏幕上的ALV。我无法刷新它,因为第一个屏幕上的PBO在第二个模式关闭后不会执行。

我猜方法
HANDLE\u DOUBLE\u CLICK
是在
CL\u GUI\u ALV\u GRID
的事件
双击时触发的。此事件仅触发一个方法,不会启动PAI(因此也不会触发PBO)

如果您想触发PAI,只需添加此行(您必须指明一个功能代码,此处为“ZZZ”):

但是,在
呼叫屏幕
之后,为什么不刷新ALV网格呢

假设您使用class
CL\u GUI\u ALV\u grid
对ALV网格进行编程,添加以下代码:

" first update the internal table of the ALV
...

" transfer the internal table to the control, it also does an "update_view"
alv_grid->refresh_table_display( ).

您不应该从8开始使用呼叫屏幕“0100”

下面是调用弹出屏幕的示例代码,当弹出屏幕关闭时,您可以编写代码来刷新第一个ALV屏幕数据

  TYPES: BEGIN OF alv_line,
             carrid   TYPE spfli-carrid,
             connid   TYPE spfli-connid,
             cityfrom TYPE spfli-cityfrom,
             cityto   TYPE spfli-cityto,
           END OF alv_line.
    DATA   alv_tab    TYPE TABLE OF alv_line.
    SELECT carrid, connid, cityfrom, cityto
           FROM spfli
           WHERE carrid = @carrid
           INTO CORRESPONDING FIELDS OF TABLE @alv_tab.
    IF sy-subrc <> 0.
      MESSAGE e007(sabapdemos).
    ENDIF.
    TRY.
        cl_salv_table=>factory(
          IMPORTING r_salv_table = DATA(alv)
          CHANGING  t_table = alv_tab ).
        alv->set_screen_popup( start_column = 1
                               end_column   = 60
                               start_line   = 1
                               end_line     = 12 ).
        alv->display( ).
      CATCH cx_salv_msg.
        MESSAGE 'ALV display not possible' TYPE 'I'
                DISPLAY LIKE 'E'.
    ENDTRY.
类型:从alv_线开始,
卡里德型spfli卡里德,
connid类型spfli connid,
cityfrom类型spfli cityfrom,
cityto类型spfli cityto,
alv_线的末端。
数据alv_选项卡alv_线的类型表。
选择carrid、connid、cityfrom、cityto
来自spfli
其中carrid=@carrid
进入表格@alv_选项卡的相应字段。
如果sy subrc为0。
消息e007(sabapdemos)。
恩迪夫。
尝试
cl_salv_表=>工厂(
导入r_salv_表=数据(alv)
更改t_表=alv_选项卡)。
alv->设置屏幕弹出窗口(开始列=1
end_列=60
起始线=1
结束线=12)。
alv->显示()。
抓到你的萨尔夫味精。
信息“ALV显示不可能”类型“I”
像“E”一样显示。
结束。

第二个对话框是否取代第一个?请附上从第一个对话框导航到第二个对话框的代码好吗?第一个对话框不会取代第二个对话框。我把代码贴在了第二个屏幕上。在SCN上我也问了一个问题:@zero_编码你的最新更新(1月8日14:22)反映了我最初的理解。Cf my answer(PBO未调用,但您仍可以更新alv网格;如果您确实希望调用PBO,则可以强制触发PAI/PBO)
  TYPES: BEGIN OF alv_line,
             carrid   TYPE spfli-carrid,
             connid   TYPE spfli-connid,
             cityfrom TYPE spfli-cityfrom,
             cityto   TYPE spfli-cityto,
           END OF alv_line.
    DATA   alv_tab    TYPE TABLE OF alv_line.
    SELECT carrid, connid, cityfrom, cityto
           FROM spfli
           WHERE carrid = @carrid
           INTO CORRESPONDING FIELDS OF TABLE @alv_tab.
    IF sy-subrc <> 0.
      MESSAGE e007(sabapdemos).
    ENDIF.
    TRY.
        cl_salv_table=>factory(
          IMPORTING r_salv_table = DATA(alv)
          CHANGING  t_table = alv_tab ).
        alv->set_screen_popup( start_column = 1
                               end_column   = 60
                               start_line   = 1
                               end_line     = 12 ).
        alv->display( ).
      CATCH cx_salv_msg.
        MESSAGE 'ALV display not possible' TYPE 'I'
                DISPLAY LIKE 'E'.
    ENDTRY.