当前位置: 首页 > article >正文

[SAP ABAP] ALV报表练习3

采购订单处理报表

业务目的:根据选择屏幕的筛选条件,使用ALV报表显示采购订单详情

效果展示

采购订单处理报表查询页面
采购订单处理报表(部分截图)

涉及的功能点: 

① 将EBELN列设置成'HOTSPOT'热点,单击某采购凭证编号时,跳转到采购订单管理界面

② 当在采购订单报表处理查询页面取不到任何数据时,在选择画面提示错误消息"不存在满足条件的数据,请确认选择条件"

③ 在采购订单信息查询页面对屏幕上的输入字段"公司代码"进行存在检查,如果不存在该公司代码,提示消息"公司xxxx不存在,请检查"

④ 在采购订单处理报表信息页面 ,点击刷新按钮,可刷新ALV行信息的内容

完整代码如下所示

主程序(zmm01_437)

*&---------------------------------------------------------------------*
*& Report ZMM01_437
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm01_437.

INCLUDE zmm01_437_top. " 数据定义

INCLUDE zmm01_437_f01. " 子例程


*----------------------------------------------------------------------*
*  DESC: INITIALIZATION 事件
*----------------------------------------------------------------------*
INITIALIZATION.
  PERFORM frm_set_initialization.  " 赋初始值


*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.


*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN  事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
  PERFORM frm_check_data.  " 数据检查


*----------------------------------------------------------------------*
*  DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_get_data.  " 获取数据

  " 检查数据是否为空
  IF gt_ekpo IS INITIAL.
    MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.
  ENDIF.


*---------------------------------------------------------------------*
* END-OF-SELECTION 事件
*---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM frm_display_data.  " ALV呈现数据

INCLUDE程序(zmm01_437_top) 

*&---------------------------------------------------------------------*
*& 包含               ZMM01_437_TOP
*&---------------------------------------------------------------------*

TABLES: ekko, ekpo.

* 选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
  PARAMETERS:       p_bukrs    TYPE ekko-bukrs OBLIGATORY DEFAULT '1010'.  " 公司代码(必输,默认值为1010)
  SELECT-OPTIONS:   s_bsart    FOR ekko-bsart,                             " 采购凭证类型
                    s_aedat    FOR ekko-aedat,                             " 创建日期
                    s_ernam    FOR ekko-ernam,                             " 创建人
                    s_matnr    FOR ekpo-matnr.                             " 物料号
SELECTION-SCREEN END OF BLOCK b01.


* 自定义数据类型
TYPES: BEGIN OF ty_ekpo,
         sel(1),                                       " 选择标志
         index            TYPE n LENGTH 5,             " 序号
         ebeln            TYPE ekpo-ebeln,             " 采购凭证编号
         ebelp            TYPE ekpo-ebelp,             " 采购凭证行
         loekz            TYPE c LENGTH 10,            " 删除标记
         txz01            TYPE ekpo-txz01,             " 行项目文本
         matnr            TYPE ekpo-matnr,             " 物料号
         maktx            TYPE makt-maktx,             " 物料描述
         bukrs            TYPE ekko-bukrs,             " 公司代码
         butxt            TYPE t001-butxt,             " 公司代码描述
         werks            TYPE ekpo-werks,             " 工厂
         name1            TYPE t001w-name1,            " 工厂名称
         lgort            TYPE ekpo-lgort,             " 存储地点
         lgobe            TYPE t001l-lgobe,            " 存储地点描述
         banfn            TYPE ekpo-banfn,             " 采购申请编号
         menge            TYPE ekpo-menge,             " 订单数量
         meins            TYPE ekpo-meins,             " 订单单位
         zyshsl           TYPE ekpo-menge,             " 已收货数量
         zwshsl           TYPE ekpo-menge,             " 未收货数量 (未收货数量 = 订单数量 - 已收货数量)
END OF ty_ekpo.


