点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家好! 这是我要做的事情: ...
点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家好! 这是我要做的事情: ...
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
大家好!
这是我要做的事情:
某些ALV输出显示在屏幕上,其中包括程序列表,其中程序名称显示为可单击的热点。 单击程序名称之一后,将正确触发事件ON_LINK_CLICK并通过打开所选程序的编辑器来成功执行此方法:
METHOD on_link_click。 尝试。 DATA(selected_entry)= output_table_for_event [行]。 CASE selected_entry对象。 当"程序"。 数据(快速)= selected_entry-obj_name。 "致电ABAP编辑 通话功能" EDITOR_PROGRAM" 出口 显示= abap_true 程序=修复 顶线= 1 例外情况 其他= 1。 设置参数ID" RID"字段sy-repid。 当别人。 结束。 捕获cx_sy_itab_line_not_found。 "错误消息在这里 ENDTRY。 ENDMETHOD。
该方法属于报表程序中的本地类:
CLASS lcl_view定义## class_final。 公共部分。 方法:显示导入的it_output类型g_tt_alv_output。 专用部分。 *需要为ALV输出表定义,以便能够在触发的方法中使用它 *按事件显示以在单击时显示代码 数据:output_table_for_event类型g_tt_alv_output。 "方法ALV_TOP_OF_PAGE的定义 "...。此处未包括...。 方法: " ALV输出的标题 alv_top_of_page更改cr_alv_grid类型参考cl_salv_table, set_column_properties 输入 io_alv_grid类型参考cl_salv_table, on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events_table 导入e_salv_function, on_link_click 活动链接_click OF cl_salv_events_table 正在导入行列。 ENDCLASS。
公共方法DISPLAY包含事件处理程序的注册,并从包含ALV数据的itab填充内部表OUTPUT_TABLE_FOR_EVENT。
方法显示。 * ------------------------------------------------- ------------------- * *导入it_output类型g_tt_alv_output。 * ------------------------------------------------- ------------------- * DATA(output_table)= it_output。"由于CHANGING参数而需要复制 数据:lr_columns将ref键入cl_salv_columns, lr_column类型对cl_salv_column_table的引用。 尝试。 cl_salv_table =>工厂( 输入 r_salv_table = DATA(lo_alv_grid) 改变 t_table = output_table)。 捕获cx_salv_msg INTO DATA(salv_error)。 DATA(错误消息)= salv_error-> get_text()。 MESSAGE error_message类型" E"。 ENDTRY。 "激活ALV通用功能(从FG SALV复制的PF状态标准) lo_alv_grid-> set_screen_status( pfstatus ='SALV_STANDARD' 报告= sy-repid set_functions = lo_alv_grid-> c_functions_all)。 "在ALV输出的页面顶部添加信息 描述表output_table LINES DATA(count_lines)。 alv_top_of_page(更改cr_alv_grid = lo_alv_grid)。 "准备对象名称列以跳到相关的代码编辑器中 lr_columns = lo_alv_grid-> get_columns()。 lr_columns-> set_optimize(abap_true)。 尝试。 lr_column?= lr_columns-> get_column('OBJ_NAME')。 lr_column-> set_cell_type(if_salv_c_cell_type => hotspot)。 赶上cx_salv_not_found。 " #EC NO_HANDLER 努力。 "设置列标题以及是否显示列 set_column_properties(lo_alv_grid)。 "使ALV输出表可用于事件处理程序触发的逻辑 output_table_for_event = output_table。 注册事件处理程序 DATA(lo_events)= lo_alv_grid-> get_event()。 设置处理程序我-> on_link_click,以处理lo_events。 将处理程序me-> on_after_salv_function设置为lo_events。 lo_alv_grid-> display()。 ENDMETHOD。
这有效,但前提是没有任何改变显示的ALV,例如 在其中一个列上进行排序会导致打开错误的程序,因为与此同时行号已更改。 这并不奇怪,因为在OUTPUT_TABLE_FOR_EVENT的第一个"化身"中仅复制了一次。
所以,我的问题是,是否有一种方法可以在触发事件ON_LINK_CLICK之前在ALV网格中反映更改的内容。 我已经尝试过为ON_AFTER_SALV_FUNCTION添加一个事件,但是从调试的角度来看,它似乎并没有"知道"更多的东西,而只是像&OUP那样对"升序排序"执行了该功能。
我已经查看了各种SALV_DEMO程序-例如 SALV_DEMO_TABLE_EVENTS-但是它们没有太大帮助,因为它们被设置为使用全局变量并仅在一个局部类中进行所有OO处理的报表程序。 但是,"我的"程序的逻辑分布在多个本地类中-基于,以提取由Github上的 Paul Hardy 提供的SUSG数据( 谢谢,保罗!)。 针对EVENT逻辑的一般问题的第二种建议解决方案,在来自 Raghu Govindarajan 的这篇非常有用的博客文章 解决我的第一个问题以使链接单击逻辑起作用,但是我还无法找到其他问题的解决方法,例如如何将显示的ALV网格中的更改考虑在内。
是否存在一个功能,或者我是否不得不禁用所有功能,例如排序和过滤功能,这些功能可能会影响ALV网格中列出的项目的行号?
我正在NW 7.50 EHP8系统中工作,我已经尝试过Google搜索" on_single_click未实现表格已排序的站点: sap .com "获得了一些成功,但都没有真正适合我的问题。
欢呼
贝尔贝尔
您好
感谢您的澄清,Bärbel。
包含数据的内部表确实是在另一个类中定义的,但是它被定义为可用于 更改(非只读)。
在这种情况下,我将简单地将此表用作一个数据存储区。 使用CHANGING参数将其传递给DISPLAY方法,请勿将数据复制到OUTPUT_TABLE。 这样,在ALV中完成的任何操作都将在MT_OUTPUT中存储的数据中可见。 然后可以在事件处理程序中使用它来读取正确的行。
请记住,要做到这一点,您需要保留对模型对象的引用。 因此,不要将LO_MODEL声明为局部变量,而应将其声明为控制器的属性。
进一步查看代码,我还将使视图也引用控制器的属性(不是 本地LO_VIEW变量)。 这样,您在触发报表时实例化了视图和模型一次,并且可以使用这两个对象运行逻辑。
Paul在他的代码中所做的就是创建模型和查看对象,使用它们读取和显示数据,然后忘记。 在他的示例中很好,因为他不需要这些对象进行进一步处理。 他只想读取和显示数据,他就完成了。
但是,在您的情况下,因为您要处理事件并为此需要数据,所以您需要保留对模型的引用(可能还需要 查看)对象,从而允许您自己以后使用这些对象及其内容。
问候,
Mateusz
一周热门 更多>