ABAP Include ALV打印程序模板

********************************************************************
* 事务代码:                                                *
* 程序名称:                                                *
* 程序目的:物料凭证打印                                            *
* 设 计 人:                                                   *
* 开 发 人:                                                  *
* 设计时间:2023-02-14                                             *
* 程序类型: ABAP/4 程序 ,打印程序                                 *
* 应用类型: MM                                                     *
* 描    述: 需求物料凭证打印                                       *
*(修改日志)--------------------------------------------------------*
*                                                                  *
* 日志号   修改人  修改时间       修改说明              传输号码   *
*  ----    ----    ------         -----------
*   001    Seele   2023-02-14     创建打印程序         DS4K901703  *
********************************************************************

REPORT zmmf002.

*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:mkpf,  " 物料凭证抬头
       mara,
       mseg.  " 物料凭证行项目

*----------------------------------------------------------------------*
* 结构声明类型/Structure type declaration
*----------------------------------------------------------------------*
*&---主表数据/master table data
TYPES:BEGIN OF ty_output,

        mblnr      TYPE mkpf-mblnr           , " 物料凭证
        zeile      TYPE mseg-zeile           , " 物料凭证项目
        budat      TYPE mkpf-budat           , " 过账日期
        usnam      TYPE rkpf-usnam           , " 制单人
        name_last TYPE user_addr-name_last , " 制单人名称
        bktxt      TYPE mkpf-bktxt           , " 凭证抬头文本
        werks      TYPE mseg-werks           , " 工厂
        name1      TYPE t001w-name1          , " 工厂名
        matnr      TYPE mseg-matnr           , " 物料号
        maktx      TYPE makt-maktx           , " 物料描述
        matkl      TYPE mara-matkl           , " 物料组
        wgbez      TYPE t023t-wgbez          , " 物料组描述
        menge      TYPE mseg-menge           , " 数量
        meins      TYPE mseg-meins           , " 计量单位
        lgort      TYPE mseg-lgort           , " 库存地点
        lgobe      TYPE t001l-lgobe          , " 库存地点描述
        bwart      TYPE mseg-bwart           , " 移动类型
        btext      TYPE t156t-btext          , " 移动类型描述
        zgyspc     TYPE ausp-atwrt           , " 供应商批次
        zmjh       TYPE ausp-atwrt           , " 模具号
        aufnr      TYPE aufm-aufnr           , " 生产订单
        lifnr      TYPE mseg-lifnr           , " 供应商
        name1_s    TYPE lfa1-name1           , " 供应商名称
        charg      TYPE mseg-charg           , " 批号
        hsdat      TYPE mseg-hsdat           , " 生产日期
        kostl      TYPE mseg-kostl           , " 成本中心
        ktext      TYPE cskt-ktext           , " 成本中心描述
        ps_psp_pnr TYPE mseg-ps_psp_pnr      , " 研发项目
        post1      TYPE prps-post1           , " 研发项目描述
        cpudt      TYPE mkpf-cpudt           , " 输入日期
        cputm      TYPE mkpf-cputm           , " 输入时间
        ebeln      TYPE mseg-ebeln           , " 采购订单
        umsok      TYPE mseg-umsok           , " 特殊库存标识
        grund      TYPE mseg-grund           , " 移动原因
        grtxt      TYPE t157e-grtxt          , " 移动原因描述
        umwrk      TYPE mseg-umwrk           , " 收货工厂
        name1_r    TYPE t001w-name1          , " 收货工厂名
        umlgo      TYPE mseg-umlgo           , " 收货仓库
        lgobe_r    TYPE t001l-lgobe          , " 收货仓库描述

        zggxh      TYPE zmmt010-zggxh        , " 规格型号
        bismt      TYPE mara-bismt           , " 旧物料号
        xauto      TYPE mseg-xauto           , " 项目自动创建
        rstyp      TYPE t156-rstyp           , " 预定的帐户分配
        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:gv_uname TYPE user_addr-name_last.  " 用户名

