ALV 含打印 全选 Checkbox,贴在此处方便 下次参考

本文介绍了一个 SAP ABAP 程序,该程序用于处理合同通知单(BN)的生成和打印任务。通过读取合同详细信息,并收集相关服务订单的数据,程序实现了BN编号的自动分配及更新合同金额的功能。此外,还提供了通过 ALV 选择并打印 BN 的功能。
*&---------------------------------------------------------------------*
*& Report      Z02MMR022
*&
*&---------------------------------------------------------------------*
*  Author: Vince
*  Closeing Date:
*  Description: List of Billing Notification
************************************************************************
*  Ver    Date       Author    Modify Des
************************************************************************
*  1.    2013/03/10 Vince  New Program
************************************************************************
REPORT YTEST999 MESSAGE-ID ZHR01.


**********************************************************************
* TABLES
**********************************************************************


**********************************************************************
* TYPES
**********************************************************************
TYPES:BEGIN OF TP_HEAD,
  EBELN LIKE EKKO-EBELN,"Contract Number
  CONTRNAME TYPE STRING,"Contract Description
  DEPARTMENT TYPE STRING,"Department
  WAERS LIKE EKKO-WAERS,"Currency
  KTWRT LIKE EKKO-KTWRT,"Contract Amount
  KDATB LIKE EKKO-KDATB,"Contract Start Date
  KDATE LIKE EKKO-KDATE,"Contract End Date
  LIFNR LIKE EKKO-LIFNR,"vendor
  NAME1 TYPE CHAR200,"Vendor name
  BAMOUNT LIKE EKKO-KTWRT,"Billing Amount
  END OF TP_HEAD.

TYPES:BEGIN OF TP_OUT,
  CBOX TYPE AQ_MARKBG,
  EBELN LIKE EKPO-EBELN,"Service Order
  EBELP LIKE EKPO-EBELP,"Line Item
  MATKL TYPE CHAR100,"Service Category
  TXZ01 LIKE EKPO-TXZ01,"Short Text
  MBLNR LIKE MKPF-MBLNR,"Service Receipt
  WRBTR LIKE EKBE-WRBTR,"Amount
  BNNUM LIKE Z02MMBNNO-BNNUM,"BN Number
  BNDAT LIKE Z02MMBNNO-BNDAT,"BN Date
  GJAHR LIKE EKBE-GJAHR,
  BOX_NAME ,
  END OF TP_OUT.

**********************************************************************
* DATA
**********************************************************************
DATAGS_HEAD TYPE TP_HEAD.
DATAGT_OUT TYPE TABLE OF TP_OUT,
      GS_OUT TYPE TP_OUT.

DATAGT_PRINT TYPE TABLE OF TP_OUT,
      GS_PRINT TYPE TP_OUT.

DATAGT_FCAT TYPE  SLIS_T_FIELDCAT_ALV,
      GS_FCAT TYPE LINE OF  SLIS_T_FIELDCAT_ALV,
      GT_SORT TYPE SLIS_T_SORTINFO_ALV,
      GS_SORT TYPE LINE OF SLIS_T_SORTINFO_ALV,
      GS_LAYO TYPE SLIS_LAYOUT_ALV,
      GS_SETTINGS TYPE LVC_S_GLAY.

**********************************************************************
* CONSTANTS
**********************************************************************


**********************************************************************
* SELECTION SCREEN
**********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BL01 WITH FRAME TITLE TEXT-001.
PARAMETERS:P_BUKRS LIKE EKKO-BUKRS DEFAULT '1000' OBLIGATORY.
PARAMETERS:P_EBELN LIKE EKKO-EBELN OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BL01.

**********************************************************************
* START OF SELECTION
**********************************************************************
START-OF-SELECTION.
  PERFORM FRM_GET_HEAD.
  PERFORM FRM_GET_ITEM.

**********************************************************************
* END OF SELECTION
**********************************************************************
END-OF-SELECTION.
  PERFORM FRM_BUILD_FIELDCAT.
  PERFORM FRM_SET_LAYOUT.
  PERFORM FRM_DISPLAY_ALV.

