ABAP-ALV-双击界面弹出窗口 (SALV)

原文链接:https://www.cnblogs.com/BruceKing/p/16337476.html

此文引用自寒武青峰大姑 原文https://blog.youkuaiyun.com/lmf496891416/article/details/124249915?spm=1001.2014.3001.5502

ALV界面
在这里插入图片描述

双击行任一地方 跳出新的窗口
在这里插入图片描述

弹窗是使用SALV的简单展示,有标准的按钮与简单设置,使用起来蛮方便的,写个例子记录一下。
详细设置可以我参考寒武青峰大姑的另外一篇博客 简单SALV

*&---------------------------------------------------------------------*
*& Report ZCYCLE041
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcycle041.

TYPE-POOLS: slis.
TYPE-POOLS: kcde.

*&---------------------------------------------------------------------*
*&      TABLES
*&---------------------------------------------------------------------*
TABLES: vbap,vbak.

*----------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES DECLARATION
*----------------------------------------------------------------------*
DATA: gt_file TYPE filetable.

*----------------------------------------------------------------------*
* GLOBAL VARIANTS DECLARATION
*----------------------------------------------------------------------*
DATA: g_repid TYPE sy-repid.
DATA: gt_field TYPE slis_t_fieldcat_alv.
*定义读入EXCEL的内表

TYPES : BEGIN OF typ_alv ,
          vbeln TYPE vbak-vbeln,
          erdat TYPE vbak-erdat, "创建日期
          vkorg TYPE vbak-vkorg, "销售组织
          vkbur TYPE vbak-vkbur, "销售办事处
          ernam TYPE vbak-ernam, "创建人
          sel   TYPE c , "    复选框
        END OF typ_alv .
DATA : gs_alv   TYPE typ_alv,
       gt_print TYPE TABLE OF typ_alv,
       gt_alv   TYPE TABLE OF typ_alv.

*创建字段宏定义
DEFINE add_field.
  ls_fieldcat-fieldname = '&1' .  "字段名称
  ls_fieldcat-ref_table = &2. "关联表格
  ls_fieldcat-ref_field = &3."参考字段
  ls_fieldcat-coltext = &4. "描述文本
  ls_fieldcat-EMPHASIZE = &5. "颜色
  ls_fieldcat-HOTSPOT = &6.  "下划线
  APPEND ls_fieldcat TO gt_fieldcat.
  CLEAR ls_fieldcat.
END-OF-DEFINITION.


*--------选择条件
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-001.

  SELECT-OPTIONS:
                    s_vkorg  FOR     vbak-vkorg OBLIGATORY,"销售组织
                    s_vkbur  FOR     vbak-vkbur ,"销售办公室
                    s_ernam  FOR     vbak-ernam."创建人
SELECTION-SCREEN END OF BLOCK bl01.

* ALV 用
DATA:
  gs_layout   TYPE lvc_s_layo,
  gv_repid    TYPE repid,
  gt_fieldcat TYPE lvc_t_fcat,
  ls_fieldcat TYPE lvc_s_fcat.
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
*DATA: GT_ALVDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
*DATA: G_LIGHTS_NAME TYPE LVC_CIFNM VALUE 'LIGHT'.
*&---------------------------------------------------------------------*
*&   EVENT AT INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION .

AT SELECTION-SCREEN OUTPUT .

*----------------------------------------------------------------------*
* EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED
*----------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM frm_auth_check.  "权限检查
  PERFORM frm_getdata .    "获取数据  --GETTING DATA
  PERFORM frm_display_data.  "展示ALV

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& FORM FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_auth_check .

ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_GETDATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_getdata .

  SELECT vbak~vbeln,
         vbak~erdat,"创建日期
         vbak~vkorg,"销售组织
         vbak~vkbur, "销售办事处
         vbak~ernam
    FROM vbak
   WHERE vbak~vkorg IN @s_vkorg
    AND  vbak~vkbur IN @s_vkbur
    AND  vbak~ernam IN @s_ernam
    INTO CORRESPONDING FIELDS OF TABLE @gt_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_display_data .
  DATA : lv_html_header TYPE slis_formname  .
