ABAP OOALV模板(Custom 容器)

11 篇文章 7 订阅
9 篇文章 3 订阅

该方法OOALV需要将ALV置入屏幕上的自定义控件中
alv较少时具有代码可读性可维护性高的特点,实现起来较为简单,但由于custom control固定了位置所以无法动态拖拽边框
创建报表程序后通过se80对象浏览器新建屏幕9001
在这里插入图片描述
点击布局进入屏幕制作器界面
将custom control定制控件丢到屏幕里面,保存激活
在这里插入图片描述
报表选择屏幕和取数逻辑和以往一样没什么区别
取数逻辑结束之后,通过CALL SCREEN ‘XXXX’.调用自开发屏幕
在这里插入图片描述
执行CALL SCREEN命令之后,就会进入选择屏幕的PBO(process before output)之中,在此处可以定义GUI STATUS、GUI TITLE、初始化容器信息(容器信息也可以在之前初始)等操作
在这里插入图片描述
在这里插入图片描述
到此时ALV就可以展现了
在这里插入图片描述
GUI STATUS如果是从标准的copy来的,所有的功能码只能展示但都不能使用,如果要对alv进行排序筛选等操作只能通过启用oo alv的layout属性中的notool_bar = ''来使用
一般是新建一个gui status,至少要实现退出的几个标准功能码
在这里插入图片描述
如果有额外的需求比如打印或者别的什么功能按钮,还是和以前一样在应用程序工具栏中新增
在这里插入图片描述
在PAI中监控功能码
在这里插入图片描述
关于内表更新,每次触发功能码时可以通过下述代码先获取选中的行目,再根据行目更新内表勾选标识
在这里插入图片描述
最后成品如下
在这里插入图片描述
成品代码如下

********************************************************************
* 事务代码:                                                       *
* 程序名称:                                                       *
* 程序目的:采购订单OO ALV                                         *
* 设 计 人:                                                       *
* 开 发 人:                                                       *
* 设计时间:                                                       *
* 程序类型: ABAP/4 程序 ,报表程序                                 *
* 应用类型: MM                                                     *
* 描    述:                                                        *
*(修改日志)--------------------------------------------------------*
*                                                                  *
* 日志号   修改人  修改时间       修改说明              传输号码   *
*  ----    ----    ------         -----------
*   001    Seele   2023-02-14     创建打印程序                     *
********************************************************************

REPORT zdemo_seele04.

*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:ekko,
       ekpo.

*----------------------------------------------------------------------*
* 结构声明类型/Structure type declaration
*----------------------------------------------------------------------*
*&---主表数据/master table data
TYPES:BEGIN OF ty_output,
        " 抬头
        ebeln TYPE ekko-ebeln, " 采购凭证号
        bukrs TYPE ekko-bukrs, " 公司代码
        bstyp TYPE ekko-bstyp, " 采购类别

        " 行项目
        ebelp TYPE ekpo-ebelp, " 采购凭证行项目号
        matnr TYPE ekpo-matnr, " 物料号
        netpr TYPE ekpo-netpr, " 净价
        menge TYPE ekpo-menge, " 数量
        meins TYPE ekpo-meins, " 订单单位

        box   TYPE c         , " 单选框

      END OF ty_output.

*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
*&---全局内表定义
DATA:gt_output TYPE TABLE OF ty_output.  " 主数据表

*&---全局结构定义
DATA:gs_output TYPE ty_output.           " 主数据结构

*&---全局对象定义
DATA: gr_container TYPE REF TO cl_gui_custom_container." 功能A: 基本显示
DATA: gr_grid      TYPE REF TO cl_gui_alv_grid." 功能A: 基本显示

*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols                                            *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS:<fs_output> TYPE ty_output.

*&---------------------------------------------------------------------*
*&  ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
*&---ALV数据组,类型池
TYPE-POOLS:slis,
           vrm.

*&---定义ALV显示的字段列及其描述等属性
DATA:gt_fieldcat TYPE TABLE OF lvc_s_fcat, " ALV 控制: 字段目录
     gs_fieldcat TYPE lvc_s_fcat,          " ALV 控制: 字段目录
     gs_layout   TYPE lvc_s_layo.          " ALV 控制: 布局结构

*&---------------------------------------------------------------------*
*&  Macro 宏定义
*&---------------------------------------------------------------------*
DEFINE mcr_set_catalog.
  gs_fieldcat-fieldname  = &1. " 字段技术名称
  gs_fieldcat-coltext    = &2. " 显示名称
  gs_fieldcat-ref_table  = &3. " 参照表
  gs_fieldcat-ref_field  = &4. " 参照表字段
  gs_fieldcat-qfieldname = &5. " 参考计量单位的字段名称
  gs_fieldcat-key        = &6. " key 值
  gs_fieldcat-edit       = &7. " 可编辑

  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR  gs_fieldcat.
END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*
*&---选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-101.

*&---范围
SELECT-OPTIONS:s_ebeln FOR ekko-ebeln ." 采购订单号

SELECTION-SCREEN END OF BLOCK blk01.

*&---------------------------------------------------------------------*
*& Start-of-selection/开始选择屏幕                                     *
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---内表数据获取

  PERFORM frm_get_data.

  IF gt_output IS INITIAL.
    MESSAGE s008(zmm001) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

