Functional ALV系列 (09) - 双击跳转到另外一个ALV

在查看数据的时候,不总是只有一个界面,为了让用户更方便地查看数据,需要根据当前的数据跳转到另外的界面中,比如查看明细等。本文演示 ALV 比较实用的功能:双击 ALV 单元格跳转到另外一个 ALV 中。

要实现的业务场景:报表首先显示航空公司信息,当用户点击航空公司 ID 所在字段的时候,跳转查看航空公司的航班信息。

ALV 常规的代码如下:

report  zfalv_dbl_click.

type-pools: slis.

data: gt_scarr type standard table of scarr,
      gs_scarr like line of gt_scarr.

data: gt_spfli type standard table of spfli,
      gs_spfli like line of gt_spfli.


start-of-selection.
  perform get_scarr_data.
  perform frm_disp_data.


*&---------------------------------------------------------------------*
*&      Form  get_scarr_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form get_scarr_data.
  select * from scarr
    into table gt_scarr.
endform.                    "get_scarr_data

*&---------------------------------------------------------------------*
*&      Form  get_spfli_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form get_spfli_data using p_carrid like scarr-carrid.
  select * from spfli
    into table gt_spfli
   where carrid = p_carrid.
endform.                    "get_spfli_data



*&---------------------------------------------------------------------*
*&      Form  frm_disp_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form frm_disp_data.
  data: lt_fieldcat type slis_t_fieldcat_alv,
        ls_fieldcat type slis_fieldcat_alv.

  clear lt_fieldcat[] .

  call function 'Z_FALV_FIELD_CATALOG'
    exporting
      it_output     = gt_scarr[]
    tables
      field_catalog = lt_fieldcat[].


  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program      = sy-repid
      i_callback_user_command = 'FRM_USER_COMMAND'
      it_fieldcat             = lt_fieldcat[]
    tables
      t_outtab                = gt_scarr[].
endform.                    "frm_disp_data

为了能处理双击事件,下面的代码是必须的:


然后在双击事件中处理跳转的逻辑:

form frm_user_command using r_ucomm like sy-ucomm
                  rs_selfield type slis_selfield
.
  case r_ucomm.
    when '&IC1'. " double click
      clear gs_scarr.
      read table gt_scarr into gs_scarr index rs_selfield-tabindex.
      check sy-subrc = 0.

      if rs_selfield-sel_tab_field = 'SCARR-CARRID'.
        perform get_spfli_data using gs_scarr-carrid.
        perform frm_disp_spfli_data.
      endif.
  endcase.
endform.                    "frm_user_command

源码

stonewm/abap-practice

说明:之前放在 gitee 上的代码由于不明原因个人对 repository 进行了删除,ABAP 博文关联的源码都会显示找不到。 github 上的链接仍然是有效的。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALV中实现一行跳转到另一个ALV可以通过以下步骤实现: 1. 在第一个ALV双击某一行时,获取该行的数据,并将数据传递到第二个ALV中。 2. 在第二个ALV中显示传递过来的数据。 具体实现方式如下: 1. 在第一个ALV中添加双击事件处理程序,获取当前双击行的数据,并将数据传递到第二个ALV中。可以使用函数模块 REUSE_ALV_GRID_DISPLAY 或方法 cl_gui_alv_grid=>factory 创建第二个ALV对象,然后使用 EXPORT TO MEMORY 将数据导出到内存中。 2. 在第二个ALV中添加初始化事件处理程序,从内存中导入数据,并在ALV中显示。可以使用 IMPORT FROM MEMORY 将数据导入到内存中,然后使用 SET_TABLE_FOR_FIRST_DISPLAY 或者 SET_TABLE_FOR_LVC_GRID 方法设置ALV显示的数据和属性。 示例代码如下: 第一个ALV: ``` DATA: gv_data TYPE REF TO data. " 双击事件处理程序 DATA: lr_event TYPE REF TO cl_salv_events_table. CREATE OBJECT lr_event EXPORTING iv_event_id = cl_salv_events_table=>event_id_double_click. SET HANDLER handle_double_click FOR lr_event. " 双击处理程序 METHOD handle_double_click. DATA: lr_table TYPE REF TO cl_salv_table, lr_row TYPE REF TO cl_salv_wd_table_row, lv_data TYPE string. " 获取当前双击的行 lr_table = me->alv->get_model( ). lr_row = lr_table->if_salv_wd_table=>get_current_row( ). " 获取行数据 CALL METHOD lr_row->if_salv_wd_table_column~get_value RECEIVING rv_value = lv_data. " 将数据导出到内存中 CREATE DATA gv_data TYPE string. ASSIGN gv_data->* TO FIELD-SYMBOL(<fs_data>). <fs_data> = lv_data. EXPORT gv_data TO MEMORY ID 'ALV_DATA'. " 创建第二个ALV对象并跳转到第二个ALV CALL METHOD cl_salv_table=>factory EXPORTING list_display = if_salv_c_bool_sap=>true IMPORTING r_salv_table = lr_table CHANGING t_table = gt_data. lr_table->display( ). ENDMETHOD. ``` 第二个ALV: ``` " 初始化事件处理程序 METHOD handle_init. DATA: lv_data TYPE string. " 从内存中导入数据 IMPORT gv_data FROM MEMORY ID 'ALV_DATA'. ASSIGN gv_data->* TO FIELD-SYMBOL(<fs_data>). lv_data = <fs_data>. " 设置ALV的数据和属性 CALL METHOD me->alv->set_table_for_first_display EXPORTING i_structure_name = 'SFLIGHT' is_variant = gs_variant CHANGING it_outtab = gt_data. ENDMETHOD. ``` 其中,`gt_data` 为第二个ALV显示的数据,`gs_variant` 为第二个ALV的属性。在实际开发中,需要根据具体需求进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值