*&---全局常量定义
CONSTANTS:gc_form   TYPE tdsfname VALUE 'ZMM_SF_02'. "smartform 名称

*&---------------------------------------------------------------------*
*& 字段串定义/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_mblnr FOR mkpf-mblnr ,            " 物料凭证
                 s_werks FOR mseg-werks OBLIGATORY,  " 工厂
                 s_lgort FOR mseg-lgort ,            " 库存地点
                 s_matnr FOR mara-matnr ,            " 物料
                 s_bwart FOR mseg-bwart ,            " 移动类型
                 s_budat FOR mkpf-budat ,            " 过账日期
                 s_usnam FOR mkpf-usnam .            " 制单人

*&---单值
  PARAMETERS:    p_mjahr LIKE mkpf-mjahr DEFAULT sy-datum+0(4).  " 凭证年度(默认当年)

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_set_fieldcat.
*&---ALV 显示
  PERFORM frm_display_alv.

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

  DATA:lv_tabix TYPE i,
       lv_atinn TYPE ausp-atinn.

  FREE:gt_output.
*&---获取主数据表内容mkpf mseg
  SELECT
    mkpf~mblnr , " 物料凭证
    mkpf~budat , " 过账日期
    mkpf~bktxt , " 凭证抬头文本
    mkpf~cpudt , " 输入日期
    mkpf~cputm , " 输入时间
    mseg~zeile , " 物料凭证项目
    mkpf~usnam , " 制单人
    mseg~werks , " 工厂
    mseg~matnr , " 物料
    mseg~menge , " 数量
    mseg~meins , " 计量单位
    mseg~lgort , " 库存地点
    mseg~bwart , " 移动类型
    mseg~hsdat , " 生产日期
    mseg~kostl , " 成本中心
    mseg~ebeln , " 采购订单
    mseg~umsok , " 特殊库存标识
    mseg~grund , " 移动原因
    mseg~umwrk , " 收货工厂
    mseg~umlgo , " 收货仓库
    mseg~ps_psp_pnr , " 研发项目
    mseg~lifnr , " 供应商
    mseg~xauto , " 项目自动创建
    mseg~charg , " 批次
    aufm~aufnr , " 生产订单
    mara~matkl , " 物料组
    mara~bismt   " 旧物料号
  FROM mkpf
    LEFT JOIN mseg ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
    LEFT JOIN aufm ON aufm~aufnr = mseg~aufnr
    LEFT JOIN mara ON mseg~matnr = mara~matnr
  WHERE
    mkpf~mblnr IN @s_mblnr AND
    mkpf~budat IN @s_budat AND
    mseg~werks IN @s_werks AND
    mseg~lgort IN @s_lgort AND
    mseg~matnr IN @s_matnr AND
    mseg~bwart IN @s_bwart AND
    mkpf~usnam IN @s_usnam AND
    mkpf~mjahr =  @p_mjahr
  INTO TABLE @DATA(lt_data).
  SORT lt_data BY mblnr zeile.

  IF lt_data IS NOT INITIAL.
*&---制单人名称
    SELECT
      name_last , " 制单人名称
      bname        "
    FROM user_addr
    FOR ALL ENTRIES IN @lt_data
    WHERE
      bname = @lt_data-usnam OR bname = @sy-uname
    INTO TABLE @DATA(lt_user_addr).
    SORT lt_user_addr BY bname.

*&---工厂名 收货工厂名
    SELECT
      name1 , " 工厂名/收货工厂名
      werks   " 工厂
    FROM t001w
    FOR ALL ENTRIES IN @lt_data
    WHERE
      werks = @lt_data-werks OR
      werks = @lt_data-umwrk
    INTO TABLE @DATA(lt_t001w).
    SORT lt_t001w BY werks.