* 定义内表和结构变量
DATA: gs_ekpo TYPE ty_ekpo,                    " 结构体变量(工作区)
      gt_ekpo TYPE STANDARD TABLE OF ty_ekpo.  " 内表


* ALV参数定义
DATA: gs_layout TYPE lvc_s_layo,                       " 用于定义ALV表单的相关格式、属性
      gs_fcat   TYPE lvc_s_fcat,                       " 字段目录工作区
      gt_fcat   LIKE TABLE OF gs_fcat.                 " 字段目录内表

INCLUDE程序(zmm01_437_f01) 

*&---------------------------------------------------------------------*
*& 包含               ZMM01_437_F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form frm_set_initialization
*&---------------------------------------------------------------------*
*& 屏幕缺省值设置:20240101至当前日期
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_initialization .
  s_aedat-sign = 'I'.
  s_aedat-option = 'EQ'.
  s_aedat-low = '20240101'.
  s_aedat-high = sy-datum.
  APPEND s_aedat.           " S_AEDAT创建日期  缺省值  20240101 至当前日期
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data.
  SELECT ekpo~ebeln  " 采购凭证编号
         ekpo~ebelp  " 采购凭证行
         ekpo~loekz  " 删除标记
         ekpo~txz01  " 行项目文本
         ekpo~matnr  " 物料号
         makt~maktx  " 物料描述
         ekko~bukrs  " 公司代码
         t001~butxt  " 公司代码描述
         ekpo~werks  " 工厂
         t001w~name1 " 工厂名称
         ekpo~lgort  " 存储地点
         t001l~lgobe " 存储地点描述
         ekpo~banfn  " 采购申请编号
         ekpo~menge  " 订单数量
         ekpo~meins  " 订单单位
    FROM ekpo
    INNER JOIN ekko
    ON ekpo~ebeln = ekko~ebeln
    LEFT JOIN makt
    ON ekpo~matnr = makt~matnr
    AND makt~spras = sy-langu
    LEFT JOIN t001
    ON ekko~bukrs = t001~bukrs
    LEFT JOIN t001w
    ON ekpo~werks = t001w~werks
    LEFT JOIN t001l
    ON ekpo~werks = t001l~werks
    AND ekpo~lgort = t001l~lgort
    INTO CORRESPONDING FIELDS OF TABLE gt_ekpo
    WHERE ekko~bukrs = p_bukrs
    AND ekko~bsart IN s_bsart
    AND ekko~aedat IN s_aedat
    AND ekko~ernam IN s_ernam
    AND ekpo~matnr IN s_matnr.

  " 处理字段逻辑数据
  IF sy-subrc = 0.

    SORT gt_ekpo BY ebeln ASCENDING ebelp ASCENDING.  " 输出结果按照以下字段升序排列:EBELN,EBELP

    " 数据编辑
    LOOP AT gt_ekpo ASSIGNING FIELD-SYMBOL(<lfs_ekpo>).

      <lfs_ekpo>-index = sy-tabix.   " 序号处理

      " 当字段loekz = L时,显示“已删除”,否则显示为空
      IF <lfs_ekpo>-loekz = 'L'.
        <lfs_ekpo>-loekz = '已删除'.
      ENDIF.

      " zyshsl字段(已收货数量)逻辑处理
      SELECT SUM( wemng )
        FROM eket
        INTO <lfs_ekpo>-zyshsl
        WHERE ebeln = <lfs_ekpo>-ebeln
        AND ebelp = <lfs_ekpo>-ebelp.

      <lfs_ekpo>-zwshsl = <lfs_ekpo>-menge - <lfs_ekpo>-zyshsl. " 未收货数量 = 订单数量 - 已收货数量

      " 将订单单位转换成“可读”的格式,例如将“EA”转换成“个”
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          input          = <lfs_ekpo>-meins  " 转换前
          language       = sy-langu
        IMPORTING
          long_text      = <lfs_ekpo>-meins  " 转换后
        EXCEPTIONS
          unit_not_found = 1
          OTHERS         = 2.

      " 将最终输出的物料号字段,转换成“外部格式”
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
        EXPORTING
          input  = <lfs_ekpo>-matnr  " 转换前
        IMPORTING
          output = <lfs_ekpo>-matnr. " 转换后
    ENDLOOP.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& 对屏幕上的输入字段 P_BUKRS 进行“存在检查”
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_data .
  DATA: lv_bukrs TYPE t001-bukrs.

  SELECT SINGLE bukrs
    INTO lv_bukrs
    FROM t001
    WHERE bukrs = p_bukrs.
  IF sy-subrc <> 0.
    MESSAGE e000(z_msg2025) WITH p_bukrs. " 公司&1 不存在,请检查
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .
  " 设置fieldcat
  PERFORM frm_set_fieldcat.

  " 调用ALV函数
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
   EXPORTING
     i_bypassing_buffer                = abap_true
     i_callback_program                = sy-repid
     i_callback_pf_status_set          = 'FRM_ALV_SET_STATUS'         " 子例程(设置状态栏)
     i_callback_user_command           = 'FRM_ALV_USER_COMMAND'       " 子例程(用户指令响应)
     is_layout_lvc                     = gs_layout                    " 设置ALV布局
     it_fieldcat_lvc                   = gt_fcat                      " 设置ALV列属性
     i_save                            = 'A'
    TABLES
      t_outtab                         = gt_ekpo                      " 内表数据
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
  DATA: lv_index LIKE sy-index.

  CLEAR: gs_fcat,
         gt_fcat,
         gs_layout.

