关于ALV双击 调用事务的一个例子

源地址:http://www.itpub.net/thread-1483525-1-9.html

 

有经验的ABAPER都知道下面一个标准程序:
我以前开发一个财务报表,用ALV的形式表现。其中每个行项目的“公司代码、年度、凭证号”是唯一的,这样可以实现点击行项目查看凭证。我使用了这个:
  CASE rf_ucomm.
    WHEN '&IC1'.
      READ TABLE IT_OUTPUT INDEX rs_selfield-tabindex ASSIGNING <FS_OUTPUT>.
      IF SY-SUBRC = 0.
        SET PARAMETER ID: 'BLN' FIELD <FS_OUTPUT>-BELNR.
        SET PARAMETER ID: 'BUK' FIELD <FS_OUTPUT>-BUKRS.
        SET PARAMETER ID: 'GJR' FIELD <FS_OUTPUT>-GJAHR.
        CALL TRANSACTION 'zfxx03' AND SKIP FIRST SCREEN .
      ENDIF.
  ENDCASE.
                    "USER_CALLBACK
以上是调用了事务zfxx03。对参数的传递都是单值,现在我想传递一批参数,也就是bukrs(公司代码)的选项是多选的,是这样定义的,见下:
“SELECT-OPTIONS s_bukrs FOR t001-bukrs OBLIGATORY”
我将公司代码选项的内表传递到zfirxxxx,这样使用ID就无效了(GET PARAMETER ID 'BUK' field P_BUKRS 无效),我怎么传递为好呢,使用什么语句呢?尤其是一个变量下有多个参数的。

 

 

我已经找到一种方法了,但还没有具体应用呢,现在发布出来让朋友们借鉴一下。(以下内容即为方法,已发布在我们公司内部论坛上了)


要开发综合查询程序,一定会多次调用ALV报表,报表之间的参数传递就显得异常重要。
目前公司自行开发的多次(层)调用报表(事务)的程序不多。调用的层次越多,使用的逻辑越复杂,参数值传递就越繁琐。这样的程序即使开发出来也需要长时间的测试才能保证数据的准确,往往忽略了一个微小的逻辑环节就导致整张报表数据的表现错误。
在准备开发公司的综合报表之前,列举2个非常重要的例子,它就是程序间的调用内表并通过设置ID传输。

    举例1.(标准)

    主程序:

REPORT ZTEST_LHA07.

DATA : BEGIN OF W_DATA,

FID1 TYPE STRING,

NUM1 TYPE I ,

NUM2 TYPE I ,

END OF W_DATA.

DATA : T_OUT LIKE W_DATA OCCURS 0 WITH HEADER LINE .

DO 10 TIMES .

IF SY-INDEX < 4 .

T_OUT-FID1 = 'A' .

T_OUT-NUM1 = SY-INDEX .

T_OUT-NUM2 = SY-INDEX + 1 .

ELSEIF SY-INDEX < 7 .

T_OUT-FID1 = 'B' .

T_OUT-NUM1 = SY-INDEX + 1 .

T_OUT-NUM2 = SY-INDEX + 2 .

ELSE .

T_OUT-FID1 = 'C' .

T_OUT-NUM1 = SY-INDEX .

T_OUT-NUM2 = SY-INDEX - 1 .

ENDIF .

APPEND T_OUT.

ENDDO .

EXPORT T_OUT TO MEMORY ID 'T_OUT' .

SUBMIT ZTEST_LHA08 AND RETURN .

    被调用的程序:

REPORT ZTEST_LHA08.

data : begin of w_data, "这里定义一个跟调用程序一样的内表结构

fid1 type  string,

num1 type i ,

num2 type i ,

end of w_data.

data : t_out like w_data occurs 0 with header line .

import t_out from memory id 'T_OUT' .

FREE MEMORY ID 'T_OUT' .

WRITE : '从调用程序取到的数据如下:' .

LOOP AT T_OUT.

write : / ' ' ,t_out-fid1, t_out-num1, t_out-num2.

ENDLOOP .

    举例2.(结合我公司实际)

    主程序:

REPORT ZTEST_LHA07.

tables: t001.

SELECT-OPTIONS s_bukrs FOR t001-bukrs memory ID T_OUT . "公司代码

EXPORT s_bukrs TO MEMORY ID 'T_OUT' .

SUBMIT ZTEST_LHA08 AND RETURN .

    被调用的程序:

REPORT ZTEST_LHA08.

tables: t001.

SELECT-OPTIONS s_bukrs FOR t001-bukrs . "公司代码

import s_bukrs from memory id 'T_OUT' .

FREE MEMORY ID 'T_OUT' .

loop at s_bukrs.

write:/ s_bukrs-sign,s_bukrs-option,s_bukrs-low,s_bukrs-high.

endloop.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值