*&---物料描述
    SELECT
      matnr , " 物料号
      maktx   " 物料描述
    FROM makt
    FOR ALL ENTRIES IN @lt_data
    WHERE
      makt~matnr  = @lt_data-matnr AND
      makt~spras  = @sy-langu
    INTO TABLE @DATA(lt_makt).
    SORT lt_makt BY matnr.

*&---物料组描述
    SELECT
      matkl , " 物料组
      wgbez   " 物料组描述
    FROM t023t
    FOR ALL ENTRIES IN @lt_data
    WHERE
      matkl  = @lt_data-matkl AND
      spras  = @sy-langu
    INTO TABLE @DATA(lt_t023t).
    SORT lt_t023t BY matkl.

*&---库存地点描述/收货仓库描述
    SELECT
      lgobe , " 库存地点描述/收货仓库描述
      werks , " 工厂
      lgort
    FROM t001l
    FOR ALL ENTRIES IN @lt_data
    WHERE
      ( lgort = @lt_data-lgort AND
        werks = @lt_data-werks ) OR
      ( lgort = @lt_data-umlgo AND
        werks = @lt_data-umwrk )
    INTO TABLE @DATA(lt_t001l).
    SORT lt_t001l BY werks lgort.

*&---供应商名称
    SELECT
      name1 , " 供应商名称
      lifnr
    FROM lfa1
    FOR ALL ENTRIES IN @lt_data
    WHERE
      lfa1~lifnr = @lt_data-lifnr
    INTO TABLE @DATA(lt_lfa1).
    SORT lt_lfa1 BY lifnr.

*&---成本中心描述
    SELECT
      kostl , " 成本中心
      ktext   " 成本中心描述
    FROM cskt
    FOR ALL ENTRIES IN @lt_data
    WHERE
      kostl = @lt_data-kostl
    INTO TABLE @DATA(lt_cskt).
    SORT lt_cskt BY kostl.

*&---研发项目描述
    SELECT
      post1 , " 研发项目描述
      pspnr   " 研发项目
    FROM prps
    FOR ALL ENTRIES IN @lt_data
    WHERE
      pspnr = @lt_data-ps_psp_pnr
    INTO TABLE @DATA(lt_prps).
    SORT lt_prps BY pspnr.

*&---0000000803供应商批次 & 0000000804模具号
    SELECT
      mch1~matnr,
      mch1~charg,
      mch1~cuobj_bm,
      ausp~atinn,
      ausp~atwrt " 供应商批次&模具号
    FROM mch1
      LEFT JOIN ausp ON mch1~cuobj_bm = ausp~objek
    FOR ALL ENTRIES IN @lt_data
    WHERE
      mch1~matnr = @lt_data-matnr AND
      mch1~charg = @lt_data-charg AND
      ausp~klart = '023'            AND
      ausp~atinn IN ( '0000000804' , '0000000803' )
      INTO TABLE @DATA(lt_ausp).
    SORT lt_ausp BY matnr charg atinn.

*&---移动类型描述
    SELECT
      bwart , " 移动类型
      rstyp   " 预定的帐户分配
    FROM t156
    FOR ALL ENTRIES IN @lt_data
    WHERE
      bwart = @lt_data-bwart
    INTO TABLE @DATA(lt_t156).
    SORT lt_t156 BY bwart.

*&---移动类型描述
    SELECT
      bwart , " 移动类型
      btext   " 移动类型描述
    FROM t156t
    FOR ALL ENTRIES IN @lt_data
    WHERE
      bwart = @lt_data-bwart AND
      spras = @sy-langu
    INTO TABLE @DATA(lt_t156t).
    SORT lt_t156t BY bwart.

*&---移动原因描述
    SELECT
      bwart , " 移动类型
      grund , " 移动原因
      grtxt   " 移动原因描述
    FROM t157e
    FOR ALL ENTRIES IN @lt_data
    WHERE
      bwart = @lt_data-bwart AND
      grund = @lt_data-grund AND
      spras = @sy-langu
    INTO TABLE @DATA(lt_t157e).
    SORT lt_t157e BY bwart grund.

