前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP 之ALV展示及下钻弹窗数据页面

ABAP 之ALV展示及下钻弹窗数据页面

作者头像
百里丶落云
发布2022-12-01 18:02:49
8600
发布2022-12-01 18:02:49
举报
文章被收录于专栏:享~方法

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

HELLO, 这里是百里一个学习中的ABAPER,这里记录工作学习中遇到的bug,知识内容等内容.今天讲的是在工作中经常会使用的数据下钻,通过跳出小界面的方式展示关联数据.今天结合工作经验这里做下技术总结.

下钻简介

在ALV报表展示中.会出现关键字段下钻,展示某个界面或者系统自带界面.此时需要给增加 user_command 事件. 下钻内容包括,展示具体某个界面,系统界面,与关键字对应的ALV界面.

技术介绍

下钻弹窗数据展示的关键技术为调用函数 cl_salv_table=>factory 展示一个新的ALV容器数据. 首先先跟本身第一层开发ALV方式一样, 定义默认基础数据集,权限检查,定义ALV layout ,fieldcat 等相关属性内容. 同时设定对应的staus 及usercommd 方便操作用户事件.设定第一层ALV展示数据的基础上,设定hot字段,在按照关键字段关联对应下一级ALV展示数据.

代码语言:javascript
复制
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' ).

实例展示

此例子第一层为VBAK 表 VBELN 字段,第二层内容为对应VBELN 单号对应的 料号数据及料号长描述例子.

创建数据集

设定ALV 定义相关结构,工作区内表.同时定义必要字段如ALV展示相关变量.usercomed 变量.格式及样式变量字段.

代码语言:javascript
复制
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.  
* 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.  
*创建字段宏定义  
DEFINE add_field.  
  ls_fieldcat-fieldname = '&1' .  "字段名称  
  ls_fieldcat-ref_table = &2. "关联表格  
  ls_fieldcat-ref_field = &3."参考字段  
  ls_fieldcat-coltext = &4. "描述文本  
  APPEND ls_fieldcat TO gt_fieldcat.  
  CLEAR ls_fieldcat.  
END-OF-DEFINITION.

设定选择屏幕

筛选关键字段,where 条件.

代码语言:javascript
复制
*--------选择条件  
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.

获取数据内容

代码语言:javascript
复制
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_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.

ALV展示内容

代码语言:javascript
复制
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 .  
  add_field:  
          vbeln   'VBAK'   'VBELN' '销售订单',  
          erdat   'VBAK'   'ERDAT' '创建日期',  
          vkorg   'VBAK'   'VKORG' '销售组织',  
          vkbur   'VBAK'   'VKBUR' '销售办事处',  
          ernam   'VBAK'   'ERNAM' '创建人'.  
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.  
*&amp;---------------------------------------------------------------------*  
*&amp;      FORM  FRM_USER_COMMAND  
*&amp;---------------------------------------------------------------------*  
*       自定义用户动作  
*----------------------------------------------------------------------*  
*  -->  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 '&amp;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.  
*&amp;---------------------------------------------------------------------*  
*&amp;---------------------------------------------------------------------*  
*&amp;---------------------------------------------------------------------*  
*&amp; FORM DISPLAT_ITEM  
*&amp;---------------------------------------------------------------------*  
*&amp; TEXT  
*&amp;---------------------------------------------------------------------*  
*&amp; -->  P1        TEXT  
*&amp; <--  P2        TEXT  
*&amp;---------------------------------------------------------------------*  
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删除' )."  
  
  
    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.

结果展示

如图展示内容结果,一级对应的字段为,VBAK 表中的 销售订单,创建日期,销售组织,销售办事处,创建人等字段, 通过usercomed ,双击数据VBELN下钻到下一层ALV数据. 下层ALV数据展示内容为 销售订单凭证,行号,料号,目标数量,同时可以使用 go_alv->get_columns( )->get_column( 'MAKTX' )->set_long_text( 'TES删除' )." 给对应的字段附加更换列名.

image.png
image.png

技术总结

ALV数据下钻是在工作中经常使用的必要内容.能够熟练使用ALV下钻并按照关键字展示下级相关ALV数据是一个ABAPER 必会内容. 此文详细讲解了必要技术.希望能够帮助大家 .

贵有恒何必三更起五更睡,最无益只怕一日曝十日寒。 这里是百里,一个年近30的中年程序员.希望能够帮到您.

wallhaven-y86g17.jpg
wallhaven-y86g17.jpg
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下钻简介
  • 技术介绍
  • 实例展示
    • 创建数据集
      • 设定选择屏幕
        • 获取数据内容
          • ALV展示内容
          • 结果展示
          • 技术总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档