* 设置行的属性(ALV界面格式)
  gs_layout-cwidth_opt = 'X'.  " 设置自适应列宽
  gs_layout-zebra = 'X'.       " 设置斑马标识
  gs_layout-box_fname = 'SEL'. " 用于ALV做选择的box

  " ALV字段处理宏
  DEFINE catalog.
    lv_index = lv_index + 1.
    gs_fcat-col_pos       = lv_index.
    gs_fcat-fieldname     = &1.         " 设置要输出的表格列的值,在内表中定义的字段名(必须大写)
    gs_fcat-fix_column    = &2.         " 固定列
    gs_fcat-ref_table     = &3.
    gs_fcat-edit          = &4.         " 是否可编辑
    gs_fcat-colddictxt    = 'L'.
    gs_fcat-scrtext_l     = &5.         " 设置要输出的表格列的列名,即ALV报表显示的列名
    gs_fcat-ref_field     = &6.
    gs_fcat-outputlen     = &7.
    gs_fcat-emphasize     = &8.         " 列颜色
    gs_fcat-hotspot       = &9.         " 热点
    APPEND gs_fcat TO gt_fcat.
  END-OF-DEFINITION.


*   *          &1       &2         &3             &4     &5             &6      &7      &8     &9
    catalog:
            'INDEX'     'X'        ''             ''     '序号'          ''      ''      ''     '',
            'EBELN'     'X'        ''             ''     '采购凭证编号'  ''      ''      ''     'X',
            'EBELP'     'X'        ''             ''     '采购凭证行'    ''      ''      ''     '',
            'LOEKZ'     ''         ''             ''     '删除标记'      ''      ''      ''     '',
            'TXZ01'     ''         ''             ''     '行项目文本'    ''      ''      ''     '',
            'MATNR'     ''         ''             ''     '物料号'        ''      ''      ''     '',
            'MAKTX'     ''         ''             ''     '物料描述'      ''      ''      ''     '',
            'BUKRS'     ''         ''             ''     '公司代码'      ''      ''      ''     '',
            'BUTXT'     ''         ''             ''     '公司代码描述'  ''      ''      ''     '',
            'WERKS'     ''         ''             ''     '工厂'          ''      ''      ''     '',
            'NAME1'     ''         ''             ''     '工厂名称'      ''      ''      ''     '',
            'LGORT'     ''         ''             ''     '存储地点'      ''      ''      ''     '',
            'LGOBE'     ''         ''             ''     '存储地点描述'  ''      ''      ''     '',
            'BANFN'     ''         ''             ''     '采购申请编号'  ''      ''      ''     '',
            'MENGE'     ''         ''             ''     '订单数量'      ''      ''      'C510' '',
            'MEINS'     ''         ''             ''     '订单单位'      ''      ''      ''     '',
            'ZYSHSL'    ''         ''             ''     '已收货数量'    ''      ''      ''     '',
            'ZWSHSL'    ''         ''             ''     '未收货数量'    ''      ''      ''     ''.

