[SAP ABAP] ALV报表练习2

物料信息&采购订单信息查询报表

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

效果展示

物料信息查询页面
物料信息查询报表(部分截图)
采购订单信息查询页面
采购订单信息查询报表(部分截图)

涉及的功能点:

1.当在物料信息查询页面以及采购订单信息查询页面取不到任何数据时,在选择画面提示错误消息"不存在满足条件的数据,请确认选择条件"

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

3.物料信息查询报表和采购订单信息查询报表中的物料号都设置成"HOTSPOT"热点,单击某物料号跳转到 MM03 的界面显示该物料详情

4.采购订单信息查询报表中的采购凭证编号设置成"HOTSPOT",当双击某采购凭证编号时,跳转到ME23N显示该采购订单详情

5.在采购订单信息查询报表中选择需要进行打印的采购凭证编号行数据,点击打印按钮,进行后续的Smartforms表单打印操作

6.在采购订单信息查询报表中选择需要进行导出的采购凭证编号行数据,点击PDF格式导出按钮,以PDF格式导出表单数据到电脑本地

完整代码如下所示

主程序(zmm60_437)

*&---------------------------------------------------------------------*
*& Report ZMM60_437
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm60_437.

INCLUDE zmm60_437_top. " 数据定义

INCLUDE zmm60_437_f01. " 子例程


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


*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_set_screen.  " 选择屏幕的动态变化


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


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


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

INCLUDE程序(zmm60_437_top) 

*&---------------------------------------------------------------------*
*& 包含               ZMM60_437_TOP
*&---------------------------------------------------------------------*

TABLES: mara,ekko,ekpo.

* 自定义数据类型
TYPES: BEGIN OF ty_item,
         sel(1),                                       " 选择标志
         index           TYPE n LENGTH 5,              " 序号
         matnr           TYPE mara-matnr,              " 物料编号
         maktx           TYPE makt-maktx,              " 物料描述
         ersda           TYPE mara-ersda,              " 创建日期
         cyear(4)        TYPE c,                       " 创建年度  mara-ersda取前4位
         cmonth(2)       TYPE c,                       " 创建月    mara-ersda取前5-6位
         cday(2)         TYPE c,                       " 创建日    mara-ersda取前7-8位
         ctime           TYPE tims,                    " 创建时间
         ernam           TYPE mara-ernam,              " 创建人
         name_first      TYPE user_addr-name_first,    " 名
         name_last       TYPE user_addr-name_last,     " 姓
         nametxt         TYPE c LENGTH 40,             " 创建人描述 user_addr-name_first连接user_addr-name_last后输出
         lvorm           TYPE c LENGTH 6,              " 删除标记
END OF ty_item.

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,             " 未收货数量 (未收货数量 = 订单数量 - 已收货数量)
         bsart            TYPE esart,                  " 采购凭证类型
         lifnr            TYPE elifn,                  " 供应商帐户号
END OF ty_ekpo.


* 定义内表和结构变量
DATA: gs_item TYPE ty_item,                    " 结构体变量(工作区)
      gs_ekpo TYPE ty_ekpo,                    " 结构体变量(工作区)
      gt_item TYPE STANDARD TABLE OF ty_item,  " 内表
      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.                 " 字段目录内表


* 选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.

* 物料查询选择条件
  SELECT-OPTIONS:   s_matnr    FOR mara-matnr MODIF ID m1,                             " 物料号
                    s_ersda    FOR mara-ersda MODIF ID m1,                             " 创建日期
                    s_matkl    FOR mara-matkl MODIF ID m1.                             " 物料组
  PARAMETERS:       p_lvorm    TYPE mara-lvorm AS CHECKBOX MODIF ID m1.                " 删除标记(复选框)

* 采购订单查询选择条件
  PARAMETERS:       p_bukrs    TYPE ekko-bukrs OBLIGATORY DEFAULT '1010' MODIF ID m2.  " 公司代码(必输,默认值为1010)
  SELECT-OPTIONS:   s_bsart    FOR ekko-bsart MODIF ID m2,                             " 采购凭证类型
                    s_aedat    FOR ekko-aedat MODIF ID m2,                             " 创建日期
                    s_ernam    FOR ekko-ernam MODIF ID m2,                             " 创建人
                    s_mat      FOR ekpo-matnr MODIF ID m2.                             " 物料号