*&---规格型号
    SELECT
      zggxh , " 规格型号
      matnr
    FROM zmmt010
    FOR ALL ENTRIES IN @lt_data
    WHERE
      matnr = @lt_data-matnr
    INTO TABLE @DATA(lt_zmmt010).
    SORT lt_zmmt010 BY matnr.

  ENDIF.

  LOOP AT lt_data INTO DATA(ls_data).

    CLEAR gs_output.
    MOVE-CORRESPONDING ls_data TO gs_output.

    " 物料描述
    READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY matnr = gs_output-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-maktx = ls_makt-maktx.
    ENDIF.

    " 工厂名
    READ TABLE lt_t001w INTO DATA(ls_t001w) WITH KEY werks = gs_output-werks BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-name1 = ls_t001w-name1.
    ENDIF.

    " 收货工厂名
    READ TABLE lt_t001w INTO ls_t001w WITH KEY werks = gs_output-umwrk BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-name1_r = ls_t001w-name1.
    ENDIF.

    " 制单人名称
    READ TABLE lt_user_addr INTO DATA(ls_user_addr) WITH KEY bname = gs_output-usnam BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-name_last = ls_user_addr-name_last.
    ENDIF.

    " 物料组描述
    READ TABLE lt_t023t INTO DATA(ls_t023t) WITH KEY matkl = gs_output-matkl BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-wgbez = ls_t023t-wgbez.
    ENDIF.

    " 库存地点描述
    READ TABLE lt_t001l INTO DATA(ls_t001l) WITH KEY werks = gs_output-werks lgort = gs_output-lgort BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-lgobe = ls_t001l-lgobe.
    ENDIF.

    " 收货仓库描述
    READ TABLE lt_t001l INTO ls_t001l WITH KEY werks = gs_output-umwrk lgort = gs_output-umlgo  BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-lgobe_r = ls_t001l-lgobe.
    ENDIF.

    " 成本中心描述
    READ TABLE lt_cskt INTO DATA(ls_cskt) WITH KEY kostl = gs_output-kostl BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-ktext = ls_cskt-ktext.
    ENDIF.

    " 研发项目描述
    READ TABLE lt_prps INTO DATA(ls_prps) WITH KEY pspnr = gs_output-ps_psp_pnr BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-post1 = ls_prps-post1.
    ENDIF.

    " 供应商名称
    READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = gs_output-lifnr BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-name1_s = ls_lfa1-name1.
    ENDIF.

    " 0000000803供应商批次
    READ TABLE lt_ausp INTO DATA(ls_ausp) WITH KEY matnr = gs_output-matnr
                                                   charg = gs_output-charg
                                                   atinn = '0000000803' BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-zgyspc = ls_ausp-atwrt.
    ENDIF.

    " 0000000804模具号
    READ TABLE lt_ausp INTO ls_ausp WITH KEY matnr = gs_output-matnr
                                             charg = gs_output-charg
                                             atinn = '0000000804' BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-zmjh = ls_ausp-atwrt.
    ENDIF.

    " 移动类型描述
    READ TABLE lt_t156t INTO DATA(ls_t156t) WITH KEY bwart = gs_output-bwart BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-btext = ls_t156t-btext.
    ENDIF.

    " 预定的帐户分配
    READ TABLE lt_t156 INTO DATA(ls_t156) WITH KEY bwart = gs_output-bwart BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-rstyp = ls_t156-rstyp.
    ENDIF.

    " 移动原因描述
    READ TABLE lt_t157e INTO DATA(ls_t157e) WITH KEY bwart = gs_output-bwart grund = gs_output-grund BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-grtxt = ls_t157e-grtxt.
    ENDIF.

    " 规格型号
    READ TABLE lt_zmmt010 INTO DATA(ls_zmmt010) WITH KEY matnr = gs_output-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      gs_output-zggxh = ls_zmmt010-zggxh.
    ENDIF.

    APPEND gs_output TO gt_output.

  ENDLOOP.

    " 制单人名称
  READ TABLE lt_user_addr INTO  ls_user_addr WITH KEY bname = sy-uname BINARY SEARCH.
  IF sy-subrc = 0.
    gv_uname = ls_user_addr-name_last.
  ENDIF.

  SORT gt_output BY mblnr zeile bwart.

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 = 'X' .    " 隐藏工具栏
  gs_layout-sel_mode   = 'A'.     "选择模式
  gs_layout-box_fname  = 'BOX'.   "选择字段