ENDFORM.


* 设置状态栏
FORM frm_alv_set_status USING ct_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSTALV' EXCLUDING ct_extab.
ENDFORM.


* 设置用户指令响应
FORM frm_alv_user_command USING pv_ucomm LIKE sy-ucomm
                                ps_selfield TYPE kkblo_selfield.

  " 编辑完成保存后强制刷新ALV页面
  DATA: lr_grid  TYPE REF TO cl_gui_alv_grid.
  DATA: lv_stable TYPE lvc_s_stbl.
  lv_stable-row = abap_true.
  lv_stable-col = abap_true.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data.

  CASE pv_ucomm.   " pv_ucomm参数表示引发输入后处理的功能代码
    WHEN '&IC1'.   " 单击(热点)或者双击进行触发:单击和双击使用同一功能代码(用户命令执行)
      READ TABLE gt_ekpo INTO gs_ekpo INDEX ps_selfield-tabindex.
      IF ps_selfield-fieldname = 'EBELN'.
        " 单击某采购凭证编号时,跳转到采购订单管理界面
        SET PARAMETER ID 'BES' FIELD gs_ekpo-ebeln .
        CALL TRANSACTION 'ZDIALOG_GZ437'.
      ENDIF.
    WHEN '&SX'.
      PERFORM frm_get_data.
  ENDCASE.

  " 刷新
  CALL METHOD lr_grid->refresh_table_display
    EXPORTING
      is_stable = lv_stable.

ENDFORM.

上述代码涉及的文本元素以及选择文本内容如下所示

TEXT-001文本内容
选择文本内容

GUI STATUS状态栏

补充扩展知识

调用REUSE_ALV_GRID_DISPLAY_LVC函数显示ALV,在调用该函数之前,需要先定义Layout和Fieldcat,该函数对应的Layout 类型为lvc_s_layo,Fieldcat类型为lvc_s_fcat

Layout主要用于设定 ALV的输出格式

Fieldcat主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性

本文涉及到的相关知识点

[SAP ABAP] ALV报表练习1

[SAP ABAP] ALV报表练习2

[SAP ABAP] Dialog屏幕开发


http://www.kler.cn/a/529122.html

相关文章:

  • Python字典详解:从入门到实践
  • AI协助探索AI新构型的自动化创新概念
  • list的使用,及部分功能的模拟实现(C++)
  • Spring JDBC:简化数据库操作的利器
  • 【二叉搜索树】
  • SQL server 数据库使用整理
  • 跨组织环境下 MQTT 桥接架构的评估
  • mac安装wireshark
  • 图书管理系统 Axios 源码__新增图书
  • K近邻算法
  • OSCP - Proving Grounds - Jordak
  • GenAI 在金融服务领域的应用:2025 年的重点是什么
  • conda配置channel
  • Automatic Prefix Caching
  • 【数据结构】(3)包装类和泛型
  • 关于DNN检测中替换caff用Tensorflow的注意事项
  • 7.攻防世界fileclude
  • Qt Creator 中使用 vcpkg
  • Doki Doki Mods Maker小指南
  • 网络原理(3)—— 传输层详解
  • RK3568连接wifi(connmanctl工具)
  • 使用 Docker 部署 pSQL 服务器 的教程
  • 如何为用户设置密码
  • 爬取豆瓣书籍数据
  • 本地部署DeepSeek教程(Mac版本)
  • 一个数如果恰好等于他的因子之和,这是就成为“完数“,例如6=1+2+3.编程找出1000以内的所有完数