**********************************************************************
* SUBROUTINES
**********************************************************************
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_HEAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_HEAD .
  DATALT_READ LIKE TABLE OF TLINE WITH HEADER LINE.
  DATAL_NAME LIKE THEAD-TDNAME.
  DATAL_ADRNR LIKE LFA1-ADRNR,
        LS_ADRC LIKE ADRC.

  SELECT SINGLE EBELN WAERS KTWRT KDATB KDATE LIFNR
    INTO CORRESPONDING FIELDS OF GS_HEAD
    FROM EKKO
    WHERE EBELN P_EBELN
      AND BUKRS P_BUKRS
      AND BSART 'CCTR'.

  IF SY-SUBRC EQ 0.

    L_NAME P_EBELN.

    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        ID                      'K93'
        LANGUAGE                SY-LANGU
        NAME                    L_NAME
        OBJECT                  'EKKO'
      TABLES
        LINES                   LT_READ
      EXCEPTIONS
        ID                      1
        LANGUAGE                2
        NAME                    3
        NOT_FOUND               4
        OBJECT                  5
        REFERENCE_CHECK         6
        WRONG_ACCESS_TO_ARCHIVE 7
        OTHERS                  8.
    IF SY-SUBRC EQ 0.
      LOOP AT  LT_READ.
        CONCATENATE GS_HEAD-CONTRNAME LT_READ-TDLINE INTO GS_HEAD-CONTRNAME.
      ENDLOOP.
    ENDIF.

    SELECT SINGLE ADRNR  INTO L_ADRNR
        FROM LFA1
        WHERE LIFNR GS_HEAD-LIFNR.

    SELECT SINGLE INTO LS_ADRC
      FROM ADRC
      WHERE ADDRNUMBER L_ADRNR.

    CONCATENATE LS_ADRC-NAME1 LS_ADRC-NAME2 INTO GS_HEAD-NAME1.

  ELSE.

    MESSAGE S000(ZHR01DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

ENDFORM.                    " FRM_GET_HEAD
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_ITEM .
  DATALT_EKPO TYPE TABLE OF EKPO,
        LS_EKPO TYPE EKPO,
        LT_EKBE TYPE TABLE OF EKBE,
        LS_EKBE TYPE EKBE,
        LT_T023T TYPE TABLE OF T023T,
        LS_T023T TYPE T023T,
        LT_EKKO TYPE TABLE OF EKKO,
        LS_EKKO TYPE EKKO,
        L_INDEX TYPE SY-INDEX.

  CLEAR:LT_EKPO,LT_EKBE,LT_T023T,LT_EKKO,L_INDEX.

  SELECT FROM EKPO INTO TABLE LT_EKPO
    WHERE KONNR GS_HEAD-EBELN.

  CHECK LT_EKPO IS NOT INITIAL.

  SELECT FROM EKKO INTO TABLE LT_EKKO
    FOR ALL ENTRIES IN LT_EKPO
    WHERE EBELN LT_EKPO-EBELN
      AND BSART 'ZSPO'.

  LOOP AT LT_EKPO INTO LS_EKPO.
    L_INDEX SY-TABIX.
    READ TABLE LT_EKKO INTO LS_EKKO WITH KEY EBELN LS_EKPO-EBELN.
    IF SY-SUBRC NE 0.
      DELETE LT_EKPO INDEX L_INDEX.
    ENDIF.
  ENDLOOP.

  CHECK LT_EKPO IS NOT INITIAL.

  SELECT FROM EKBE INTO TABLE LT_EKBE
    FOR ALL ENTRIES IN LT_EKPO
    WHERE EBELN LT_EKPO-EBELN
      AND EBELP LT_EKPO-EBELP
      AND VGABE '1'.

  SELECT FROM T023T INTO TABLE LT_T023T
    FOR ALL ENTRIES IN LT_EKPO
    WHERE MATKL LT_EKPO-MATKL.

  LOOP AT LT_EKBE INTO LS_EKBE.
    GS_OUT-EBELN LS_EKBE-EBELN.
    GS_OUT-EBELP LS_EKBE-EBELP.
    READ TABLE LT_EKPO INTO LS_EKPO WITH KEY EBELN GS_OUT-EBELN EBELP GS_OUT-EBELP.
    READ TABLE LT_T023T INTO LS_T023T WITH KEY MATKL LS_EKPO-MATKL.
    GS_OUT-MATKL LS_T023T-WGBEZ60.
    GS_OUT-TXZ01 LS_EKPO-TXZ01.
    GS_OUT-MBLNR LS_EKBE-BELNR.
    GS_OUT-WRBTR LS_EKBE-WRBTR.
    IF LS_EKBE-SHKZG EQ 'H'.
      GS_OUT-WRBTR GS_OUT-WRBTR.
    ENDIF.
    GS_OUT-GJAHR LS_EKBE-GJAHR.

    SELECT SINGLE BNNUM BNDAT INTO (GS_OUT-BNNUM,GS_OUT-BNDAT)
      FROM Z02MMBNNO
      WHERE MBLNR GS_OUT-MBLNR
        AND GJAHR GS_OUT-GJAHR.

    IF GS_OUT-BNNUM IS NOT INITIAL.
      GS_HEAD-BAMOUNT GS_HEAD-BAMOUNT + GS_OUT-WRBTR.
    ENDIF.

    APPEND GS_OUT TO GT_OUT.

    CLEARGS_OUT,LS_EKPO,LS_T023T.

  ENDLOOP.


ENDFORM.                    " FRM_GET_ITEM
*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BUILD_FIELDCAT .
  CLEAR GS_FCAT.
  GS_FCAT-FIELDNAME 'CBOX'.
  GS_FCAT-SELTEXT_L 'Select'.
  GS_FCAT-CHECKBOX 'X'.
  GS_FCAT-FIX_COLUMN 'X'.
  GS_FCAT-EDIT 'X'.
  GS_FCAT-OUTPUTLEN '5'.
  APPEND GS_FCAT TO GT_FCAT.
  DEFINE APPEND_FCAT.
    CLEAR GS_FCAT.
    GS_FCAT-FIELDNAME &1.
    GS_FCAT-SELTEXT_L &2.
    GS_FCAT-NO_OUT =  &3.
    GS_FCAT-NO_ZERO &4.
    GS_FCAT-OUTPUTLEN &5.
    APPEND GS_FCAT TO GT_FCAT.
  END-OF-DEFINITION.
  APPEND_FCAT 'EBELN' 'Service Order'(001)  ''  '' '12'.
  APPEND_FCAT 'EBELP' 'Line Item'(002)  ''  '' '6'.
  APPEND_FCAT 'MATKL' 'Service Category'(003)  ''  '' '50'.
  APPEND_FCAT 'TXZ01' 'Short Text'(004)  ''  '' '30'.
  APPEND_FCAT 'MBLNR' 'Service Receipt'(005)  ''  '' '12'.
  APPEND_FCAT 'WRBTR' 'Amount'(006)  ''  '' '13'.
  APPEND_FCAT 'BNNUM' 'BN Number'(007)  ''  '' '20'.
  APPEND_FCAT 'BNDAT' 'BN Date'(008)  ''  '' '12'.

ENDFORM.                    " FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
  GS_LAYO-ZEBRA 'X'.
*  GS_LAYO-COLWIDTH_OPTIMIZE = 'X'.
  GS_LAYO-BOX_FIELDNAME 'BOX_NAME'.
ENDFORM.                    " FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
  GS_SETTINGS-EDT_CLL_CB 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       SY-REPID
      IS_LAYOUT                GS_LAYO
      IT_FIELDCAT              GT_FCAT
      I_GRID_SETTINGS          GS_SETTINGS
      I_CALLBACK_PF_STATUS_SET 'FRM_SET_STATUS'
      I_CALLBACK_USER_COMMAND  'FRM_USER_COMMAND'
      I_SAVE                   'A'
      I_DEFAULT                'X'
    TABLES
      T_OUTTAB                 GT_OUT.
ENDFORM.                    " FRM_DISPLAY_ALV


*&---------------------------------------------------------------------*
*&      Form  frm_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->SELFIELD   text
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING P_UCOMM TYPE SY-UCOMM SELFIELD TYPE SLIS_SELFIELD.
  CASE P_UCOMM.
    WHEN '&SALL'.
      PERFORM FRM_SELECT_ALL USING 'X'.
      SELFIELD-REFRESH 'X'.
    WHEN '&DESAL'.
      PERFORM FRM_SELECT_ALL USING ' '.
      SELFIELD-REFRESH 'X'.
    WHEN '&PRINT'.
      PERFORM FRM_PRINT_BN.
    WHEN '&CBN'.
      PERFORM FRM_GENERATE_BN.
      SELFIELD-REFRESH 'X'.
  ENDCASE.
ENDFORM.                    "user_command

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_EXTAB    text
*----------------------------------------------------------------------*
FORM FRM_SET_STATUS USING P_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STATUS01'.
ENDFORM.                    "f_status
*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0737   text
*----------------------------------------------------------------------*
FORM FRM_SELECT_ALL  USING    VALUE(P_X).
  DATA LS_OUT LIKE GS_OUT.

  LOOP AT GT_OUT INTO LS_OUT.
    LS_OUT-CBOX P_X.
    MODIFY GT_OUT FROM LS_OUT INDEX SY-TABIX.
  ENDLOOP.

ENDFORM.                    " FRM_SELECT_ALL
*&---------------------------------------------------------------------*
*&      Form  FRM_GENERATE_BN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GENERATE_BN .
  DATA:L_BN(3TYPE N.
  DATA:LS_Z02MMBNNO LIKE Z02MMBNNO.
  CLEAR L_BN.
  SELECT MAXBMSNO INTO L_BN FROM Z02MMBNNO WHERE EBELN P_EBELN.
  LOOP AT GT_OUT INTO GS_OUT WHERE BNNUM '' AND CBOX 'X' .
    L_BN L_BN + 1.
    CONCATENATE 'BN' P_EBELN '-'  L_BN INTO GS_OUT-BNNUM.
    GS_OUT-BNDAT SY-DATUM.
    GS_HEAD-BAMOUNT GS_HEAD-BAMOUNT + GS_OUT-WRBTR.
    CLEAR LS_Z02MMBNNO.
    LS_Z02MMBNNO-MBLNR GS_OUT-MBLNR.
    LS_Z02MMBNNO-GJAHR GS_OUT-GJAHR.
    LS_Z02MMBNNO-EBELN P_EBELN.
    LS_Z02MMBNNO-BMSNO L_BN .
    LS_Z02MMBNNO-BNNUM GS_OUT-BNNUM.
    LS_Z02MMBNNO-BNDAT GS_OUT-BNDAT.
    INSERT Z02MMBNNO FROM LS_Z02MMBNNO.
    MODIFY GT_OUT FROM GS_OUT INDEX SY-TABIX.
  ENDLOOP.
ENDFORM.                    " FRM_GENERATE_BN
*&---------------------------------------------------------------------*
*&      Form  FRM_PRINT_BN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PRINT_BN .
  DATAFUNC_MOD_NAME TYPE RS38L_FNAM,                            " 子程序名
        OUTPUT_OPTIONS TYPE SSFCOMPOP,                            " SAP Smart Forms: 智能写作器 (传输) 选项
        IT_JOB_OUTPUT_INFO TYPE SSFCRESCL,
        CONTROL_PARAMETERS TYPE SSFCTRLOP.                        " Smart Forms: 控制结构

  CLEAR GT_PRINT.

  LOOP AT GT_OUT INTO GS_OUT WHERE CBOX 'X' AND BNNUM NE ''.
    GS_PRINT GS_OUT.
    APPEND GS_PRINT TO GT_PRINT.
    CLEARGS_PRINT,GS_OUT.
  ENDLOOP.

  CHECK GT_PRINT IS NOT INITIAL.

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME           'ZMM_FORM_06'
    IMPORTING
      FM_NAME            FUNC_MOD_NAME
    EXCEPTIONS
      NO_FORM            1
      NO_FUNCTION_MODULE 2
      OTHERS             3.
  OUTPUT_OPTIONS-TDNEWID        'X'.
  CONTROL_PARAMETERS-NO_CLOSE   SPACE.
*  control_parameters-no_open    = 'X'.
  CONTROL_PARAMETERS-PREVIEW    'X'.
*  control_parameters-no_dialog  = 'X'.


  CALL FUNCTION FUNC_MOD_NAME
    EXPORTING
      CONTROL_PARAMETERS CONTROL_PARAMETERS
      OUTPUT_OPTIONS     OUTPUT_OPTIONS
    EXCEPTIONS
      FORMATTING_ERROR   1
      INTERNAL_ERROR     2
      SEND_ERROR         3
      USER_CANCELED      4
      OTHERS             5.
  IF SY-SUBRC <> 0.
  ENDIF.

ENDFORM.                    " FRM_PRINT_BN
<think>我们按照要求编写一个销售订单凭证流显示的ABAP报表程序,使用REUSE_ALV_GRID_DISPLAY_LVC函数,并增加自定义按钮(包括双击跳转、全选、取消全选功能)。 注意:由于REUSE_ALV_GRID_DISPLAY_LVC函数支持使用LVC(List Viewer Control)的ALV,我们可以通过设置来实现自定义按钮和事件。 步骤: 1. 定义选择屏幕:输入销售订单号(单值)和凭证类型范围(可选)等。 2. 定义全局数据:包括内表结构(包凭证流信息,以及一个用于全选的复选框字段)。 3. 主程序:获取数据,处理数据,显示ALV。 4. 在ALV显示中,添加自定义按钮(全选、取消全选)和事件处理。 5. 实现双击事件,双击凭证号时跳转到该凭证的显示界面。 我们将按照以下结构编写: - 选择屏幕:销售订单号(P_VBELN)、凭证类型范围(S_VBTYP)等。 - 全局数据:定义一个包凭证流信息的内表,包括复选框字段(用于全选操作)。 - 子程序: FRM_GET_DATA:获取凭证流数据(例如从表VBFA中获取)。 FRM_BUILD_FIELDCAT:构建字段目录(包括复选框字段)。 FRM_SET_EVENT:设置事件(包括双击事件和自定义按钮事件)。 FRM_DISPLAY_ALV:显示ALV并添加自定义按钮。 注意:自定义按钮需要定义在GUI状态中,但REUSE_ALV_GRID_DISPLAY_LVC允许通过IT_TOOLBAR参数添加自定义按钮。 由于要求使用REUSE_ALV_GRID_DISPLAY_LVC,我们将使用以下方式: - 通过I_CALLBACK_PF_STATUS_SET设置GUI状态(也可以使用IT_TOOLBAR直接添加按钮) - 通过I_CALLBACK_USER_COMMAND处理按钮事件 - 通过I_CALLBACK_DOUBLE_CLICK处理双击事件 我们选择在状态设置中添加自定义按钮(全选、取消全选)和标准按钮(如退出、刷新等)。 由于对日开发要求不使用CLASS,我们将使用传统的子程序方式实现事件回调。 代码结构如下:</think>以下是根据您要求编写的销售订单凭证流显示程序,使用`REUSE_ALV_GRID_DISPLAY_LVC`实现ALV显示,并添加了自定义按钮功能: ```abap *&---------------------------------------------------------------------* *& Report Z_SALES_DOCUMENT_FLOW *&---------------------------------------------------------------------* *& *& 销售订单凭证流显示报表 *& 显示销售订单相关的凭证流信息 *&---------------------------------------------------------------------* REPORT Z_SALES_DOCUMENT_FLOW. *----------------------------------------------------------------------* * 选择屏幕定义 *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-T01. PARAMETERS: P_VBELN TYPE VBELN_VA OBLIGATORY. " 销售订单号(必输) SELECT-OPTIONS: S_VBTYP FOR VBFA-VBTYP. " 凭证类型范围 PARAMETERS: CB_ALL AS CHECKBOX. " 显示所有项目 SELECTION-SCREEN END OF BLOCK BLK1. *----------------------------------------------------------------------* * 类型定义 *----------------------------------------------------------------------* TYPES: BEGIN OF TY_VBFA, VBELV TYPE VBELN, " 前续凭证 POSNV TYPE POSNR, " 前续项目 VBELN TYPE VBELN, " 后续凭证 POSNN TYPE POSNR, " 后续项目 VBTYP_N TYPE VBTYP, " 后续凭证类型 PLMIN TYPE PLMIN, " 计划行状态 ERDAT TYPE ERDAT, " 创建日期 ERZET TYPE ERZET, " 创建时间 RFMNG TYPE RFMNG, " 参考数量 MEINS TYPE MEINS, " 单位 SELECT TYPE C, " 选择标记(用于全选) ICON TYPE ICON-ID, " 状态图标 MSG TYPE STRING, " 状态文本 END OF TY_VBFA. *----------------------------------------------------------------------* * 全局数据定义 *----------------------------------------------------------------------* DATA: GT_VBFA TYPE TABLE OF TY_VBFA, " 凭证流数据 GW_VBFA TYPE TY_VBFA, " 工作区 GV_TITLE TYPE STRING, " ALV标题 GV_REPID TYPE SY-REPID, " 程序名 GV_SAVE TYPE C VALUE 'A', " ALV布局保存 GS_LAYOUT TYPE LVC_S_LAYO. " ALV布局 * ALV字段目录 DATA: GT_FIELDCAT TYPE LVC_T_FCAT, GW_FIELDCAT TYPE LVC_S_FCAT. * 事件处理 DATA: GO_GRID TYPE REF TO CL_GUI_ALV_GRID, GS_EVENT TYPE SLIS_T_EVENT, GW_EVENT TYPE SLIS_ALV_EVENT. *----------------------------------------------------------------------* * 主程序逻辑 *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM FRM_GET_DATA. " 获取数据 PERFORM FRM_PREPARE_ALV. " 准备ALV显示 PERFORM FRM_DISPLAY_ALV. " 显示ALV *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* * 从VBFA表获取凭证流数据 *----------------------------------------------------------------------* FORM FRM_GET_DATA. DATA: LT_VBFA TYPE TABLE OF VBFA. " 获取凭证流数据 SELECT * INTO TABLE LT_VBFA FROM VBFA WHERE VBELV = P_VBELN AND VBTYP_N IN S_VBTYP. " 检查数据是否存在 IF SY-SUBRC <> 0. MESSAGE '未找到凭证流数据' TYPE 'S' DISPLAY LIKE 'E'. STOP. ENDIF. " 转换数据结构并添加选择字段 LOOP AT LT_VBFA INTO DATA(LS_VBFA). CLEAR GW_VBFA. MOVE-CORRESPONDING LS_VBFA TO GW_VBFA. " 设置初始选择状态 GW_VBFA-SELECT = 'X'. " 默认全选 " 设置状态图标和文本 CASE LS_VBFA-PLMIN. WHEN 'A'. " 已确认 GW_VBFA-ICON = ICON_LED_GREEN. GW_VBFA-MSG = '已确认'. WHEN 'B'. " 部分确认 GW_VBFA-ICON = ICON_LED_YELLOW. GW_VBFA-MSG = '部分确认'. WHEN OTHERS. GW_VBFA-ICON = ICON_LED_RED. GW_VBFA-MSG = '未处理'. ENDCASE. APPEND GW_VBFA TO GT_VBFA. ENDLOOP. " 设置ALV标题 GV_TITLE = |销售订单 { P_VBELN } 凭证流|. ENDFORM. " FRM_GET_DATA *&---------------------------------------------------------------------* *& Form FRM_PREPARE_ALV *&---------------------------------------------------------------------* * 准备ALV显示设置 *----------------------------------------------------------------------* FORM FRM_PREPARE_ALV. " 设置布局 GS_LAYOUT-ZEBRA = 'X'. " 斑马线 GS_LAYOUT-CWIDTH_OPT = 'X'. " 优化列宽 GS_LAYOUT-SEL_MODE = 'D'. " 选择模式(允许多选) GS_LAYOUT-CTAB_FNAME = 'COLOR'. " 颜色字段 GS_LAYOUT-INFO_FNAME = 'COLOR'. " 行颜色字段 " 构建字段目录 PERFORM FRM_BUILD_FIELDCAT. " 设置事件处理 PERFORM FRM_SET_EVENT_HANDLER. ENDFORM. " FRM_PREPARE_ALV *&---------------------------------------------------------------------* *& Form FRM_BUILD_FIELDCAT *&---------------------------------------------------------------------* * 构建ALV字段目录 *----------------------------------------------------------------------* FORM FRM_BUILD_FIELDCAT. " 清空字段目录 REFRESH GT_FIELDCAT. " 定义字段:选择列(复选框) PERFORM ADD_FIELD USING: 'SELECT' '选择' ' ' 'X' '1' CHAR1 'LVC_CR_S', 'ICON' '状态' ' ' ' ' '2' ICON ' ', 'VBELV' '前续凭证' '10' ' ' '3' CHAR10 ' ', 'POSNV' '项目' '6' ' ' '4' CHAR6 ' ', 'VBELN' '后续凭证' '10' ' ' '5' CHAR10 ' ', 'POSNN' '项目' '6' ' ' '6' CHAR6 ' ', 'VBTYP_N' '凭证类型' '4' ' ' '7' CHAR4 ' ', 'PLMIN' '计划行' '1' ' ' '8' CHAR1 ' ', 'ERDAT' '创建日期' '10' ' ' '9' DATUM ' ', 'ERZET' '创建时间' '8' ' ' '10' TIME ' ', 'RFMNG' '数量' '15' ' ' '11' QUAN13 ' ', 'MEINS' '单位' '3' ' ' '12' UNIT3 ' ', 'MSG' '状态' '20' ' ' '13' STRING ' '. ENDFORM. " FRM_BUILD_FIELDCAT *&---------------------------------------------------------------------* *& Form ADD_FIELD *&---------------------------------------------------------------------* * 添加字段到字段目录 *----------------------------------------------------------------------* FORM ADD_FIELD USING P_FNAME P_TXT P_KEY P_EDIT P_COLPOS P_DTYPE P_STYLE. CLEAR GW_FIELDCAT. GW_FIELDCAT-FIELDNAME = P_FNAME. " 字段名 GW_FIELDCAT-COLTEXT = P_TXT. " 列标题 GW_FIELDCAT-KEY = P_KEY. " 关键字段 GW_FIELDCAT-EDIT = P_EDIT. " 可编辑 GW_FIELDCAT-COL_POS = P_COLPOS. " 列位置 GW_FIELDCAT-DATATYPE = P_DTYPE. " 数据类型 GW_FIELDCAT-STYLE = P_STYLE. " 单元格样式 " 特殊字段设置 CASE P_FNAME. WHEN 'SELECT'. GW_FIELDCAT-CHECKBOX = 'X'. " 复选框 WHEN 'RFMNG'. GW_FIELDCAT-QFIELDNAME = 'MEINS'. " 数量单位参考 WHEN 'ICON'. GW_FIELDCAT-ICON = 'X'. " 图标字段 ENDCASE. APPEND GW_FIELDCAT TO GT_FIELDCAT. ENDFORM. " ADD_FIELD *&---------------------------------------------------------------------* *& Form FRM_SET_EVENT_HANDLER *&---------------------------------------------------------------------* * 设置ALV事件处理程序 *----------------------------------------------------------------------* FORM FRM_SET_EVENT_HANDLER. " 设置事件处理表 GW_EVENT-NAME = SLIS_EV_USER_COMMAND. GW_EVENT-FORM = 'FRM_USER_COMMAND'. " 用户命令处理 APPEND GW_EVENT TO GS_EVENT. GW_EVENT-NAME = SLIS_EV_DOUBLE_CLICK. GW_EVENT-FORM = 'FRM_DOUBLE_CLICK'. " 双击事件处理 APPEND GW_EVENT TO GS_EVENT. GW_EVENT-NAME = SLIS_EV_TOP_OF_PAGE. GW_EVENT-FORM = 'FRM_TOP_OF_PAGE'. " 页眉处理 APPEND GW_EVENT TO GS_EVENT. ENDFORM. " FRM_SET_EVENT_HANDLER *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_ALV *&---------------------------------------------------------------------* * 显示ALV表格 *----------------------------------------------------------------------* FORM FRM_DISPLAY_ALV. " 调用ALV显示函数 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID " 程序名 I_CALLBACK_PF_STATUS_SET = 'FRM_SET_STATUS' " 自定义状态 I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' " 用户命令 I_CALLBACK_TOP_OF_PAGE = 'FRM_TOP_OF_PAGE' " 页眉 IS_LAYOUT_LVC = GS_LAYOUT " 布局 IT_FIELDCAT_LVC = GT_FIELDCAT " 字段目录 I_SAVE = GV_SAVE " 布局保存 I_DEFAULT = 'X' " 默认布局 I_GRID_SETTINGS = VALUE LVC_S_GLAY( " 网格设置 EDIT_MODE = 'X' " 允许编辑 STYLEFNAME = 'STYLE' ) " 样式字段 TABLES T_OUTTAB = GT_VBFA " 输出数据 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_SET_STATUS *&---------------------------------------------------------------------* * 设置自定义GUI状态(添加按钮) *----------------------------------------------------------------------* FORM FRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. " 设置状态 SET PF-STATUS 'ZSTATUS' EXCLUDING RT_EXTAB. ENDFORM. " FRM_SET_STATUS *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * 处理用户命令(按钮点击) *----------------------------------------------------------------------* FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'ALL_SEL'. " 全选按钮 PERFORM FRM_SELECT_ALL. WHEN 'DESEL'. " 取消全选按钮 PERFORM FRM_DESELECT_ALL. WHEN 'DISP'. " 显示选中凭证 PERFORM FRM_DISPLAY_SELECTED. ENDCASE. " 刷新ALV显示 RS_SELFIELD-REFRESH = 'X'. ENDFORM. " FRM_USER_COMMAND *&---------------------------------------------------------------------* *& Form FRM_SELECT_ALL *&---------------------------------------------------------------------* * 全选功能 *----------------------------------------------------------------------* FORM FRM_SELECT_ALL. LOOP AT GT_VBFA ASSIGNING FIELD-SYMBOL(<FS_VBFA>). <FS_VBFA>-SELECT = 'X'. " 设置选择标志 ENDLOOP. MESSAGE '已全选所有项目' TYPE 'S'. ENDFORM. " FRM_SELECT_ALL *&---------------------------------------------------------------------* *& Form FRM_DESELECT_ALL *&---------------------------------------------------------------------* * 取消全选功能 *----------------------------------------------------------------------* FORM FRM_DESELECT_ALL. LOOP AT GT_VBFA ASSIGNING FIELD-SYMBOL(<FS_VBFA>). <FS_VBFA>-SELECT = ' '. " 清除选择标志 ENDLOOP. MESSAGE '已取消所有选择' TYPE 'S'. ENDFORM. " FRM_DESELECT_ALL *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_SELECTED *&---------------------------------------------------------------------* * 显示选中凭证 *----------------------------------------------------------------------* FORM FRM_DISPLAY_SELECTED. DATA: LV_VBELN TYPE VBELN. " 获取第一个选中的凭证 READ TABLE GT_VBFA INTO GW_VBFA WITH KEY SELECT = 'X'. IF SY-SUBRC = 0. LV_VBELN = GW_VBFA-VBELN. " 调用事务显示凭证 CALL FUNCTION 'SD_DOCUMENT_DISPLAY' EXPORTING I_VBELN = LV_VBELN I_NO_AUTH = 'X' EXCEPTIONS NOT_FOUND = 1 NO_AUTHORITY = 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. ELSE. MESSAGE '请先选择凭证' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. ENDFORM. " FRM_DISPLAY_SELECTED *&---------------------------------------------------------------------* *& Form FRM_DOUBLE_CLICK *&---------------------------------------------------------------------* * 处理双击事件(跳转凭证显示) *----------------------------------------------------------------------* FORM FRM_DOUBLE_CLICK USING E_ROW TYPE SLIS_T_SELFIELD E_COLUMN TYPE SLIS_T_SELFIELD ES_ROW_NO TYPE SLIS_T_SELFIELD. " 获取双击行的数据 READ TABLE GT_VBFA INTO GW_VBFA INDEX E_ROW-INDEX. IF SY-SUBRC = 0. " 调用事务显示凭证 CALL FUNCTION 'SD_DOCUMENT_DISPLAY' EXPORTING I_VBELN = GW_VBFA-VBELN I_NO_AUTH = 'X' EXCEPTIONS NOT_FOUND = 1 NO_AUTHORITY = 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. ENDIF. ENDFORM. " FRM_DOUBLE_CLICK *&---------------------------------------------------------------------* *& Form FRM_TOP_OF_PAGE *&---------------------------------------------------------------------* * 创建页眉 *----------------------------------------------------------------------* FORM FRM_TOP_OF_PAGE. DATA: LT_HEADER TYPE SLIS_T_LISTHEADER, LW_HEADER TYPE SLIS_LISTHEADER. " 标题行 LW_HEADER-TYP = 'H'. LW_HEADER-INFO = GV_TITLE. APPEND LW_HEADER TO LT_HEADER. " 订单信息行 LW_HEADER-TYP = 'S'. LW_HEADER-KEY = '销售订单:'. LW_HEADER-INFO = P_VBELN. APPEND LW_HEADER TO LT_HEADER. " 显示页眉 CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING IT_LIST_COMMENTARY = LT_HEADER. ENDFORM. " FRM_TOP_OF_PAGE *----------------------------------------------------------------------* * 程序初始化(GUI状态定义) *----------------------------------------------------------------------* INITIALIZATION. " 设置GUI状态(添加自定义按钮) SET PF-STATUS 'ZSTATUS' EXCLUDING SY-UCOMM. " 添加自定义按钮到GUI状态 DATA: LS_FUNC TYPE SMP_DYNFUNC. LS_FUNC-FCODE = 'ALL_SEL'. " 全选按钮 LS_FUNC-TEXT = '全选'. APPEND LS_FUNC TO GT_FUNC. LS_FUNC-FCODE = 'DESEL'. " 取消全选按钮 LS_FUNC-TEXT = '取消全选'. APPEND LS_FUNC TO GT_FUNC. LS_FUNC-FCODE = 'DISP'. " 显示选中按钮 LS_FUNC-TEXT = '显示选中'. APPEND LS_FUNC TO GT_FUNC. " 设置状态 CALL FUNCTION 'RS_SET_SELSCREEN_STATUS' EXPORTING P_STATUS = 'ZSTATUS' P_PROGRAM = SY-REPID TABLES P_EXCLUDE = GT_EXCLUDE. ``` ### 功能说明: 1. **凭证流显示**: - 输入销售订单号,显示所有相关凭证流 - 包前续凭证、后续凭证、创建日期、数量等信息 - 状态图标显示凭证处理状态 2. **自定义按钮**: - 全选按钮:选择所有行 - 取消全选按钮:取消所有选择 - 显示选中按钮:显示第一个选中的凭证 3. **双击功能**: - 双击任何凭证行,自动跳转到该凭证显示界面 4. **ALV功能**: - 使用`REUSE_ALV_GRID_DISPLAY_LVC`函数 - 支持斑马线、列宽优化 - 可编辑的选择列(复选框) - 自定义页眉显示订单信息 ### 关键实现点: 1. **自定义按钮实现**: - 在`INITIALIZATION`中定义GUI状态 - 添加`ALL_SEL`、`DESEL`、`DISP`三个自定义按钮 - 在`FRM_USER_COMMAND`中处理按钮事件 2. **双击事件处理**: - 注册`SLIS_EV_DOUBLE_CLICK`事件 - 在`FRM_DOUBLE_CLICK`中实现凭证跳转逻辑 - 使用`SD_DOCUMENT_DISPLAY`函数显示凭证 3. **全选/取消全选功能**: - `FRM_SELECT_ALL`:遍历内表设置选择标志 - `FRM_DESELECT_ALL`:遍历内表清除选择标志 - 通过刷新ALV立即更新显示 4. **状态显示**: - 使用图标字段显示不同状态(绿灯/黄灯/红灯) - 添加状态文本说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值