ENDFORM.                    " frm_init_layout
*&---------------------------------------------------------------------*
*&      Form  frm_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat .
*&---ALV 输出字段目录,涉及字段必须大写
  mcr_set_catalog: 'MBLNR'       TEXT-A01    'MKPF'       'MBLNR'       '' ''  '', " 物料凭证
                   'ZEILE'       TEXT-A02    'MSEG'       'ZEILE'       '' ''  '', " 物料凭证项目
                   'BUDAT'       TEXT-A03    'MKPF'       'BUDAT'       '' ''  '', " 过账日期
                   'USNAM'       TEXT-A04    'RKPF'       'USNAM'       '' ''  '', " 制单人
                   'NAME_LAST'   TEXT-A05    'USER_ADDR'  'NAME_LAST'   '' ''  '', " 制单人名称
                   'BKTXT'       TEXT-A06    'MKPF'       'BKTXT'       '' ''  '', " 凭证抬头文本
                   'WERKS'       TEXT-A07    'MSEG'       'WERKS'       '' ''  '', " 工厂
                   'NAME1'       TEXT-A08    'T001W'      'NAME1'       '' ''  '', " 工厂名
                   'MATNR'       TEXT-A09    'MSEG'       'MATNR'       '' ''  '', " 物料号
                   'MAKTX'       TEXT-A10    'MAKT'       'MAKTX'       '' ''  '', " 物料描述
                   'MATKL'       TEXT-A11    'MARA'       'MATKL'       '' ''  '', " 物料组
                   'WGBEZ'       TEXT-A12    'T023T'      'WGBEZ'       '' ''  '', " 物料组描述
                   'MENGE'       TEXT-A13    'MSEG'       'MENGE'       '' ''  '', " 数量
                   'MEINS'       TEXT-A14    'MSEG'       'MEINS'       '' ''  '', " 计量单位
                   'LGORT'       TEXT-A15    'MSEG'       'LGORT'       '' ''  '', " 库存地点
                   'LGOBE'       TEXT-A16    'T001L'      'LGOBE'       '' ''  '', " 库存地点描述
                   'BWART'       TEXT-A17    'MSEG'       'BWART'       '' ''  '', " 移动类型
                   'BTEXT'       TEXT-A18    'T156T'      'BTEXT'       '' ''  '', " 移动类型描述
                   'ZGYSPC'      TEXT-A19    'AUSP'       'ATWRT'       '' ''  '', " 供应商批次
                   'ZMJH'        TEXT-A20    'AUSP'       'ATWRT'       '' ''  '', " 模具号
                   'AUFNR'       TEXT-A21    'AUFM'       'AUFNR'       '' ''  '', " 生产订单
                   'LIFNR'       TEXT-A22    'AUFM'       'LIFNR'       '' ''  '', " 供应商
                   'NAME1_S'     TEXT-A23    'LFA1'       'NAME1'       '' ''  '', " 供应商名称
                   'CHARG'       TEXT-A24    'AUFM'       'CHARG'       '' ''  '', " 批号
                   'HSDAT'       TEXT-A25    'MSEG'       'HSDAT'       '' ''  '', " 生产日期
                   'KOSTL'       TEXT-A26    'MSEG'       'KOSTL'       '' ''  '', " 成本中心
                   'KTEXT'       TEXT-A27    'CSKT'       'KTEXT'       '' ''  '', " 成本中心描述
                   'PS_PSP_PNR'  TEXT-A28    'MSEG'       'PS_PSP_PNR'  '' ''  '', " 研发项目
                   'POST1'       TEXT-A29    'PRPS'       'POST1'       '' ''  '', " 研发项目描述
                   'CPUDT'       TEXT-A30    'MKPF'       'CPUDT'       '' ''  '', " 输入日期
                   'CPUTM'       TEXT-A31    'MKPF'       'CPUTM'       '' ''  '', " 输入时间
                   'EBELN'       TEXT-A32    'MSEG'       'EBELN'       '' ''  '', " 采购订单
                   'UMSOK'       TEXT-A33    'MSEG'       'UMSOK'       '' ''  '', " 特殊库存标识
                   'GRUND'       TEXT-A34    'MSEG'       'GRUND'       '' ''  '', " 移动原因
                   'GRTXT'       TEXT-A35    'T157E'      'GRTXT'       '' ''  '', " 移动原因描述
                   'UMWRK'       TEXT-A36    'MSEG'       'UMWRK'       '' ''  '', " 收货工厂
                   'NAME1_R'     TEXT-A37    'T001W'      'NAME1'       '' ''  '', " 收货工厂名
                   'UMLGO'       TEXT-A38    'MSEG'       'UMLGO'       '' ''  '', " 收货仓库
                   'LGOBE_R'     TEXT-A39    'T001L'      'LGOBE'       '' ''  ''. " 收货仓库描述


