ON_LINK_CLICK的ALV逻辑-如何确保使用ALV表的当前状态?

2020-08-15 23:08发布

         点击此处--->   EasySAP.com群内免费提供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 "获得了一些成功,但都没有真正适合我的问题。

欢呼

贝尔贝尔

         点击此处--->   EasySAP.com群内免费提供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 "获得了一些成功,但都没有真正适合我的问题。

欢呼

贝尔贝尔

付费偷看设置
发送
4条回答
大圣 - sap领域执行人,9年sap运营经验
1楼 · 2020-08-15 23:26.采纳回答

您好

感谢您的澄清,Bärbel。

包含数据的内部表确实是在另一个类中定义的,但是它被定义为可用于 更改(非只读)。

在这种情况下,我将简单地将此表用作一个数据存储区。 使用CHANGING参数将其传递给DISPLAY方法,请勿将数据复制到OUTPUT_TABLE。 这样,在ALV中完成的任何操作都将在MT_OUTPUT中存储的数据中可见。 然后可以在事件处理程序中使用它来读取正确的行。

请记住,要做到这一点,您需要保留对模型对象的引用。 因此,不要将LO_MODEL声明为局部变量,而应将其声明为控制器的属性。

进一步查看代码,我还将使视图也引用控制器的属性(不是 本地LO_VIEW变量)。 这样,您在触发报表时实例化了视图和模型一次,并且可以使用这两个对象运行逻辑。

Paul在他的代码中所做的就是创建模型和查看对象,使用它们读取和显示数据,然后忘记。 在他的示例中很好,因为他不需要这些对象进行进一步处理。 他只想读取和显示数据,他就完成了。

但是,在您的情况下,因为您要处理事件并为此需要数据,所以您需要保留对模型的引用(可能还需要 查看)对象,从而允许您自己以后使用这些对象及其内容。

问候,
Mateusz

小灯塔
2楼-- · 2020-08-15 23:24

您好BärbelWinkler

为什么要复制内部表? 为什么不使用IT_OUTPUT参数中提供的原始版本?



亲切的问候,
Mateusz

蓋茨
3楼-- · 2020-08-15 23:39

Mateusz Adamus

嗨,Mateusz!

据我所知并尝试过,事件中未识别出IT_OUTPUT。 它从另一个本地类(属于 Paul的原始代码(我在该区域没有更改)

 CLASS lcl_controller IMPLEMENTATION。
   方法主要。
     DATA(lo_model)=新的lcl_model()。
     DATA(lo_view)= NEW lcl_view()。
     lo_model-> derive_data()。
     lo_model-> prepare_data_for_output()。
     lo_view-> display(lo_model-> mt_output)。
   终结法。
 ENDCLASS。

因此,"原始表"位于另一个本地类中,因此无法访问(如果我完全理解这一点,那不是我认为您所知道的)。

shere_lin
4楼-- · 2020-08-15 23:41

是的,当然,这是同一件事,只是前缀不同。

无需混淆。 前缀不是必须的。 您不需要使用它们,尽管我认为它们确实为编码带来了清晰度。 而且,就像在任何其他人的新知识领域一样,总会有一些模棱两可的地方,一些灰色地带以及由此产生的问题。


亲切的问候,
Mateusz

一周热门 更多>