*定义输出模式
  CLEAR:gs_layout,gt_fieldcat.
  gs_layout-cwidth_opt         = 'X'.
  gs_layout-zebra              = 'X'.
  gs_layout-box_fname              = 'SEL'.
  gv_repid = sy-repid.
  PERFORM frm_set_fieldcat.
  .
*  TRY .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = gv_repid
      i_callback_user_command  = 'FRM_USER_COMMAND'
      "i_callback_pf_status_set = 'FRM_PF_STATUS'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
  add_field:
          vbeln   'VBAK'   'VBELN' '销售订单' '' '',
          erdat   'VBAK'   'ERDAT' '创建日期' '' '',
          vkorg   'VBAK'   'VKORG' '销售组织' '' '',
          vkbur   'VBAK'   'VKBUR' '销售办事处' '' '',
          ernam   'VBAK'   'ERNAM' '创建人' 'X' 'X'.
ENDFORM.

FORM frm_pf_status USING extab TYPE slis_t_extab.
  DATA: fcode TYPE TABLE OF sy-ucomm.
  CLEAR:fcode[].

  SET PF-STATUS 'STANDARD' EXCLUDING fcode[] .
ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       自定义用户动作
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*

*自定义用户动作
FORM frm_user_command USING p_ucomm TYPE sy-ucomm rs_selfield TYPE slis_selfield.
  DATA : l_ucomm TYPE sy-ucomm  .
  IF g_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = g_grid.
  ENDIF.
  "失去焦点触发更新内表
  CALL METHOD g_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD g_grid->check_changed_data.
  rs_selfield-refresh     = 'X'.
  rs_selfield-col_stable  = 'X'.
  rs_selfield-row_stable  = 'X'.
  l_ucomm = p_ucomm .
  CLEAR p_ucomm .
  DATA : l_uname TYPE sy-uname,
         l_datum TYPE sy-datum,
         l_uzeit TYPE sy-uzeit.

  CASE l_ucomm.


    WHEN '&IC1'. "双击
      READ TABLE gt_alv INDEX rs_selfield-tabindex INTO DATA(wa_sel_temp).  "双击行
      IF sy-subrc = 0 .
*        SET PARAMETER ID 'VL' FIELD WA_SEL_TEMP-VBELN .
*        CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN ."SKIP FIRST SCREEN 忽略SELECTION SCREEN
        PERFORM displat_item USING wa_sel_temp-vbeln.
      ENDIF.
      CLEAR:wa_sel_temp.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& FORM DISPLAT_ITEM
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM displat_item  USING p_vbeln.
  DATA: go_alv    TYPE REF TO cl_salv_table,
        go_funlst TYPE REF TO cl_salv_functions_list.
  DATA: cxroot TYPE REF TO cx_root,
        excmsg TYPE c.
  CLEAR:go_alv,go_funlst.

  SELECT vbap~vbeln,
         vbap~posnr,
         vbap~matnr,
         vbap~zmeng,
         makt~maktx
    FROM vbap
    LEFT JOIN makt ON makt~matnr EQ vbap~matnr AND makt~spras = '1'
   WHERE vbeln = @p_vbeln
    INTO TABLE @DATA(lt_item).
  IF sy-subrc = 0.
    TRY.
        cl_salv_table=>factory(
        IMPORTING
        r_salv_table = go_alv   "导出ALV的容器对象
        CHANGING
        t_table = lt_item[] ).  "内容表
      CATCH cx_root INTO cxroot.
        excmsg = cxroot->get_text( ).
        MESSAGE e000(oo) WITH excmsg.
    ENDTRY.

    go_funlst = go_alv->get_functions( ).
    go_funlst->set_all( 'X' ).

    "重新设置列名称
    go_alv->get_columns( )->get_column( 'MAKTX' )->set_long_text( 'TES删除' )."
    "隐藏列
    go_alv->get_columns( )->get_column( 'ZMENG' )->set_visible( value = if_salv_c_bool_sap=>false ).

    IF go_alv IS BOUND."设置窗口大小与位置-
      go_alv->set_screen_popup(
      start_column = 30
      end_column = 160
      start_line = 5
      end_line = 20 ).
      go_alv->display( ).
    ENDIF.

  ENDIF.
ENDFORM.

代码直接复制就能用了。

另外自己扩展下,