ENDFORM.                    " frm_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_alv .
*&---ALV 显示函数
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat[]
      i_callback_pf_status_set = 'FRM_USER_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_output
    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.                    " frm_display_alv
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  frm_user_status
*&---------------------------------------------------------------------*
*       设置用户菜单栏状态
*----------------------------------------------------------------------*
*  -->  pt_extab        需要排除的菜单按钮
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_status USING ps_extab TYPE slis_t_extab.  "GUI
  SET PF-STATUS 'STATUS_1000' EXCLUDING ps_extab.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  frm_user_command
*&---------------------------------------------------------------------*
*       菜单栏事件
*----------------------------------------------------------------------*
*  -->  pv_ucomm        触发的功能码
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm  "user_command
                            pv_selfield TYPE slis_selfield.

  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA:lv_answer TYPE c .
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data. "将更新后的数据传到alv所对应的内表

  pv_selfield-refresh = 'X'. "刷新数据
  pv_selfield-row_stable = 'X'.
  pv_selfield-col_stable = 'X'.

  CASE pv_ucomm.
    WHEN 'PRT'.
      PERFORM frm_print.
  ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  frm_user_command
*&---------------------------------------------------------------------*
*       菜单栏事件
*----------------------------------------------------------------------*
*  -->  pv_ucomm        触发的功能码
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_print.
  DATA: ls_control_parameters TYPE ssfctrlop,
        ls_output_options     TYPE ssfcompop,
        ls_outopt             TYPE ssfcresop,
        ls_output_info        TYPE ssfcrescl,
        lv_name               TYPE rs38l_fnam.

  DATA: lv_tabix TYPE i,
        lv_str   TYPE string,
        ls_head  TYPE ZMMS003,
        ls_item  TYPE ZMMS003C,
        ls_key   TYPE ty_output,
        lt_item  TYPE STANDARD TABLE OF ZMMS003C,
        lt_key   TYPE STANDARD TABLE OF ty_output,
        lt_sel   TYPE STANDARD TABLE OF ty_output.


  " 保证打印所有行项目
  LOOP AT gt_output INTO gs_output WHERE box = 'X'.
    APPEND gs_output TO lt_key.
  ENDLOOP.
  DELETE ADJACENT DUPLICATES FROM lt_key COMPARING mblnr bwart.
  IF lt_key[] IS INITIAL.
    MESSAGE s011(zmm001) DISPLAY LIKE 'E'."请至少选择一条数据
    EXIT.
  ENDIF.
  SORT lt_key BY ebeln.
  SORT gt_output BY mblnr bwart zeile.

