ABAP ALV报表,穿透,跳转的功能。

ALV报表,穿透,跳转

  • 前言
  • 一、穿透是什么?
  • 二、使用的语法
    • 1.CALL TRANSACTION
    • 2.CALL SERCCN
  • 同程序内多个ALV报表的跳转

前言

穿透等功能,其实还是一些跳转的语法。
列如 CALL SERCCN 调用屏幕
CALL TRANSACTION 调用事务码

一、穿透是什么?

穿透是当前屏幕或程序跳转到另外一个屏幕或者程序 那穿透应用最多的场合还是报表里面,点击某个单号跳转到对应得界面,在屏幕上也使用的较多。

二、使用的语法

1.CALL TRANSACTION

在ALV中,就是对ALV函数添加一个可以执行的子程序, 然后在改子程序中判断事件,常用的是双击事件'&IC1'。 现在来详细的说一下步骤。 常用的 ALV_Grid 函数的输出有两个:REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GRID_DISPLAY_LVC 两者的操作大同小异,只是后者能更好的和ALV容器结合使用,前后则不能;而在输入参数属性的结构上也有些差异。

两个函数实现穿透的代码。
REUSE_ALV_GRID_DISPLAY_LVC的详细代码过程

REUSE_ALV_GRID_DISPLAY的详细代码过程

简单的复现一下这个过程,
首先从CALL ALV显示的函数

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program      = sy-repid
      is_layout_lvc           = ls_layout
      it_fieldcat_lvc         = lt_fcat
      

 i_callback_user_command = 'FRM_US_COMM'  !!!为这个ALV定义子程序事件,

      i_save                  = 'A'
    TABLES
      t_outtab                = lt_alv2
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.


!!!定义一个FORM子程序
FORM frm_us_comm USING    uv_ucomm    TYPE sy-ucomm  定义按钮
                 CHANGING cs_selfield TYPE   slis_selfield.    

  DATA ls_alv LIKE LINE OF gt_alv.

  CASE uv_ucomm.
    WHEN '&IC1'."双击
      READ TABLE gt_alv INTO ls_alv INDEX cs_selfield-tabindex.
      CHECK sy-subrc = 0.
      
      SET PARAMETER ID 'MBN' FIELD L_RESULT-MBLNR.   
      "需要再对应得选择屏幕字段加上MOMOEY ID 
      
      CALL TRANSACTION 'Z00XX' AND SKIP FIRST SCREEN.
     " CALL 对应的事务码
    WHEN OTHERS.
  ENDCASE.

ENDFORM.                    "frm_us_comm

随便找个图解释一下MOMERY ID
ABAP ALV报表,穿透,跳转的功能。_第1张图片
这样就完成了从两个不同程序的ALV报表穿透。

2.CALL SERCCN

调用屏幕屏幕是用在同一个程序里,也是像上面定义好事件,在子程序写上想CALL 对应得屏幕号就行了,也不用SET 语法

同程序内多个ALV报表的跳转

对于复杂的程序,一个程序同时有多张报表可以选择。那怎么达到可以自由穿梭在这些报表中间呢? 首先第一点,确保需要跳转的报表直接可以关联,很重要! 第二点,每个报表的调用ALV报表的一定要封装在不同perform子程序中,这样后面才能调用。 第三点,见缝插针, 像上面的ALV函数定义好事件子程序后, 确定好需要跳转到某个报表之后,把对应得取数逻辑COPY过来,然后用当前报表的数据去取数(根据实际情况,需要根据哪些字段用作穿透的数据),数据取好之后就用到了,第二点,你封装的子程序,在取完数据放入内表直接,接着调用封装的ALV子程序就能实现了,而且这样因为每个ALV你都定义了事件,可以实现自由跳转,简单的来说就是省略了选择屏幕的步骤,但是极大提升用户体验,因为之所以会有复杂报表是因为需要细化数据,但这些数据又有关联性,最好是主键关联,就能很方便操作。

贴出部分代码方便理解这个想法。

