很长时间 不写的ALV OO, 贴在此处下次参考

该程序用于列出SAP系统中的Billing通知详情,包括服务订单、行项目、服务类别等信息,并提供BN号生成及打印功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& Report      Z02MMR022
*&
*&---------------------------------------------------------------------*
*  Author: Vince
*  Closeing Date:
*  Description: List of Billing Notification
************************************************************************
*  Ver    Date       Author    Modify Des
************************************************************************
*  1.    2013/03/10 Vince  New Program
************************************************************************
REPORT Z02MMR022 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,
  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.

DATA:GT_FCAT TYPE LVC_T_FCAT,
      GS_FCAT TYPE LVC_S_FCAT,
      GS_LAYO TYPE LVC_S_LAYO,
      GT_SORT TYPE LVC_T_SORT,
      GS_SORT TYPE LVC_S_SORT,
      GT_EXCLUDE  TYPE TABLE OF SY-UCOMM,
      GS_EXCLUDE TYPE SY-UCOMM,
      G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      G_GRID TYPE REF TO CL_GUI_ALV_GRID,
      SCRFNAME TYPE SCRFNAME VALUE 'CC01',
      SAVE_OK TYPE OK,
      OK_CODE TYPE OK.

**********************************************************************
* 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.
  PERFORM FRM_BUILD_FIELDCAT.
  PERFORM FRM_SET_LAYOUT.
  CALL SCREEN 100.
**********************************************************************
* END OF SELECTION
**********************************************************************
END-OF-SELECTION.


**********************************************************************
* 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 GS_FCAT-COLTEXT '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 GS_FCAT-COLTEXT &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)  ''  '' '8'.
  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'.
ENDFORM.                    " FRM_SET_LAYOUT


*&---------------------------------------------------------------------*
*&      Form  frm_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->SELFIELD   text
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND.
  SAVE_OK OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN '&SALL'.
      PERFORM FRM_SELECT_ALL USING 'X'.
    WHEN '&DESAL'.
      PERFORM FRM_SELECT_ALL USING ' '.
    WHEN '&PRINT'.
      PERFORM FRM_PRINT_BN.
    WHEN '&CBN'.
      PERFORM FRM_GENERATE_BN.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDFORM.                    "user_command

*&---------------------------------------------------------------------*
*&      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.
  CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

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.
    IF SY-SUBRC EQ 0.
      COMMIT WORK AND WAIT.
    ENDIF.
    MODIFY GT_OUT FROM GS_OUT INDEX SY-TABIX.
  ENDLOOP.

  CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.
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
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS01'.
  SET TITLEBAR 'TITLE01'.
  PERFORM FRM_DISABLE_INPUT.
  PERFORM FRM_SCREEN_DISPLAY.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  PERFORM FRM_USER_COMMAND.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_SCREEN_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SCREEN_DISPLAY .
  IF G_CUSTOM_CONTAINER IS INITIAL.
    CREATE OBJECT G_CUSTOM_CONTAINER
      EXPORTING
        CONTAINER_NAME SCRFNAME.

    CREATE OBJECT G_GRID
      EXPORTING
        I_PARENT G_CUSTOM_CONTAINER.

    PERFORM FRM_EXCLUDE_BUTTON.

    CALL METHOD G_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        I_SAVE               'U'
        I_DEFAULT            'X'
        IS_LAYOUT            GS_LAYO
        IT_TOOLBAR_EXCLUDING GT_EXCLUDE
      CHANGING
        IT_OUTTAB            GT_OUT
        IT_FIELDCATALOG      GT_FCAT
*       IT_SORT              = GT_SORT
*       IT_FILTER            =
      .
    CALL METHOD G_GRID->SET_READY_FOR_INPUT
      EXPORTING
        I_READY_FOR_INPUT 1.
    CALL METHOD G_GRID->REGISTER_EDIT_EVENT
      EXPORTING
        I_EVENT_ID CL_GUI_ALV_GRID=>MC_EVT_ENTER.
    CALL METHOD G_GRID->REGISTER_EDIT_EVENT
      EXPORTING
        I_EVENT_ID CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
  ELSE.
    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

  ENDIF.
ENDFORM.                    " FRM_SCREEN_DISPLAY


*&---------------------------------------------------------------------*
*&      Form  frm_exclude_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_EXCLUDE_BUTTON .
  DATA LS_EXCLUDE TYPE UI_FUNC.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_LY_NO_DELETE_ROWS.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE '&CHECK'.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.
  LS_EXCLUDE '&LOCAL&UNDO'.
  APPEND LS_EXCLUDE TO GT_EXCLUDE.

ENDFORM.                    " EXCLUDE_BUTTON
*&---------------------------------------------------------------------*
*&      Form  FRM_DISABLE_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISABLE_INPUT .
  LOOP AT SCREEN.
    IF SCREEN-NAME CS 'GS_HEAD-'.
      SCREEN-INPUT  0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_DISABLE_INPUT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值