*&---获取form的函数名
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = gc_form
    IMPORTING
      fm_name            = lv_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*&---开启打印流
  CALL FUNCTION 'SSF_OPEN'
    EXPORTING
      control_parameters = ls_control_parameters
      output_options     = ls_output_options
    IMPORTING
      job_output_options = ls_outopt
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    RETURN.
  ENDIF.

  ls_control_parameters-no_open = 'X'.
  ls_control_parameters-no_close = 'X'.

  LOOP AT lt_key INTO ls_key.
    CLEAR: ls_head,lt_item,ls_item.
    READ TABLE gt_output INTO gs_output WITH KEY mblnr = ls_key-mblnr bwart = ls_key-bwart.
    IF sy-subrc = 0.
      lv_tabix = sy-tabix.

*&---构建form表头
      ls_head-mblnr      = gs_output-mblnr.      " 凭证编号
      ls_head-budat      = gs_output-budat.      " 过账日期
      ls_head-name_first = gs_output-name_last.  " 制单人
      ls_head-uname      = gv_uname.             " 打印人
      ls_head-werks      = gs_output-werks.      " 工厂
      ls_head-lifnr      = gs_output-lifnr.      " 供应商
      CONCATENATE gs_output-bwart gs_output-btext   INTO ls_head-bwart SEPARATED BY ' '.  " 移动类型 移动类型描述


      LOOP AT gt_output INTO gs_output FROM lv_tabix.
        IF ls_key-mblnr <> gs_output-mblnr OR ls_key-bwart <> gs_output-bwart.
          EXIT.
        ENDIF.

        CLEAR ls_item.
*&---构建form行项目
        " 移动类型RSTYP=U,则排除行MSEG-XAUTO=X的行信息
        IF gs_output-rstyp = 'U' AND gs_output-xauto = 'X'.
          CONTINUE.
        ENDIF.

        ls_item-zeile = gs_output-zeile.  " 项目
        ls_item-meins = gs_output-meins.  " 单位
        ls_item-matnr = gs_output-matnr.  " 物料号
        ls_item-charg = gs_output-charg.  " 批次
        IF gs_output-zgyspc IS NOT INITIAL.
          ls_item-atwrt = '(' && gs_output-zgyspc && ')'.  " 供应商批次
        ENDIF.
        IF gs_output-bismt IS NOT INITIAL.
          ls_item-bismt = '(' && gs_output-bismt && ')'.  " 旧物料号
        ENDIF.

        lv_str = gs_output-menge.
        REPLACE ALL OCCURRENCES OF REGEX '[ ]+$' IN lv_str WITH ''. " 去掉字符串多余的空格
        REPLACE ALL OCCURRENCES OF REGEX '[0]+$' IN lv_str WITH ''. " 去掉小数点后多余的0
        REPLACE ALL OCCURRENCES OF REGEX '[.]$' IN lv_str WITH ''. " 如最后一位是.则去掉
        ls_item-menge = lv_str." 数量

        ls_item-maktx = gs_output-maktx && '/' && gs_output-zggxh.  " 物料名称/规格型号
        ls_item-maktx = shift_right( val = ls_item-maktx sub = |/| ). " 用斜杠区分,没有值不要斜杠

        ls_item-lgort = gs_output-lgort. " 库存地点:LGORT/UMLGO
        IF ls_item-lgort IS INITIAL.
          ls_item-lgort = gs_output-umlgo.
        ELSE.
          ls_item-lgort = ls_item-lgort && '/' && gs_output-umlgo.
          ls_item-lgort = shift_right( val = ls_item-lgort sub = |/| ). " 用斜杠区分,没有值不要斜杠
        ENDIF.
        APPEND ls_item TO lt_item.

      ENDLOOP.