SELECTION-SCREEN END OF BLOCK b01.


SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-002.

* 功能选择
  PARAMETERS:       p_mara     TYPE xfeld RADIOBUTTON GROUP r1 DEFAULT 'X' USER-COMMAND u1,  " 查询物料信息(缺省值)
                    p_ekko     TYPE xfeld RADIOBUTTON GROUP r1.                              " 查询采购订单信息

SELECTION-SCREEN END OF BLOCK b02.

INCLUDE程序(zmm60_437_f01) 

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

  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
*&---------------------------------------------------------------------*
*& 获取数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data.
  IF p_mara = abap_true.
    PERFORM frm_get_mara.  " 获取物料信息
  ELSE.
    PERFORM frm_get_ekpo.  " 获取采购订单信息
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& 数据呈现
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  " 设置fieldcat
  PERFORM frm_set_fieldcat.

  IF p_mara = abap_true.
    " 调用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_item                      " 内表数据
     EXCEPTIONS
       program_error                     = 1
       OTHERS                            = 2.

  ELSE.
    " 调用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.

  ENDIF.

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.

  IF p_mara = abap_true.
*   *          &1       &2        &3             &4     &5           &6      &7      &8     &9
     catalog:
             'INDEX'   'X'        ''             ''     '序号'        ''      ''     ''      '',
             'MATNR'   'X'        ''             ''     '物料编号'    ''      ''     'C110'  'X',
             'MAKT'     ''        ''             ''     '物料描述'    ''      ''      ''     '',
             'CYEAR'    ''        ''             ''     '创建年度'    ''      ''      ''     '',
             'CMONTH'   ''        ''             ''     '创建月'      ''      ''      ''     '',
             'CDAY'     ''        ''             ''     '创建日'      ''      ''      ''     '',
             'CTIME'    ''        ''             ''     '创建时间'    ''      ''      ''     '',
             'ERNAM'    ''        ''             ''     '创建人'      ''      ''      ''     '',
             'NAMETXT'  ''        ''             ''     '创建人描述'  ''      ''      ''     '',
             'LVORM'    ''        ''             ''     '删除标记'    ''      ''      ''     ''.
  ELSE.
*   *          &1       &2         &3             &4     &5             &6      &7      &8     &9
    catalog:
            'INDEX'     'X'        ''             ''     '序号'          ''      ''      ''     '',
            'EBELN'     'X'        ''             ''     '采购凭证编号'  ''      ''      'C110' '',
            'EBELP'     'X'        ''             ''     '采购凭证行'    ''      ''      ''     '',
            'LOEKZ'     ''         ''             ''     '删除标记'      ''      ''      ''     '',
            'TXZ01'     ''         ''             ''     '行项目文本'    ''      ''      ''     '',
            'MATNR'     ''         ''             ''     '物料号'        ''      ''      'C110' 'X',
            'MAKTX'     ''         ''             ''     '物料描述'      ''      ''      ''     '',
            'BUKRS'     ''         ''             ''     '公司代码'      ''      ''      ''     '',
            'BUTXT'     ''         ''             ''     '公司代码描述'  ''      ''      ''     '',
            'WERKS'     ''         ''             ''     '工厂'          ''      ''      ''     '',
            'NAME1'     ''         ''             ''     '工厂名称'      ''      ''      ''     '',
            'LGORT'     ''         ''             ''     '存储地点'      ''      ''      ''     '',
            'LGOBE'     ''         ''             ''     '存储地点描述'  ''      ''      ''     '',
            'BANFN'     ''         ''             ''     '采购申请编号'  ''      ''      ''     '',
            'MENGE'     ''         ''             ''     '订单数量'      ''      ''      'C510' '',
            'MEINS'     ''         ''             ''     '订单单位'      ''      ''      ''     '',
            'ZYSHSL'    ''         ''             ''     '已收货数量'    ''      ''      ''     '',
            'ZWSHSL'    ''         ''             ''     '未收货数量'    ''      ''      ''     ''.   "
  ENDIF.
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.

  DATA: lt_ekko     TYPE ztpo_header_437,
        lv_fm_name  TYPE rs38l_fnam,
        ls_cp       TYPE ssfctrlop,       " 打印参数
        ls_options  TYPE ssfcompop.       " 弹出框参数

  DATA: ls_result       TYPE ssfcrescl.
  DATA: lv_bin_filesize TYPE i.                       " 文件大小
  DATA: lt_lines        TYPE STANDARD TABLE OF tline,
        lv_filename     TYPE string.                  " 文件名称

  CASE pv_ucomm.   " pv_ucomm参数表示引发输入后处理的功能代码
    WHEN '&IC1'.  " 单击(热点)或者双击进行触发:单击和双击使用同一功能代码(用户命令执行)
      IF p_mara = abap_true.
        READ TABLE gt_item INTO gs_item INDEX ps_selfield-tabindex.
        IF ps_selfield-fieldname = 'MATNR'.