*&---------------------------------------------------------------------*
*& end-of-selection/结束选择屏幕(程序结束处理,输出等)               *
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*&===ALV 输出
**&---设置ALV输出格式
*  PERFORM frm_init_layout.
**&---设置ALV输出字段
*  PERFORM frm_init_fieldcat.
**&---ALV 显示
*  PERFORM frm_display_alv.

  PERFORM frm_call_screen.

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_10     text
*----------------------------------------------------------------------*
FORM frm_get_data.

  DATA:lv_tabix TYPE i.
  FREE:gt_output.

  SELECT
    ekko~ebeln, " 采购凭证号
    ekko~bukrs, " 公司代码
    ekko~bstyp, " 采购类别
    ekpo~matnr, " 物料号
    ekpo~netpr, " 净价
    ekpo~menge, " 数量
    ekpo~meins  " 订单单位
  FROM ekko
    LEFT JOIN ekpo ON ekko~ebeln = ekpo~ebeln
  WHERE
    ekko~ebeln IN @s_ebeln
  INTO TABLE @DATA(lt_data).

  LOOP AT lt_data INTO DATA(ls_data).
    MOVE-CORRESPONDING ls_data TO gs_output.
    APPEND gs_output TO gt_output.
  ENDLOOP.

ENDFORM.                    " frm_get_data
*&---------------------------------------------------------------------*
*&      Form  frm_init_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_layout .
  CLEAR gs_layout.
  gs_layout-zebra      = 'X' .    " 斑马线
  gs_layout-cwidth_opt = 'X' .    " 自动调整ALVL列宽
  gs_layout-no_toolbar = '' .    " 隐藏工具栏
  gs_layout-sel_mode   = 'A'.     "A: 多选行列 B: 单选行列 C: 多选行列+单选单元格 D: 多选行列+多选单元格
*  gs_layout-box_fname  = 'BOX'.   "选择字段
ENDFORM.                    " frm_init_layout
*&---------------------------------------------------------------------*
*&      Form  frm_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_fieldcat .
*&---ALV 输出字段目录,涉及字段必须大写
  mcr_set_catalog:  'EBELN'  TEXT-a01    'EKKO'  'EBELN'   '' ''  '', " 采购凭证号
                    'BUKRS'  TEXT-a02    'EKKO'  'BUKRS'   '' ''  '', " 公司代码
                    'BSTYP'  TEXT-a03    'EKKO'  'BSTYP'   '' ''  '', " 采购类别
                    'EBELP'  TEXT-a04    'EKPO'  'EBELP'   '' ''  '', " 采购凭证行项目号
                    'MATNR'  TEXT-a05    'EKPO'  'MATNR'   '' ''  '', " 物料号
                    'NETPR'  TEXT-a06    'EKPO'  'NETPR'   '' ''  '', " 净价
                    'MENGE'  TEXT-a07    'EKPO'  'MENGE'   '' ''  '', " 数量
                    'MEINS'  TEXT-a08    'EKPO'  'MEINS'   '' ''  ''. " 订单单位

ENDFORM.                    " frm_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_alv .
*&---ALV 显示函数
  CALL METHOD gr_grid->set_table_for_first_display     " 功能A: 基本显示
    EXPORTING
      i_save                        = 'X'
      i_default                     = 'X'
      is_layout                     = gs_layout   " 功能B: 设定layout
*     IT_TOOLBAR_EXCLUDING          = GT_EXCLUDE  " 功能G: 设定屏蔽标准ALV 工具栏的按钮
    CHANGING
      it_outtab                     = gt_output[]
      it_fieldcatalog               = gt_fieldcat[] " 功能C: 设定fieldcat
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.

  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.                    " frm_display_alv

*&---------------------------------------------------------------------*
*& Form frm_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_refresh .

* 将更新后的数据传到alv所对应的内表
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.

  CLEAR gt_output.

  PERFORM frm_get_data.
  "Refresh ALV
  "Reset the layout
  lr_grid->set_frontend_layout( is_layout = gs_layout ).

  "Refresh ALV display
  lr_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = 'X'
                                                                col = 'X' ) ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CALL_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_screen .
  CALL SCREEN '9001'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
  " 设置菜单状态栏
  SET PF-STATUS 'STATUS_9001'.
  " 可以在描述处填占位符&1 &2...实现动态标题栏,在该语句后加上WITH 'XXX'.
  SET TITLEBAR 'TITLE_9001'.

  " 设置ALV
  IF gr_container IS INITIAL.

    PERFORM frm_init_object.   " 初始化ALV

    PERFORM frm_init_layout.   " 设置layout

    PERFORM frm_init_fieldcat. " 设置fieldcat

    PERFORM frm_display_alv.   " 显示ALV

  ENDIF.


ENDMODULE.

*&---------------------------------------------------------------------*
*& Form frm_init_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_object .
  CREATE OBJECT gr_container  "创建容器对象
    EXPORTING
      container_name = 'CC_ALV'.

  CREATE OBJECT gr_grid "   创建 ALV_GRID 对象
    EXPORTING
      i_parent          = gr_container
    EXCEPTIONS
      error_cntl_create = 1
      error_cntl_init   = 2
      error_cntl_link   = 3
      error_dp_create   = 4
      OTHERS            = 5.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
  DATA : lt_row TYPE lvc_t_roid, "内表
         ls_row TYPE lvc_s_roid. "工作区


  CALL METHOD gr_grid->get_selected_rows
    IMPORTING
      et_row_no = lt_row. "将更新后的数据传到alv所对应的内表

  LOOP AT lt_row INTO ls_row.
    READ TABLE gt_output INTO gs_output INDEX ls_row-row_id .
    IF  sy-subrc EQ  0 .
      gs_output-box = 'X'.

      MODIFY gt_output FROM gs_output  INDEX sy-tabix  TRANSPORTING box.
      CLEAR : gs_output.
    ENDIF .
  ENDLOOP .

  CASE sy-ucomm.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'PRINT'.
      MESSAGE '触发打印按钮' TYPE 'S'.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值