DYNPRO:手动触发PAI

2020-09-26 06:22发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我的DYNPRO由三个部分组成,如下所示。

CUSTOM CONTROL部分正在显示带有自定义工具栏的CL_GUI_ALV_GRID对象(通过处理CL_GUI_ALV_GRID事件TOOLBAR)。

按下自定义工具栏上的按钮时,此操作的处理程序必须使用DYNPRO右上部分的数据(上图中名为" WE:Allgemeine Buchungsdaten")。

由于按下该按钮后未执行PAI,因此不会发生从DYNPRO到编程的数据传输。 因此,我的处理程序可以处理在上一个PAI之前传输的数据,该数据可能很旧。

是否可以在处理程序中手动触发PAI?

我尝试过

呼叫方法cl_gui_cfw => set_new_ok_code
     出口
       new_code ='DUMMY'。
    调用方法cl_gui_cfw =>刷新。
 

like https://wiki.scn.sap.com/wiki/display/Snippets/Triggering + PAI + manually 告诉我,但是经过这种和平的代码后,才触发PAI。

请帮助

休伯特

dynpro.jpg (207.7 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我的DYNPRO由三个部分组成,如下所示。

CUSTOM CONTROL部分正在显示带有自定义工具栏的CL_GUI_ALV_GRID对象(通过处理CL_GUI_ALV_GRID事件TOOLBAR)。

按下自定义工具栏上的按钮时,此操作的处理程序必须使用DYNPRO右上部分的数据(上图中名为" WE:Allgemeine Buchungsdaten")。

由于按下该按钮后未执行PAI,因此不会发生从DYNPRO到编程的数据传输。 因此,我的处理程序可以处理在上一个PAI之前传输的数据,该数据可能很旧。

是否可以在处理程序中手动触发PAI?

我尝试过

呼叫方法cl_gui_cfw => set_new_ok_code
     出口
       new_code ='DUMMY'。
    调用方法cl_gui_cfw =>刷新。
 

like https://wiki.scn.sap.com/wiki/display/Snippets/Triggering + PAI + manually 告诉我,但是经过这种和平的代码后,才触发PAI。

请帮助

休伯特

dynpro.jpg (207.7 kB)
付费偷看设置
发送
5条回答
小灯塔
1楼 · 2020-09-26 06:47.采纳回答

使用

设置新的ok_code
呼叫方法cl_gui_cfw => set_new_ok_code
           出口
             new_code ='BOOK_PAI'。

并移动您的处理代码

当" BOOK_PAI"时。
         PERFORM book_purchase_order。
         PERFORM display_purchase_order_info。

"正常"

输入后处理。
模块用户命令。

cl_gui_cfw => set_new_ok_code 是一个简单的命令,可以离开ALV事件并返回到标准流程逻辑。

闻人可可
2楼-- · 2020-09-26 06:54

感谢Tibor,

您的建议就像我们所说的那样

从后面穿过胸部进入眼睛

在德国,但是效果很好。

浮生未央
3楼-- · 2020-09-26 06:43

默认情况下,所有ALV网格控制事件都不会触发PAI(系统事件)。 对于所有事件,都可以通过构造函数的参数I_APPL_EVENTS ='X'来更改(应用程序事件)。

您还可以通过功能模块DYNP_VALUES_READ显式传输所需的屏幕字段。

愤怒的猪头君
4楼-- · 2020-09-26 06:46

是,

呼叫方法cl_gui_cfw => set_new_ok_code
     出口
       new_code ='DUMMY'。
    呼叫方法cl_gui_cfw =>冲洗。

以对我无济于事的方式工作:(

我的处理程序(简短版):

 METHOD alv_user_command。
     案例e_ucomm。  "导入参数
       当"预订"时。
         呼叫方法cl_gui_cfw => set_new_ok_code
           出口
             new_code ='DUMMY'。
         调用方法cl_gui_cfw =>刷新。

         PERFORM book_purchase_order。
         PERFORM display_purchase_order_info。
       当别人。
     结束。
   终结法。  " ALV_USER_COMMAND
 

PAI必须在调用FORM book_puchase_order之前进行,但是发生在METHOD alv_user_command完成之后。

huskylover
5楼-- · 2020-09-26 06:45

CL_GUI_CFW => SET_NEW_OK_CODE对我来说很好(不需要刷新):

报告。
 数据int_fleet类型表。
 数据alv_1类型参考cl_gui_alv_grid。
 * -------------------------------------------------  --------------------- *
 CLASS lcl_event_receiver定义。
   公共部分。
     方法on_user_command FOR cl_gui_alv_grid的事件user_command。
     方法handle_toolbar用于cl_gui_alv_grid的事件工具栏
           导入e_object e_interactive。
 ENDCLASS。  " lcl_event_receiver定义
 数据event_receiver类型参考lcl_event_receiver。
 * -------------------------------------------------  --------------------- *
 CLASS lcl_event_receiver的实现。
   方法handle_toolbar。
     数据ls_toolbar TYPE stb_button。
     删除e_object-> mt_toolbar WHERE函数='&DETAIL'。
     清除ls_toolbar。
     ls_toolbar-butn_type = cntb_btype_sep。
     附加ls_toolbar到e_object-> mt_toolbar。
     清除ls_toolbar。
     ls_toolbar-function ='飞机清单'。
     ls_toolbar-icon = icon_bw_ref_structure_sap。
     ls_toolbar-quickinfo ='显示尾巴编号和设备'(111)。
     ls_toolbar-text ='结构'(112)。
     ls_toolbar-disabled =''。
     附加ls_toolbar到e_object-> mt_toolbar。
   终结法。  " handle_toolbar
   方法on_user_command。
     MESSAGE'on_user_command'类型'I'。
     cl_gui_cfw => set_new_ok_code('DUMMY')。
   终结法。  " handle_toolbar
 ENDCLASS。  " lcl_event_receiver IMPLEMENTATION
 参数哑元。
 选择屏幕输出时。
   如果alv_1是INITIAL。
     SELECT * FROM sflight进入表int_fleet。
     数据:it_layout TYPE lvc_s_layo,
           it_fcat TYPE lvc_t_fcat,
           ls_exclude TYPE ui_func,
           gs_variant TYPE变量,
           lt_exclude TYPE ui_functions。
     ls_exclude = cl_gui_alv_grid => mc_fc_excl_all。
     追加ls_exclude至lt_exclude。
     执行get_fcat更改int_fleet it_fcat。
     创建对象alv_1
       出口
         i_parent = cl_gui_container => screen0。
     创建对象event_receiver。
 *在SET_TABLE_FOR_FIRST_DISPLAY之前设置工具栏处理程序,以便
 *使它自动升起(因此无需调用SET_TOOLBAR_​​INTERACTIVE)
     设置HANDLER event_receiver-> handle_toolbar for alv_1。
     为alv_1设置处理程序event_receiver-> on_user_command。
     呼叫方法alv_1-> set_table_for_first_display
       出口
         is_layout = it_layout
         it_toolbar_clusion = lt_exclude
         is_variant = gs_variant
       改变
         it_outtab = int_fleet
         it_fieldcatalog = it_fcat
       例外情况
         invalid_parameter_combination = 1
         程序错误= 2
         too_many_lines = 3
         其他= 4。
   万一。
 在选择屏幕上。
   邮件" PAI"类型为" I"。
 * -------------------------------------------------  --------------------------
 FORM get_fcat更改it_std类型标准表et_fcat类型lvc_t_fcat。
   数据lo_table类型参考cl_salv_table。
   数据lo_columns类型参考cl_salv_columns_list。
   数据lo_agg类型参考cl_salv_aggregations。
   刷新et_fcat。
   呼叫方法cl_salv_table =>工厂
     输入
       r_salv_table = lo_table
     改变
       t_table = it_std []。
   lo_columns = lo_table-> get_columns()。
   lo_agg = lo_table-> get_aggregations()。
   et_fcat = cl_salv_controller_metadata => get_lvc_fieldcatalog(r_columns = lo_columns r_aggregations = lo_agg)。
 ENDFORM。
 

一周热门 更多>