PERFORM displat_item USING wa_sel_temp-vbeln. 这里的形式参数可以扩展为任意的字段取弹出需要的新的ALV,

---- add 20230412 start —
原文链接:https://www.cnblogs.com/caizjian/p/8806551.html
这里总结最近用 cl_salv_table 实现 ALV 遇到问题和解决办法

FORM set_alv2 .
DATA: lv_syrepid TYPE syrepid.
      lv_syrepid  = sy-cprog.
      cl_salv_table=>factory(
        EXPORTING
        list_display = abap_false
        r_container = cl_gui_container=>screen0
        IMPORTING
          r_salv_table = gr_alv
        CHANGING t_table = gt_doc ). “传输需要显示的内表

      gr_functions = gr_alv->get_functions( ).        "获取常用的ALV功能按钮


DATA lv_icon TYPE string.
lv_icon = icon_refresh.
gr_functions->add_function(       "添加自定义按钮
 EXPORTING
   name = 'DOWNLOAD'
   icon = '@M9@'
   text = '下载文档'
   tooltip = '下载文档'
   position = if_salv_c_function_position=>right_of_salv_functions ). "往右边排

gr_functions->add_function(
 EXPORTING
   name = 'SELECT_ALL'
   icon = '@4B@'
   text = '全选'
   tooltip = '全选'
   position = if_salv_c_function_position=>left_of_salv_functions ). "往右边排

gr_functions->add_function(
 EXPORTING
   name = 'DESELECT_ALL'
   icon = '@4D@'
   text = '取消全选'
   tooltip = '取消全选'
   position = if_salv_c_function_position=>left_of_salv_functions ). "往右边排

gr_functions->set_all( abap_true ). ”设置所有alv按钮(自带的+自定义的)
"=====获取事件对象
DATA: gr_event TYPE REF TO cl_salv_events_table.
gr_event = gr_alv->get_event( ).

"=====事件注册
DATA: gr_handle_event TYPE REF TO cl_handle_events.
CREATE OBJECT gr_handle_event.
SET HANDLER gr_handle_event->on_user_command FOR gr_event.
SET HANDLER gr_handle_event->on_checkbox     FOR gr_event.
DATA: gr_column_list TYPE REF TO cl_salv_column_list.

      gr_columns = gr_alv->get_columns( ).               "获取列的class
      gr_column  = gr_columns->get_column('ACTION_NO').  "获取该列 
      gr_column->set_short_text('需求号').        "调用修改列名称的方法
      gr_columns->set_optimize( abap_true ).      "调用设置列最优化设置方法这边用到列实例是gr_colums不是gr_colum

      gr_column = gr_columns->get_column('FLAG').  

      gr_column->set_short_text('选择').
      gr_columnt ?= gr_column.                      "这边很重要
      gr_columnt->set_cell_type( 6 ).          "设置选择列为checkbox,6代表checkbox

      gr_display = gr_alv->get_display_settings( ).  "alv设置
      gr_display->set_list_header('需求号&文档编号报表'). "alv抬头设置
      gr_alv->display( )."调用实例方法显示表报        "调用显示alv方法展示ALV报表
ENDFORM.                    " SET_ALV2
下面是是事件的class的定义
CLASS cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
                  IMPORTING e_salv_function,
             on_checkbox     FOR EVENT link_click OF cl_salv_events_table
                  IMPORTING row   column.

ENDCLASS.

CLASS cl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    PERFORM handle_user_command USING e_salv_function.
  ENDMETHOD.
  METHOD on_checkbox.
    PERFORM handle_clickbox USING row column.
  ENDMETHOD.
ENDCLASS.
事件的方法定义
FORM handle_user_command  USING p_function TYPE salv_de_function.


    CASE p_function.
    WHEN 'DOWNLOAD'.
       PERFORM down_doc.
    WHEN 'DESELECT_ALL'.
         gs_doc-flag = ' '.
         MODIFY gt_doc FROM gs_doc TRANSPORTING flag  WHERE flag = 'X'.
    WHEN 'SELECT_ALL'.
         gs_doc-flag = 'X'.
         MODIFY  gt_doc FROM gs_doc TRANSPORTING flag WHERE flag = ' '.

  ENDCASE.
     gr_alv->refresh( ).
ENDFORM.

---- add 20230412 end —

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值