*         物料号设置成“HOTSPOT”,单击某物料号跳转到MM03的界面显示该物料详情
          SET PARAMETER ID 'MAT' FIELD gs_item-matnr.
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
        ENDIF.
      ELSE.
        READ TABLE gt_ekpo INTO gs_ekpo INDEX ps_selfield-tabindex.
        IF ps_selfield-fieldname = 'EBELN'.
*         当双击某采购凭证编号时,跳转到ME23N显示该采购订单详情
          SET PARAMETER ID 'BES' FIELD gs_ekpo-ebeln.
          CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
        ELSEIF ps_selfield-fieldname = 'MATNR'.
*         物料号设置成“HOTSPOT”,单击某物料号跳转到MM03的界面显示该物料详情
          SET  PARAMETER ID 'MAT' FIELD gs_ekpo-matnr.
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
        ENDIF.
      ENDIF.

    WHEN '&ZPRINT'.  " 打印Smartforms表单
      IF p_ekko = abap_true.
        LOOP AT gt_ekpo INTO gs_ekpo WHERE sel = abap_true.
          APPEND INITIAL LINE TO lt_ekko ASSIGNING FIELD-SYMBOL(<lfs_ekko>).
          " <lfs_ekko>-xxx表示采购订单SmartForms表头信息
          <lfs_ekko>-ebeln = gs_ekpo-ebeln.
          <lfs_ekko>-bukrs = gs_ekpo-bukrs.
          <lfs_ekko>-lifnr = gs_ekpo-lifnr.
          <lfs_ekko>-bsart = gs_ekpo-bsart.
        ENDLOOP.

        " 调用函数获取Smartforms的函数名称
        CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
          EXPORTING
            formname                 = 'ZFS_DEMO_2025'  " Smartforms表单名称
          IMPORTING
            fm_name                  = lv_fm_name       " Smartforms函数名称
          EXCEPTIONS
            no_form                  = 1
            no_function_module       = 2
            OTHERS                   = 3.

        " 设置打印与弹出框参数
        ls_cp-preview = 'X'.         " 预览
        ls_cp-no_dialog = 'X'.       " 无弹窗
        ls_options-tddest = 'LP01'.  " 输出设备参数

        " 打印Smartforms(动态调用)
        CALL FUNCTION lv_fm_name
          EXPORTING
            control_parameters         = ls_cp
            output_options             = ls_options
            it_ekko                    = lt_ekko
          EXCEPTIONS
            formatting_error           = 1
            internal_error             = 2
            send_error                 = 3
            user_canceled              = 4
            OTHERS                     = 5.
      ENDIF.

    WHEN '&EXPORT'.  " 以PDF格式导出Smartforms表单
      IF p_ekko = abap_true.
        LOOP AT gt_ekpo INTO gs_ekpo WHERE sel = abap_true.
          APPEND INITIAL LINE TO lt_ekko ASSIGNING FIELD-SYMBOL(<lfs_ekko1>).
          " <lfs_ekko>-xxx表示采购订单SmartForms表头信息
          <lfs_ekko1>-ebeln = gs_ekpo-ebeln.
          <lfs_ekko1>-bukrs = gs_ekpo-bukrs.
          <lfs_ekko1>-lifnr = gs_ekpo-lifnr.
          <lfs_ekko1>-bsart = gs_ekpo-bsart.
        ENDLOOP.

        " 调用函数获取Smartforms的函数名称
        CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
          EXPORTING
            formname                 = 'ZFS_DEMO_2025'  " Smartforms表单名称
          IMPORTING
            fm_name                  = lv_fm_name       " Smartforms函数名称
          EXCEPTIONS
            no_form                  = 1
            no_function_module       = 2
            OTHERS                   = 3.

        " 设置打印与弹出框参数
        ls_cp-preview = 'X'.         " 预览
        ls_cp-no_dialog = 'X'.       " 无弹窗
        ls_options-tddest = 'LP01'.  " 输出设备参数
        ls_cp-getotf    = abap_true. " 获取OTF数据

        " Smartforms函数动态调用获取OTF格式数据
        CALL FUNCTION lv_fm_name
          EXPORTING
            control_parameters = ls_cp
            output_options     = ls_options
            it_ekko            = lt_ekko
          IMPORTING
            job_output_info    = ls_result
          EXCEPTIONS
            formatting_error   = 1
            internal_error     = 2
            send_error         = 3
            user_canceled      = 4
            OTHERS             = 5.

        " ONVERT_OTF函数将OTF格式数据转换成PDF格式数据
        CALL FUNCTION 'CONVERT_OTF'
          EXPORTING
            format                = 'PDF'                " 输出文件格式
          IMPORTING
            bin_filesize          = lv_bin_filesize      " 文件大小
          TABLES
            otf                   = ls_result-otfdata[]
            lines                 = lt_lines
          EXCEPTIONS
            err_max_linewidth     = 1
            err_format            = 2
            err_conv_not_possible = 3
            OTHERS                = 4.

        " 生成文件路径和名称
        CONCATENATE  'C:\Users\HP\Desktop\数据导出\' sy-datum sy-uzeit '.PDF' INTO lv_filename.

      " 下载文件
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            bin_filesize            = lv_bin_filesize    " 文件大小
            filename                = lv_filename        " 文件名
            filetype                = 'BIN'
          TABLES
            data_tab                = lt_lines           "
          EXCEPTIONS
            file_write_error        = 1
            no_batch                = 2
            gui_refuse_filetransfer = 3
            invalid_type            = 4
            no_authority            = 5
            unknown_error           = 6
            header_not_allowed      = 7
            separator_not_allowed   = 8
            filesize_not_allowed    = 9
            header_too_long         = 10
            dp_error_create         = 11
            dp_error_send           = 12
            dp_error_write          = 13
            unknown_dp_error        = 14
            access_denied           = 15
            dp_out_of_memory        = 16
            disk_full               = 17
            dp_timeout              = 18
            file_not_found          = 19
            dataprovider_exception  = 20
            control_flush_error     = 21
            OTHERS                  = 22.
      ENDIF.
  ENDCASE.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form frm_set_screen