*&---打印form
      CALL FUNCTION lv_name
        EXPORTING
          control_parameters = ls_control_parameters
          output_options     = ls_output_options
          gs_head            = ls_head
        IMPORTING
          job_output_info    = ls_output_info
        TABLES
          gt_item            = lt_item
        EXCEPTIONS
          formatting_error   = 1
          internal_error     = 2
          send_error         = 3
          user_canceled      = 4
          OTHERS             = 5.

    ENDIF.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDLOOP.

*&---关闭打印流
  CALL FUNCTION 'SSF_CLOSE'
    IMPORTING
      job_output_info  = ls_output_info
    EXCEPTIONS
      formatting_error = 1
      internal_error   = 2
      send_error       = 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.

*&---------------------------------------------------------------------*
*& 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.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP OOALV是一种在ABAP编程语言中面向对象的方式实现的ALVABAP List Viewer)报表。它提供了更灵活和可扩展的方式来创建和展示报表数据。 以下是ABAP OOALV的一些关键步骤和示例代码[^1][^2]: 1. 定义变量和选择屏幕定义:在ABAP程序中定义所需的变量,并选择适当的屏幕定义。 2. 创建类:创建一个类来处理ALV报表的逻辑和功能。这个类应该继承自`CL_GUI_ALV_GRID`类。 3. 调用函数:在类中定义一个方法来调用ALV函数模块,例如`REUSE_ALV_GRID_DISPLAY`。 4. 获取数据并展示:在类中定义一个方法来获取报表数据,并将数据传递给ALV函数模块。 5. 表头字段设置:在类中定义一个方法来设置ALV报表的表头字段。 6. ALV输出格式:在类中定义一个方法来设置ALV报表的输出格式,例如列宽、对齐方式等。 7. 展示ALV:在类中定义一个方法来展示ALV报表。 8. 其他:根据需要,可以在类中定义其他方法来处理特定的功能,例如处理单击事件、排序等。 下面是一个简单的示例代码,演示了如何使用ABAP OOALV来创建和展示一个简单的报表: ```abap CLASS lcl_alv_report DEFINITION. PUBLIC SECTION. METHODS: constructor, display_alv. PRIVATE SECTION. DATA: lo_alv_grid TYPE REF TO cl_gui_alv_grid. METHODS: get_data, set_field_catalog, set_layout. ENDCLASS. CLASS lcl_alv_report IMPLEMENTATION. METHOD constructor. CREATE OBJECT lo_alv_grid EXPORTING i_parent = cl_gui_container=>screen0. ENDMETHOD. METHOD display_alv. CALL METHOD lo_alv_grid->set_table_for_first_display EXPORTING i_structure_name = 'SPFLI' CHANGING it_outtab = lt_spfli. ENDMETHOD. METHOD get_data. SELECT * FROM spfli INTO TABLE lt_spfli. ENDMETHOD. METHOD set_field_catalog. DATA: lt_fieldcat TYPE lvc_t_fcat. FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat. CALL METHOD lo_alv_grid->get_frontend_fieldcatalog RECEIVING rt_fieldcatalog = lt_fieldcat. LOOP AT lt_fieldcat ASSIGNING <fs_fieldcat>. <fs_fieldcat>-outputlen = 20. ENDLOOP. CALL METHOD lo_alv_grid->set_frontend_fieldcatalog EXPORTING it_fieldcatalog = lt_fieldcat. ENDMETHOD. METHOD set_layout. DATA: lo_layout TYPE REF TO cl_gui_alv_layout. CREATE OBJECT lo_layout EXPORTING i_grid_title = 'ALV Report'. CALL METHOD lo_alv_grid->set_layout EXPORTING is_layout = lo_layout. ENDMETHOD. ENDCLASS. DATA: lo_report TYPE REF TO lcl_alv_report. START-OF-SELECTION. CREATE OBJECT lo_report. lo_report->get_data( ). lo_report->set_field_catalog( ). lo_report->set_layout( ). lo_report->display_alv( ). ``` 这是一个简单的ABAP OOALV报表的示例,它获取了`SPFLI`表中的数据,并展示在ALV报表中。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值