FORM FRM_US_COMM2 USING
uv_ucomm TYPE sy-ucomm
CHANGING cs_selfield TYPE slis_selfield.

CLEAR lW_alv4.

CASE uv_ucomm.
WHEN ‘&IC1’. " 双击事件 穿透到第一个按钮的报表
READ TABLE lT_alv4 INTO lW_alv4 INDEX cs_selfield-TABINDEX. "获取到具体哪一行,获得需要用到的数据
PERFORM frm_get_rb07 USING lW_alv4. "总表
ENDCASE.
ENDFORM. " FRM_SET_RB02

总表里面是取数逻辑

FORM frm_get_rb07 USING lw_alv4 TYPE z06pms2702alv .
CLEAR gt_alv.
SELECT
*
INTO CORRESPONDING FIELDS OF TABLE gt_alv
FROM z06pmt0210a AS A
INNER JOIN z06pmt270 AS B ON A~wfnum = B~wfnum
WHERE A~IWERK = lW_alv4-IWERK
AND B~WORKROOM = lW_alv4-WORKROOM
AND B~WORKSHOP = lW_alv4-WORKSHOP
.

CALL FUNCTION ‘Z_06PM382_FILL_STATUS_T’
CHANGING
ct_tab = gt_alv. 得到ALV展示报表结构,封装好的以后再有机会展示

PERFORM frm_set_rb01. 这就是封装好的调用的ALV。

ENDFORM. " FRM_SET_RB01

封装好调用ALV的子程序,中间对数据处理逻辑可以忽略,主要是调用ALV
FORM frm_set_rb01 .
FIELD-SYMBOLS: TYPE lvc_s_fcat.
DATA:ls_layout TYPE lvc_s_layo,
lt_fcat TYPE lvc_t_fcat,
FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.

  • 定义热键
    FIELDCAT-REF_TABNAME = ‘GT_ALV’.
    FIELDCAT-FIELDNAME = ‘WORKROOM’.
    FIELDCAT-HOTSPOT = ‘X’.
    APPEND FIELDCAT.

    FIELDCAT-REF_TABNAME = ‘GT_ALV’.
    FIELDCAT-FIELDNAME = ‘WORKSHOP’.
    FIELDCAT-HOTSPOT = ‘X’.
    APPEND FIELDCAT.

    FIELDCAT-REF_TABNAME = ‘GT_ALV’.
    FIELDCAT-FIELDNAME = ‘IWERK’.
    FIELDCAT-HOTSPOT = ‘X’.
    APPEND FIELDCAT.

    ls_layout-cwidth_opt = ‘X’.
    "得到显示的FIELDCAT
    z01ficl_alv=>get_fcat(
    EXPORTING
    iv_structure_name = ‘Z06PMT270’
    CHANGING
    ct_fcat = lt_fcat ).

    LOOP AT lt_fcat ASSIGNING .
    CASE -fieldname .
    WHEN ‘WFNUM’.
    -hotspot = ‘X’.
    -emphasize = ‘X’.
    WHEN ‘DQKD’ OR ‘YKKD’ OR ‘KDLX’.
    -no_out = ‘X’.

  •  WHEN 'YWAMGX'.
    
  •    -convexit = 'ZZBLY'. "Y/N 转换
    
  •  WHEN 'KZQKK'.
    
  •    -convexit = 'ZZBLY'.
    
  •  WHEN 'QRXX'.
    
  •    -convexit = 'ZZBLC'. "1/2 转换
    

    ENDCASE.
    ENDLOOP.

    CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
    EXPORTING
    i_callback_program = sy-repid
    is_layout_lvc = ls_layout
    it_fieldcat_lvc = lt_fcat
    i_callback_user_command = ‘FRM_US_COMM’
    i_save = ‘A’
    TABLES
    t_outtab = gt_alv
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.
    ENDFORM. " FRM_SET_RB01

这个主要是个思想,一环扣一环,对于复杂的报表这个可以作为一个优化项,就算不封装程序,全部写在双击事件里也可以。

你可能感兴趣的:(ABAP,ALV,abap,sap)