*&---------------------------------------------------------------------*
*& 屏幕切换
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_screen .
  IF p_mara = abap_true.
    LOOP AT SCREEN.
      IF screen-group1 = 'M2'.
        screen-active = '0'.  " 0表示不可见
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSE.
    LOOP AT SCREEN.
      IF screen-group1 = 'M1'.
        screen-active = '0'.  " 1表示可见
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form frm_get_mara
*&---------------------------------------------------------------------*
*& 读取物料信息数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_mara .
  SELECT mara~matnr                          " 物料编号
         makt~maktx                          " 物料描述
         mara~ersda                          " 创建日期
         mara~created_at_time AS ctime       " 创建时间
         mara~ernam                          " 创建人
         user_addr~name_first                " 名
         user_addr~name_last                 " 姓
         mara~lvorm                          " 删除标记
    FROM mara
    LEFT JOIN makt
    ON mara~matnr = makt~matnr
    AND makt~spras = sy-langu
    LEFT JOIN user_addr
    ON mara~ernam = user_addr~bname
    INTO CORRESPONDING FIELDS OF TABLE gt_item
    WHERE mara~matnr IN s_matnr
    AND ersda IN s_ersda
    AND matkl IN s_matkl.


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


  " 如果勾选删除标记则查询所有数据
  " 如果不勾选删除标记则查询不带删除标记的数据
  IF p_lvorm = abap_false.
    DELETE gt_item WHERE lvorm = abap_true.  " 排除已经删除的数据
  ENDIF.


  " 如果ernam(创建人)为空,查询当前用户的姓名信息
  SELECT SINGLE name_first, name_last
    FROM user_addr
    INTO @DATA(ls_user)
    WHERE bname = @sy-uname.


  " 处理字段逻辑数据
  IF sy-subrc = 0.
    LOOP AT gt_item INTO gs_item.
      " 序号处理
        gs_item-index = sy-tabix.

      " 判断ersda字段是否不为空
      IF gs_item-ersda IS NOT INITIAL.
        gs_item-cyear = gs_item-ersda+0(4).   " 创建年度
        gs_item-cmonth = gs_item-ersda+4(2).  " 创建月
        gs_item-cday = gs_item-ersda+6(2).    " 创建日
      ENDIF.

      " 判断ernam字段是否为空
      " ernam 创建人为空时,设置为系统变量sy-uname
      IF gs_item-ernam IS INITIAL.
        gs_item-ernam = sy-uname.
        gs_item-name_first = ls_user-name_first.
        gs_item-name_last = ls_user-name_last.
      ENDIF.

      " 字符串拼接方式一
      " gs_item-nametxt = |{ gs_item-name_first } { gs_item-name_last }|.

      " 字符串拼接方式二
      CONCATENATE gs_item-name_first gs_item-name_last INTO gs_item-nametxt SEPARATED BY ' '.  " 创建人描述

      " 如果lvorm字段值为X,显示“已删除”,否则显示空
      IF gs_item-lvorm = abap_true.
        gs_item-lvorm = '已删除'.
      ENDIF.

      " 内表修改
      MODIFY gt_item FROM gs_item.

    ENDLOOP.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form frm_get_ekpo
*&---------------------------------------------------------------------*
*& " 读取采购订单信息数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_ekpo.
  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     " 订单单位
         ekko~bsart     " 采购凭证类型
         ekko~lifnr     " 供应商账户号
   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 gt_ekpo IS INITIAL.
    MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.
  ENDIF.


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

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

*   zyshsl字段(已收货数量)逻辑处理(方法1)
    SELECT ebeln,ebelp,wemng
      FROM eket
      INTO TABLE @DATA(lt_eket)
      FOR ALL ENTRIES IN @gt_ekpo
      WHERE ebeln = @gt_ekpo-ebeln
        AND ebelp = @gt_ekpo-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字段(已收货数量)逻辑处理(方法1)
      LOOP AT lt_eket INTO DATA(ls_eket)
        WHERE ebeln = <lfs_ekpo>-ebeln AND ebelp = <lfs_ekpo>-ebelp.
        <lfs_ekpo>-zyshsl = <lfs_ekpo>-zyshsl + ls_eket-wemng.
      ENDLOOP.

*      zyshsl字段(已收货数量)逻辑处理(方法2)
*      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.

上述代码涉及的消息类以及文本元素如下所示

消息类(Z_MSG2025)文本内容
TEXT-001与TEXT-002文本内容

GUI STATUS状态栏 

补充扩展知识

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

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

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

本文涉及到的相关知识点

[SAP ABAP] MM模块常用的Table

[SAP ABAP] INCLUDE程序创建

[SAP ABAP] SELECTION-SCREEN

[SAP ABAP] PARAMETERS

[SAP ABAP] SELECT-OPTIONS

[SAP ABAP] 选择屏幕事件

[SAP ABAP] 判断内表是否为空

[SAP ABAP] 字符串操作

[SAP ABAP] ALV基础开发

[SAP ABAP] ALV状态栏GUI STATUS的快速创建

[SAP ABAP] ALV中的USER_COMMAN用户事件

[SAP ABAP] MACRO/宏

[SAP ABAP] 程序调用

[SAP ABAP] MESSAGE消息处理

[SAP ABAP] SMARTFORMS表单开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值