主营业收入报表

************************************************************************
**----------------------------------------------------------------------
* Associated program: No programs are associated
*-----------------------------------------------------------------------
* Restriction:  No restriction
************************************************************************

REPORT  ZFI_MARGIN 

NO STANDARD PAGE HEADING.

TYPE-POOLS: MBARC, SLIS.
*----------------------------------------------------------------------*
* TABLE DECLARATION
*----------------------------------------------------------------------*
TABLES:BKPF,
       MARA,
       VBRK,
       MKPF,
       MSEG,
       MMIM_REP_CUST,
       MBEW,
       CKMLCR,
       EBEW,
       VBRP,
       EKKN.
*&---------------------------------------------------------------------*
* STRUCTURE DECLARATION
*&---------------------------------------------------------------------*
TYPES : BEGIN OF T_TAB,
    PRDHA LIKE MARA-PRDHA, "产品层次
    WERKS LIKE VBRP-WERKS, "工厂
    MONAT LIKE VBRK-POPER, "期间
    MENGE LIKE VBRP-FKLMG, "数量
    MATNR LIKE VBRP-MATNR, "物料
    KUNNR LIKE VBRK-KUNAG, "客户
    MEINS LIKE VBRP-MEINS, "单位
    BUDAT LIKE VBRK-FKDAT, "发票日期
    WAERS LIKE VBRK-WAERK, "本位币 default to CNY
    VBELN LIKE VBRP-VBELN, "发票号
    POSNR LIKE VBRP-POSNR, "行号
    MAKTX LIKE VBRP-ARKTX, "物料描述
    MAKTL LIKE VBRP-MATKL, "物料组
    KURSK LIKE VBRP-KURSK, "决定价格的汇率
    WAVWR LIKE VBRP-WAVWR, "标准成本
    NETWR LIKE VBRP-NETWR, "出具发票项目的凭证货币净值
    KZWI2 LIKE VBRP-KZWI2, "海运费和保险费
    KZWI3 LIKE VBRP-KZWI3, "海运费和保险费
    WAERK2 LIKE VBRK-WAERK,"凭证币别
    NETWR2 LIKE VBRP-NETWR, "本位币值
    PVPRS  LIKE CKMLCR-PVPRS, "单位实际成本
    WAVWR2 LIKE VBRP-WAVWR, "实际成本值
    KURRF_DAT LIKE VBRK-KURRF_DAT,"换算日期
    VGBEL TYPE VBRP-VGBEL, "参考单据的单据编号
    VGPOS TYPE VBRP-VGPOS, "参考项目的项目号
    AUBEL LIKE VBRP-AUBEL,"销售单
    AUPOS LIKE VBRP-AUPOS,"销售单行项目
    AUTYP LIKE VBRP-AUTYP, "单据类型
    SONO LIKE EKKN-VBELN,   "销售单
    SOIT LIKE EKKN-VBELP,   "行项目
    AUTYPT(50TYPE C,      "单据类型
    SHKZG(1TYPE C,
    HKONT TYPE BSEG-HKONT,     "总账科目
    BUKRS TYPE VBRK-BUKRS,    "公司代码
    PAOBJNR TYPE VBRP-PAOBJNR, "获利字段
  END OF T_TAB.

TYPES : BEGIN OF T_VALUE,
         MONAT  LIKE BKPF-MONAT,   "期间
         KUNNR  LIKE KNA1-KUNNR,   "客户编号
         MATNR  LIKE MARA-MATNR,   "物料号
         PRDHA  LIKE MARA-PRDHA,   "产品层次
         VTEXT  LIKE T179T-VTEXT,  "层次名称
         WERKS  LIKE MARC-WERKS,   "评估范围
         MAKTX  LIKE MAKT-MAKTX,   "物料描述.
         MATKL  LIKE VBRP-MATKL,   "物料组
         WAERS  LIKE CKMLCR-WAERS, "币别
         MEINS  LIKE MARA-MEINS,   "主档单位
         MENGE  LIKE MSEG-MENGE,   "销售数量
         MENGE2  LIKE MSEG-MENGE,  "总重量
         NETWR2  LIKE VBRP-NETWR,  "总价值
         KSTBW  LIKE KONP-KSTBW,   "平均售价
         STPRS  LIKE MBEW-STPRS,   "单位标准成本
         PVPRS  LIKE CKMLCR-PVPRS, "单位实际成本
         PEINH  LIKE CKMLCR-PEINH, "价格单位
         DWMIS  LIKE CKMLCR-PVPRS,  "单位实际毛利
         ZSJCB  LIKE CKMLCR-PVPRS,  "总实际成本
         ZMLIS  LIKE CKMLCR-PVPRS,  "总毛利
         MLILU  LIKE CKMLCR-PVPRS,  "毛利率(数)
         MLILU_C  TYPE C LENGTH 29"毛利率(数)
         NAME1  LIKE KNA1-NAME1,    "客户名称
         WAVWR LIKE VBRP-WAVWR,     "标准成本
         WAVWR2 LIKE VBRP-WAVWR,    "实际成本值
         WAVWR3 LIKE VBRP-WAVWR,    "标准和实际的差异
         VBELN  LIKE VBRP-VBELN,    "发票
         POSNR  LIKE VBRP-POSNR,    "行
         AUBEL LIKE VBRP-AUBEL,     "销售单
         AUPOS LIKE VBRP-AUPOS,     "销售单行项目
         AUTYP LIKE VBRP-AUTYP,     "单据类型
         AUTYPT(50TYPE C,         "类型名称
         MLILU1  LIKE CKMLCR-PVPRS, "单位差异(数)
         HKONT TYPE BSEG-HKONT,     "总账科目
     END OF T_VALUE.

DATABEGIN OF L_OUT,
         KALNR       TYPE CKMLHD-KALNR,
         MLAST       TYPE CKMLHD-MLAST,
         MATNR       TYPE CKMLHD-MATNR,
         BWKEY       TYPE CKMLHD-BWKEY,
         BWTAR       TYPE CKMLHD-BWTAR,
         SOBKZ       TYPE CKMLHD-SOBKZ,
         VBELN       TYPE CKMLHD-VBELN,
         POSNR       TYPE CKMLHD-POSNR,
         PSPNR       TYPE CKMLHD-PSPNR,
         BDATJ       TYPE CKMLPP-BDATJ,
         POPER       TYPE CKMLPP-POPER,
         STATUS      TYPE CKMLPP-STATUS,
         STATUS_TEXT TYPE DD07V-DDTEXT,
         CURTP       TYPE CKMLCR-CURTP,
         BKLAS       TYPE MBEW-BKLAS,
         MTART       TYPE MARA-MTART,
         MATKL       TYPE MARA-MATKL,
         SPART       TYPE MARA-SPART,
         KTEXT       TYPE MAKT-MAKTX,
         VPRSV       TYPE CKMLCR-VPRSV,
         LBKUM       TYPE CKMLPP-LBKUM,
         MEINS       TYPE MARA-MEINS,
         SALK3       TYPE CKMLCR-SALK3,
         SALKV       TYPE CKMLCR-SALKV,
         EB_DIF      TYPE CKI_DOC_ML-EB_DIF,
         STPRS       TYPE CKMLCR-STPRS,
         PVPRS       TYPE CKMLCR-PVPRS,
         PRABW_PRZ   TYPE CK_PRABW_PRZ,
         PEINH       TYPE CKMLCR-PEINH,
         WAERS       TYPE WAERS,
     END OF L_OUT.

TYPES:BEGIN OF T_BSEG,
        BUKRS  TYPE BUKRS,   "公司代码
        BELNR  TYPE BELNR_D, "会计凭证
        GJAHR  TYPE GJAHR,   "会计年度
        BUZEI  TYPE BUZEI,   "会计凭证行项目
        KOART  TYPE KOART,   "科目类型
        SHKZG  TYPE SHKZG,   "借方/贷方标识
        PSWBT TYPE PSWBT,   "总帐中更新的金额
        PSWSL TYPE PSWSL,   "更新总分类帐交易数字货币
        DMBTR TYPE DMBTR,   "按本位币计的金额
        HKONT  TYPE HKONT,    "总分类帐帐目
      END OF T_BSEG.

TYPES:BEGIN OF T_GLPCA,
        DRCRK  TYPE SHKZG,  "借方/贷方标识
        TSL  TYPE VTCUR_PCA,"业务货币计价的金额
      END OF T_GLPCA.
*&---------------------------------------------------------------------*
* INTERNAL TABLE DECLARATION
*&---------------------------------------------------------------------*
DATA :
      I_GLPCA TYPE STANDARD TABLE OF T_GLPCA,
      I_BSEG TYPE STANDARD TABLE OF T_BSEG,
      I_TAB TYPE STANDARD TABLE OF T_TAB,
      I_VALUE TYPE STANDARD TABLE OF T_VALUE.

RANGES S_BUDAT FOR MKPF-BUDAT.

*&---------------------------------------------------------------------*
* WORK AREA DECLARATION
*&---------------------------------------------------------------------*
DATA :
      WA_GLPCA TYPE T_GLPCA,
      WA_TAB TYPE T_TAB,
      WA_VALUE TYPE T_VALUE.

*&---------------------------------------------------------------------*
* VARIANT DECLARATION
*&---------------------------------------------------------------------*
DATA: L_ALV_FILED          TYPE SLIS_FIELDCAT_ALV.
DATA: L_ALV_FILEDCAT       TYPE SLIS_T_FIELDCAT_ALV.
DATA: GT_SORT              TYPE SLIS_T_SORTINFO_ALV.
DATA: GT_COLOR             TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
DATA: I_LAYOUT             TYPE SLIS_LAYOUT_ALV.
DATA: I_GRID_SETTINGS      TYPE LVC_S_GLAY.
DATA: PGM                  LIKE SY-REPID.
DATA: COL_POS              TYPE I VALUE 0.
DATA: I_EVENTS             TYPE SLIS_T_EVENT.
DATA: WA_EVENTS            TYPE SLIS_ALV_EVENT.

*&---------------------------------------------------------------------*
* Constant DECLARATION
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* SELECTION SCREEN DECLARATION
*&---------------------------------------------------------------------*
* Selection screen
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETER : P_R1 RADIOBUTTON GROUP G1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(10TEXT-007 FOR FIELD P_R1 .
SELECTION-SCREEN POSITION 30.
PARAMETER : P_R2 RADIOBUTTON GROUP G1.
SELECTION-SCREEN COMMENT 35(10TEXT-008 FOR FIELD P_R2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS:P_MJAHR LIKE MKPF-MJAHR OBLIGATORY.
SELECT-OPTIONS:S_MONAT FOR BKPF-MONAT OBLIGATORY.
SELECT-OPTIONS S_MATNR FOR MSEG-MATNR MEMORY ID MAT
                MATCHCODE OBJECT MAT1.
SELECT-OPTIONS:S_BUKRS FOR VBRK-BUKRS MEMORY ID BUK DEFAULT '1200',
               S_WERKS FOR MSEG-WERKS MEMORY ID WRK DEFAULT '1201'.
*转到会计的状态
SELECT-OPTIONS S_RFBSK FOR VBRK-RFBSK DEFAULT 'C'.
*产品层次
SELECT-OPTIONS S_PRDHA FOR MARA-PRDHA.
*SELECT-OPTIONS S_LGORT FOR MSEG-LGORT MEMORY ID LAG NO-DISPLAY.
*SELECT-OPTIONS S_CHARG FOR MSEG-CHARG MEMORY ID CHA NO-DISPLAY.
*SELECT-OPTIONS S_LIFNR FOR MSEG-LIFNR MEMORY ID LIF NO-DISPLAY.
SELECT-OPTIONS S_KUNNR FOR MSEG-KUNNR MEMORY ID KUN.
*SELECT-OPTIONS S_BWART FOR MSEG-BWART MEMORY ID BWA NO-DISPLAY.
*SELECT-OPTIONS S_SOBKZ FOR MSEG-SOBKZ NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK B1.

*SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
*SELECT-OPTIONS S_BUDAT FOR MKPF-BUDAT NO-DISPLAY.
*SELECT-OPTIONS S_USNAM FOR MKPF-USNAM MEMORY ID USR NO-DISPLAY.
*SELECT-OPTIONS S_VGART FOR MKPF-VGART NO-DISPLAY.
*SELECT-OPTIONS S_XBLNR FOR MKPF-XBLNR NO-DISPLAY.
*SELECTION-SCREEN END OF BLOCK B2.

*&---------------------------------------------------------------------*
* INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
*set initial values
  P_MJAHR = '2011'.

*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*  SET PARAMETER ID 'MAT' FIELD S_MATNR-LOW.
  SET PARAMETER ID 'WRK' FIELD S_WERKS-LOW.
  SET PARAMETER ID 'KUN' FIELD S_KUNNR-LOW.

*&---------------------------------------------------------------------*
* START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*取数
  PERFORM FRM_GET_DATA.

  IF I_TAB IS INITIAL.
    MESSAGE TEXT-006 TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.

*&---------------------------------------------------------------------*
* END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*处理
  IF I_TAB IS NOT INITIAL.
    PERFORM FRM_PROCESS_DATA.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
*取月第一天
  DATA:L_DATE_START LIKE SY-DATUM.
*取月最后一天
  DATA:L_DATE_END   LIKE SY-DATUM.
*取月份
  DATA:T_MONTH TYPE C LENGTH 10.
  DATA:T_LEN TYPE I.
  DATA:T_STR TYPE I.

  REFRESH:I_TAB.
  REFRESH:S_BUDAT.

*取过账年月
  IF S_MONAT-LOW IS NOT INITIAL AND S_MONAT-HIGH IS NOT INITIAL.
    CONCATENATE '00000' S_MONAT-HIGH INTO T_MONTH.
    T_LEN = STRLEN( T_MONTH ).
    T_STR = T_LEN - 2.
    T_MONTH = T_MONTH+T_STR(2).

    CONCATENATE P_MJAHR S_MONAT-HIGH '01' INTO L_DATE_START.

    S_BUDAT-SIGN = 'I'.
    S_BUDAT-OPTION = 'BT'.
    CONCATENATE P_MJAHR S_MONAT-LOW '01' INTO S_BUDAT-LOW.

    CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
      EXPORTING
        I_DATE = L_DATE_START
      IMPORTING
        E_DATE = L_DATE_END.

    S_BUDAT-HIGH = L_DATE_END.
    APPEND S_BUDAT.

  ELSE.
    IF S_MONAT-LOW IS NOT INITIAL.
      CONCATENATE '00000' S_MONAT-LOW INTO T_MONTH.
      T_LEN = STRLEN( T_MONTH ).
      T_STR = T_LEN - 2.
      T_MONTH = T_MONTH+T_STR(2).

      CONCATENATE P_MJAHR S_MONAT-LOW '01' INTO L_DATE_START.

      S_BUDAT-SIGN = 'I'.
      S_BUDAT-OPTION = 'BT'.
      CONCATENATE P_MJAHR S_MONAT-LOW '01' INTO S_BUDAT-LOW.

      CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
        EXPORTING
          I_DATE = L_DATE_START
        IMPORTING
          E_DATE = L_DATE_END.

      S_BUDAT-HIGH = L_DATE_END.
      APPEND S_BUDAT.

    ENDIF.
    IF S_MONAT-HIGH IS NOT INITIAL.
      CONCATENATE '00000' S_MONAT-HIGH INTO T_MONTH.
      T_LEN = STRLEN( T_MONTH ).
      T_STR = T_LEN - 2.
      T_MONTH = T_MONTH+T_STR(2).

      CONCATENATE P_MJAHR S_MONAT-HIGH '01' INTO L_DATE_START.

      S_BUDAT-SIGN = 'I'.
      S_BUDAT-OPTION = 'BT'.
      CONCATENATE P_MJAHR S_MONAT-HIGH '01' INTO S_BUDAT-HIGH.

      CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
        EXPORTING
          I_DATE = L_DATE_START
        IMPORTING
          E_DATE = L_DATE_END.

      S_BUDAT-HIGH = L_DATE_END.
      APPEND S_BUDAT.
    ENDIF.
  ENDIF.

* - show the current activity and the progress
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = TEXT-003.     "Reading MM documents

  SELECT
     VBRP~WERKS AS WERKS
     VBRK~POPER AS MONAT
     VBRP~FKLMG AS MENGE
     VBRP~MATNR AS MATNR
     VBRK~KUNRG AS KUNNR
     VBRP~MEINS AS MEINS
     VBRK~FKDAT AS BUDAT
     VBRK~WAERK AS WAERS
     VBRP~VBELN
     VBRP~POSNR
     VBRP~ARKTX AS MAKTX
     VBRP~MATKL
     VBRP~KURSK
     VBRP~NETWR
     VBRK~WAERK AS WAERK2
     VBRP~WERKS
     VBRK~KURRF_DAT
     VBRP~WAVWR "标准成本
     MARA~PRDHA
     VBRP~AUBEL
     VBRP~AUPOS
     VBRP~AUTYP
     VBRP~KZWI2
     VBRP~KZWI3
     VBRP~VGBEL
     VBRP~VGPOS
     VBRK~BUKRS
     VBRP~PAOBJNR  "获利字段
  INTO CORRESPONDING FIELDS OF TABLE I_TAB
*出具发票:抬头数据
  FROM VBRK
*出具发票:项数据
  INNER JOIN VBRP ON VBRK~VBELN = VBRP~VBELN
*常规物料数据
  INNER JOIN MARA ON MARA~MATNR = VBRP~MATNR

  WHERE
*物料
        VBRP~MATNR IN S_MATNR AND
*工厂
        VBRP~WERKS IN S_WERKS AND
*客户
        VBRK~KUNRG IN S_KUNNR AND
*出具发票凭证被取消
        VBRK~FKSTO = '' AND
*已取消的出具发票凭证编号
        VBRK~SFAKN = '' AND
*转到会计的状态
        VBRK~RFBSK IN S_RFBSK AND   " C 过账凭证已经建立
*产品层次
        MARA~PRDHA IN S_PRDHA AND
*出具发票索引和打印的出具发票日期
        VBRK~FKDAT IN S_BUDAT AND
*         VBRK~FKDAT >= S_BUDAT-LOW AND VBRK~FKDAT <= S_BUDAT-HIGH AND
*公司代码
        VBRK~BUKRS IN S_BUKRS
*退货项目
*      AND  VBRP~SHKZG <> 'X'
    .

*  DELETE I_TAB WHERE AUTYP = 'V'.

*验证 : FAGLFLEXA
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATA : LV_BELNR TYPE BELNR_D.

* show the current activity and the progress
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = TEXT-005.       "Preparing list output

*----------------------------------------删除发货数量为0的记录
*  DELETE I_TAB WHERE MENGE <= 0.

  "在显示报表前计算所有数据(实际成本提取,销售数量/金额/汇率/标准成本 从发票中提取)
  LOOP AT I_TAB INTO WA_TAB.
    CLEAR:MBEW.
    CLEAR:CKMLCR.
    CLEAR:EBEW.

*期间
    WA_TAB-MONAT = WA_TAB-BUDAT+4(2).
*评估币别
    WA_TAB-WAERS = 'CNY'.


*    SELECT SINGLE BELNR
*      INTO LV_BELNR
*      FROM BKPF
*      WHERE GJAHR = P_MJAHR
*        AND BUKRS = WA_TAB-BUKRS
*        AND AWKEY = WA_TAB-VBELN."发票号

*    SELECT *
*      INTO CORRESPONDING FIELDS OF TABLE I_BSEG
*      FROM BSEG "会计核算凭证段
*      WHERE GJAHR = P_MJAHR
*        AND BUKRS = WA_TAB-BUKRS
*        AND BELNR = LV_BELNR
*        AND WERKS = WA_TAB-WERKS
*        AND MATNR = WA_TAB-MATNR
*        AND PAOBJNR = WA_TAB-PAOBJNR
**        AND KOART = 'S'  "总账科目
*      .

*    SELECT SINGLE PSWBT
*       INTO WA_TAB-NETWR2
*       FROM BSEG "会计核算凭证段
*       WHERE GJAHR = P_MJAHR
*         AND BUKRS = WA_TAB-BUKRS
*         AND BELNR = LV_BELNR
*         AND WERKS = WA_TAB-WERKS
*         AND MATNR = WA_TAB-MATNR
*         AND PAOBJNR = WA_TAB-PAOBJNR
*         AND KOART = 'S'  "总账科目
*         AND HKONT = '6001100001'
*       .

*扣除海运费跟保险费之后的销售收入
    REFRESH I_GLPCA.
    SELECT TSL DRCRK
      INTO CORRESPONDING FIELDS OF TABLE I_GLPCA
      FROM GLPCA "成本控制-利润中心会计:实际行项目
      WHERE REFDOCNR = WA_TAB-VBELN
        AND REFRYEAR = P_MJAHR
        AND REFDOCLN = WA_TAB-POSNR
        AND RACCT = '6001100001'
        AND MATNR = WA_TAB-MATNR
        AND WERKS = WA_TAB-WERKS
      .
    CLEAR WA_TAB-NETWR2.
    LOOP AT I_GLPCA INTO WA_GLPCA.
*      IF WA_GLPCA-DRCRK = 'H'.
*        WA_TAB-NETWR2 = WA_TAB-NETWR2 - WA_GLPCA-TSL.
*      ELSE.
*        WA_TAB-NETWR2 = WA_TAB-NETWR2 + WA_GLPCA-TSL.
*      ENDIF.
      WA_TAB-NETWR2 = WA_TAB-NETWR2 + WA_GLPCA-TSL.
    ENDLOOP.

    WA_TAB-NETWR2 = - WA_TAB-NETWR2.
*销售收入 货币净值 - 海运费跟保险费
*    WA_TAB-NETWR = WA_TAB-NETWR -  WA_TAB-KZWI2 - WA_TAB-KZWI3.
*    WA_TAB-NETWR2 = WA_TAB-NETWR.

*取单据类型的名称
    PERFORM FRM_SET_TEXT.

    "按订单库存取实际成本
    IF WA_TAB-AUTYP = 'C'.
      SELECT SINGLE *
        FROM EBEW "销售订单库存评估
        WHERE MATNR = WA_TAB-MATNR AND
              BWKEY = WA_TAB-WERKS AND
              VBELN = WA_TAB-AUBEL AND
              POSNR = WA_TAB-AUPOS.

      SELECT SINGLE *
        FROM CKMLCR "物料分类帐:期间汇总记录值
        WHERE KALNR = EBEW-KALN1  AND
              BDATJ = P_MJAHR AND
              POPER = WA_TAB-MONAT ."AND VPRSV = 'V'.
      WA_TAB-WAVWR2 = CKMLCR-PVPRS / CKMLCR-PEINH * WA_TAB-MENGE ."实际成本值
      "周期单位价格 * 价格单位
      WA_TAB-PVPRS  = CKMLCR-PVPRS / CKMLCR-PEINH ."实际成本价格
    ENDIF.

    IF WA_TAB-PVPRS <= 0 OR WA_TAB-WAVWR2 <= 0 OR WA_TAB-AUTYP <> 'C'.
      "根据PO号取SO,订单库存取实际成本
      IF WA_TAB-AUTYP = 'V'.
        CLEAR:EKKN.
        SELECT SINGLE *
          FROM EKKN "采购凭证中的帐户设置
          WHERE EBELN = WA_TAB-AUBEL AND
                EBELP = WA_TAB-AUPOS.

        IF EKKN IS NOT INITIAL.
          "销售单
          WA_TAB-SONO = EKKN-VBELN.
          "销售行
          WA_TAB-SOIT = EKKN-VBELP.
          SELECT SINGLE *
            FROM EBEW "销售订单库存评估
            WHERE MATNR = WA_TAB-MATNR AND
                  BWKEY = WA_TAB-WERKS AND
                  VBELN = WA_TAB-SONO AND
                  POSNR = WA_TAB-SOIT.

          SELECT SINGLE *
            FROM CKMLCR "物料分类帐:期间汇总记录值
            WHERE KALNR = EBEW-KALN1  AND
                  BDATJ = P_MJAHR AND
                  POPER = WA_TAB-MONAT ."AND VPRSV = 'V'.
          WA_TAB-WAVWR2 = CKMLCR-PVPRS / CKMLCR-PEINH * WA_TAB-MENGE ."实际成本值
          WA_TAB-PVPRS  = CKMLCR-PVPRS / CKMLCR-PEINH ."实际成本价格
        ENDIF.
*      ENDIF.
      ELSE.

        SELECT SINGLE *
          FROM MBEW "物料评估
          WHERE MATNR = WA_TAB-MATNR AND
                BWKEY = WA_TAB-WERKS .

        SELECT SINGLE *
          FROM CKMLCR "物料分类帐:期间汇总记录值
          WHERE KALNR = MBEW-KALN1  AND "成本估算号 - 产品成本核算
                BDATJ = P_MJAHR AND
                POPER = WA_TAB-MONAT ."AND VPRSV = 'V'.

        WA_TAB-WAVWR2 = CKMLCR-PVPRS / CKMLCR-PEINH * WA_TAB-MENGE ."实际成本值
        WA_TAB-PVPRS  = CKMLCR-PVPRS / CKMLCR-PEINH ."实际单位成本价格

      ENDIF.

    ENDIF.

    IF WA_TAB-WAERK2 <> 'CNY'.

      CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
        EXPORTING
          DATE             = WA_TAB-KURRF_DAT "换算日期
          FOREIGN_CURRENCY = WA_TAB-WAERK2 "凭证币别
          FOREIGN_AMOUNT   = WA_TAB-NETWR2 "出具发票项目的凭证货币净值
          LOCAL_CURRENCY   = 'CNY'
        IMPORTING
          LOCAL_AMOUNT     = WA_TAB-NETWR2 "本位币值
        EXCEPTIONS
          NO_RATE_FOUND    = 1
          OVERFLOW         = 2
          NO_FACTORS_FOUND = 3
          NO_SPREAD_FOUND  = 4
          DERIVED_2_TIMES  = 5
          OTHERS           = 6.

      CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
        EXPORTING
          DATE             = WA_TAB-KURRF_DAT
          FOREIGN_CURRENCY = WA_TAB-WAERK2
          FOREIGN_AMOUNT   = WA_TAB-WAVWR
          LOCAL_CURRENCY   = 'CNY'
        IMPORTING
          LOCAL_AMOUNT     = WA_TAB-WAVWR "标准成本
        EXCEPTIONS
          NO_RATE_FOUND    = 1
          OVERFLOW         = 2
          NO_FACTORS_FOUND = 3
          NO_SPREAD_FOUND  = 4
          DERIVED_2_TIMES  = 5
          OTHERS           = 6.

    ENDIF.

    MODIFY I_TAB FROM WA_TAB.
  ENDLOOP.

*-----------------------------------------------------------------
  DELETE I_TAB WHERE KUNNR = '' OR PRDHA = '' OR MATNR = ''.

  SORT I_TAB BY MONAT WERKS PRDHA KUNNR MATNR.

  LOOP AT I_TAB INTO WA_TAB .
    CLEAR:WA_VALUE.
    WA_VALUE-MONAT = WA_TAB-MONAT.
    WA_VALUE-PRDHA = WA_TAB-PRDHA.
    WA_VALUE-KUNNR = WA_TAB-KUNNR.
    WA_VALUE-MATNR = WA_TAB-MATNR.
    WA_VALUE-WERKS = WA_TAB-WERKS.
    WA_VALUE-MEINS = WA_TAB-MEINS.
    WA_VALUE-WAERS = WA_TAB-WAERS.
    WA_VALUE-VBELN = WA_TAB-VBELN.
    WA_VALUE-POSNR = WA_TAB-POSNR.
    COLLECT WA_VALUE INTO I_VALUE.
  ENDLOOP.

  LOOP AT I_VALUE INTO WA_VALUE.
    "发票号 发票行
    LOOP AT I_TAB INTO WA_TAB WHERE VBELN = WA_VALUE-VBELN
                                 AND POSNR = WA_VALUE-POSNR.

      WA_VALUE-WAVWR2 = WA_VALUE-WAVWR2 + WA_TAB-WAVWR2.  "实际成本
      WA_VALUE-WAVWR  = WA_VALUE-WAVWR + WA_TAB-WAVWR.    "标准成本

      WA_VALUE-MENGE = WA_VALUE-MENGE + WA_TAB-MENGE.    "库存单位的数量
      WA_VALUE-NETWR2 = WA_VALUE-NETWR2 + WA_TAB-NETWR2. "本位币净值

      WA_VALUE-AUBEL  = WA_TAB-AUBEL. "销售单
      WA_VALUE-AUPOS  = WA_TAB-AUPOS. "销售行
      WA_VALUE-AUTYP  = WA_TAB-AUTYP. "单据类型
      WA_VALUE-AUTYPT  = WA_TAB-AUTYPT. "类型名称
    ENDLOOP.

*价格单位
    WA_VALUE-PEINH = 100.
*总实际成本
    WA_VALUE-ZSJCB = WA_VALUE-WAVWR2.

    "销售单价 = 销售开票价值 / 销售开票数量
    IF WA_VALUE-MENGE > 0.
      WA_VALUE-KSTBW = WA_VALUE-NETWR2 / WA_VALUE-MENGE * 100"单位销售价格 = 总净值 / 总数量
      WA_VALUE-STPRS = WA_VALUE-WAVWR /  WA_VALUE-MENGE * 100"标准成本每100
      WA_VALUE-PVPRS = WA_VALUE-WAVWR2 /  WA_VALUE-MENGE * 100"实际成本每100
    ENDIF.

    DATA:LV_SJ LIKE CKMLCR-PVPRS.
    LV_SJ = WA_VALUE-PVPRS / WA_VALUE-PEINH. "单位实际成本
    WA_VALUE-DWMIS = WA_VALUE-KSTBW / 100 - LV_SJ. "单位毛利 = 销售均价 - 单位实际成本

*总毛利 = 收入 - 实际成本
    WA_VALUE-ZMLIS = WA_VALUE-NETWR2 - WA_VALUE-WAVWR2.

*毛利率 = 毛利 / 实际成本
    IF WA_VALUE-ZMLIS <> 0.
      IF WA_VALUE-NETWR2 > 0 .
        WA_VALUE-MLILU = WA_VALUE-ZMLIS / WA_VALUE-NETWR2 * 100.
*      ELSE.
*        WA_VALUE-MLILU = 0.
      ENDIF.
      WA_VALUE-MLILU_C  = WA_VALUE-MLILU.
      CONDENSE WA_VALUE-MLILU_C.
      CONCATENATE WA_VALUE-MLILU_C ' %' INTO WA_VALUE-MLILU_C SEPARATED BY ' '.
    ENDIF.

*产品层次描述
    SELECT SINGLE VTEXT
      INTO WA_VALUE-VTEXT
      FROM T179T
      WHERE PRODH = WA_VALUE-PRDHA AND
            SPRAS = '1'.

*物料描述
    SELECT SINGLE MAKTX
      INTO WA_VALUE-MAKTX
      FROM MAKT
      WHERE MATNR = WA_VALUE-MATNR.

*客户名称
    SELECT SINGLE NAME1
      INTO WA_VALUE-NAME1
      FROM KNA1
      WHERE KUNNR = WA_VALUE-KUNNR.

*标准成本 - 实际成本
    WA_VALUE-WAVWR3 = WA_VALUE-WAVWR - WA_VALUE-WAVWR2. "计算差异
*单位标准成本 - 单位实际成本
    WA_VALUE-MLILU1 = WA_VALUE-STPRS - WA_VALUE-PVPRS.  "单位差异

*总账科目
    WA_VALUE-HKONT = '6001100001'.

    MODIFY I_VALUE FROM WA_VALUE.
  ENDLOOP.
*-------------------------------------

  CLEAR:GT_SORT.
  REFRESH:GT_SORT.
  CLEAR:L_ALV_FILEDCAT.
  REFRESH:L_ALV_FILEDCAT.

  IF P_R1 = 'X'.
    PERFORM INITIAL_FIELDS USING 5 'MONAT' '期间' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'WERKS' '评估范围' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 15 'VTEXT' '产品层次描述' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 22 'MAKTX' '物料描述' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'WAERS' '评估币别' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'MEINS' '物料单位' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 13 'MENGE' '实际发货数量' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'NETWR2' '销售收入' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR' '标准成本' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR3' '差异' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR2' '实际成本' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'ZMLIS' '销售毛利' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'MLILU_C' '毛利率' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 16 'KSTBW' '平均售价(每100个)'   ''  ''  ''.
    PERFORM INITIAL_FIELDS USING 20 'STPRS' '单位标准成本(每100)' ''  ''  ''.
    PERFORM INITIAL_FIELDS USING 20 'MLILU1' '单位差异(每100)'    ''  ''  ''.
    PERFORM INITIAL_FIELDS USING 20 'PVPRS' '单位实际成本(每100)' ''  ''  ''.
    PERFORM INITIAL_FIELDS USING 10 'DWMIS' '单位毛利'            ''  ''  ''.
    PERFORM INITIAL_FIELDS USING 10 'PRDHA' '产品层次' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 6 'KUNNR' '客户编号' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 32 'NAME1' '客户名称' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'MATNR' '物料号码' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'AUBEL' '销售单' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'AUPOS' '销售行' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'AUTYP' '单据类型' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'AUTYPT' '单据类型名称' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'VBELN' '发票号' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'POSNR' '发票行' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'HKONT' '总账科目' ''  ''     ''.
  ELSEIF P_R2 = 'X'.
    PERFORM INITIAL_FIELDS USING 5 'MONAT' '期间' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'WERKS' '评估范围' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 32 'NAME1' '客户名称' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 15 'VTEXT' '产品层次描述' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 22 'MAKTX' '物料描述' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'WAERS' '评估币别' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'MEINS' '物料单位' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 13 'MENGE' '实际发货数量' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'NETWR2' '销售收入' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR' '标准成本' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR3' '差异' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'WAVWR2' '实际成本' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 18 'ZMLIS' '销售毛利' 'X'  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'MLILU_C' '毛利率' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 16 'KSTBW' '平均售价(每100个)'   ''  '' ''.
    PERFORM INITIAL_FIELDS USING 20 'STPRS' '单位标准成本(每100)' ''  '' ''.
    PERFORM INITIAL_FIELDS USING 20 'MLILU1' '单位差异(每100)'    ''  '' ''.
    PERFORM INITIAL_FIELDS USING 20 'PVPRS' '单位实际成本(每100)' ''  '' ''.
    PERFORM INITIAL_FIELDS USING 10 'DWMIS' '单位毛利'            ''  '' ''.
    PERFORM INITIAL_FIELDS USING 10 'PRDHA' '产品层次' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 6 'KUNNR' '客户编号' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'MATNR' '物料号码' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'AUBEL' '销售单' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'AUPOS' '销售行' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'AUTYP' '单据类型' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'AUTYPT' '单据类型名称' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'VBELN' '发票号' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 5 'POSNR' '发票行' ''  ''     ''.
    PERFORM INITIAL_FIELDS USING 10 'HKONT' '总账科目' ''  ''     ''.
  ENDIF.

  LOOP AT L_ALV_FILEDCAT INTO L_ALV_FILED.
    IF L_ALV_FILED-FIELDNAME = 'MEINS'.
      L_ALV_FILED-REF_FIELDNAME = 'MEINS'.
      L_ALV_FILED-REF_TABNAME = 'VBRP'.
    ENDIF.

    IF L_ALV_FILED-FIELDNAME = 'MENGE'.
      L_ALV_FILED-QFIELDNAME = 'MEINS'.
    ENDIF.
    MODIFY L_ALV_FILEDCAT FROM L_ALV_FILED.
  ENDLOOP.

*Hot spot
  FIELD-SYMBOLS: LIKE LINE OF L_ALV_FILEDCAT.
  LOOP AT L_ALV_FILEDCAT ASSIGNING .
    IF -FIELDNAME = 'VBELN'.
      -HOTSPOT   = 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.

  FIELD-SYMBOLS: LIKE LINE OF L_ALV_FILEDCAT.
  LOOP AT L_ALV_FILEDCAT ASSIGNING .
    IF -FIELDNAME = 'MATNR'.
      -HOTSPOT   = 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.

  PGM = SY-REPID.

*Layout setting
  CLEAR:I_LAYOUT.
  I_LAYOUT-GROUP_CHANGE_EDIT = 'X'.
  IF P_R1 = 'X'.
    I_LAYOUT-WINDOW_TITLEBAR = '销售毛利报表 -- 按产品层次'.
  ELSEIF P_R2 = 'X'.
    I_LAYOUT-WINDOW_TITLEBAR = '销售毛利报表 -- 按客户'.
  ENDIF.
  I_LAYOUT-DETAIL_POPUP = 'X'"双击事件
  I_LAYOUT-GET_SELINFOS = 'X'"明细显示
*  I_LAYOUT-ZEBRA = 'X'.        "斑马线
*  I_LAYOUT-NO_TOTALLINE = 'X'. "没有最后的总计行
*  I_LAYOUT-NO_SUBCHOICE = 'X'. "没可选择的子合计
*  I_LAYOUT-NO_SUBTOTALS = 'X'.

* Perform to populate ALV event
  PERFORM SUB_GET_EVENT.

*Sort condition setting
  IF P_R1 = 'X'.
    SORT I_VALUE BY MONAT WERKS PRDHA KUNNR MATNR AUBEL AUPOS VBELN POSNR.
  ELSEIF P_R2 = 'X'.
    SORT I_VALUE BY MONAT WERKS KUNNR PRDHA MATNR AUBEL AUPOS VBELN POSNR.
  ENDIF.

*分类汇总
  PERFORM ALV_DATA_GROUP .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*      I_CALLBACK_PF_STATUS_SET = 'ALV_USER_TOOLBAR'
      IT_FIELDCAT             = L_ALV_FILEDCAT
      IT_SORT                 = GT_SORT[]
      I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
      IS_LAYOUT               = I_LAYOUT
*      i_callback_top_of_page = 'USER_TOP_PAGE'
      I_CALLBACK_PROGRAM      = PGM
      IT_EVENTS               = I_EVENTS
      I_GRID_TITLE            = '销售毛利'
      I_GRID_SETTINGS         = I_GRID_SETTINGS
      I_SAVE                  = 'X'
    TABLES
      T_OUTTAB                = I_VALUE.
ENDFORM.                    " FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      Form  INITIAL_FIELDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LENTH         text
*      -->FNAME         text
*      -->TEXT          text
*      -->DO_SUM        text
*      -->COLUMN_COLOR  text
*      -->IS_ICON       text
*----------------------------------------------------------------------*
FORM INITIAL_FIELDS USING LENTH        TYPE I
                          FNAME        TYPE C
                          TEXT         TYPE C
                          DO_SUM       TYPE C
                          COLUMN_COLOR TYPE C
                          IS_ICON      TYPE C.

  L_ALV_FILED-COL_POS   = COL_POS + 1.
  L_ALV_FILED-OUTPUTLEN = LENTH.
  L_ALV_FILED-FIELDNAME = FNAME.
  L_ALV_FILED-SELTEXT_M = TEXT.
  L_ALV_FILED-DO_SUM    = DO_SUM.
  L_ALV_FILED-EMPHASIZE = COLUMN_COLOR.
  L_ALV_FILED-ICON      = IS_ICON.
  L_ALV_FILED-NO_ZERO   = 'X'.

  APPEND L_ALV_FILED TO L_ALV_FILEDCAT.
ENDFORM.                    "initial_fields
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_TEXT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_SET_TEXT.
*Domain : VBTYP
  IF WA_TAB-AUTYP = 'A'. WA_TAB-AUTYPT = '询价'ENDIF.
  IF WA_TAB-AUTYP = 'B'. WA_TAB-AUTYPT = '报价'ENDIF.
  IF WA_TAB-AUTYP = 'C'. WA_TAB-AUTYPT = '订单'ENDIF.
  IF WA_TAB-AUTYP = 'D'. WA_TAB-AUTYPT = '项目建议'ENDIF.
  IF WA_TAB-AUTYP = 'E'. WA_TAB-AUTYPT = '计划协议'ENDIF.
  IF WA_TAB-AUTYP = 'F'. WA_TAB-AUTYPT = '带有外部服务代理的计划协议 'ENDIF.
  IF WA_TAB-AUTYP = 'G'. WA_TAB-AUTYPT = '合同'ENDIF.
  IF WA_TAB-AUTYP = 'H'. WA_TAB-AUTYPT = '退货 'ENDIF.
  IF WA_TAB-AUTYP = 'I'. WA_TAB-AUTYPT = '免费订单'ENDIF.
  IF WA_TAB-AUTYP = 'J'. WA_TAB-AUTYPT = '交货'ENDIF.
  IF WA_TAB-AUTYP = 'K'. WA_TAB-AUTYPT = '贷项凭单请求'ENDIF.
  IF WA_TAB-AUTYP = 'L'. WA_TAB-AUTYPT = '借项凭单请求'ENDIF.
  IF WA_TAB-AUTYP = 'M'. WA_TAB-AUTYPT = '发票'ENDIF.
  IF WA_TAB-AUTYP = 'N'. WA_TAB-AUTYPT = '取消发票'ENDIF.
  IF WA_TAB-AUTYP = 'O'. WA_TAB-AUTYPT = '贷项凭单'ENDIF.
  IF WA_TAB-AUTYP = 'P'. WA_TAB-AUTYPT = '借方备忘录 'ENDIF.
  IF WA_TAB-AUTYP = 'Q'. WA_TAB-AUTYPT = 'WMS 传输订单'ENDIF.
  IF WA_TAB-AUTYP = 'R'. WA_TAB-AUTYPT = '货物移动'ENDIF.
  IF WA_TAB-AUTYP = 'S'. WA_TAB-AUTYPT = '贷项凭单取消'ENDIF.
  IF WA_TAB-AUTYP = 'T'. WA_TAB-AUTYPT = '定单的退货 'ENDIF.
  IF WA_TAB-AUTYP = 'U'. WA_TAB-AUTYPT = '形式发票'ENDIF.
  IF WA_TAB-AUTYP = 'V'. WA_TAB-AUTYPT = '采购订单'ENDIF.
  IF WA_TAB-AUTYP = 'W'. WA_TAB-AUTYPT = '独立需求计划 'ENDIF.
  IF WA_TAB-AUTYP = 'X'. WA_TAB-AUTYPT = '处理单位'ENDIF.
  IF WA_TAB-AUTYP = '0'. WA_TAB-AUTYPT = '主要联系人 'ENDIF.
  IF WA_TAB-AUTYP = '1'. WA_TAB-AUTYPT = '销售活动(CAS)'ENDIF.
  IF WA_TAB-AUTYP = '2'. WA_TAB-AUTYPT = '外部交易'ENDIF.
  IF WA_TAB-AUTYP = '3'. WA_TAB-AUTYPT = '发票清单'ENDIF.
  IF WA_TAB-AUTYP = '4'. WA_TAB-AUTYPT = '贷项凭单清单'ENDIF.
  IF WA_TAB-AUTYP = '5'. WA_TAB-AUTYPT = '公司间发票 'ENDIF.
  IF WA_TAB-AUTYP = '6'. WA_TAB-AUTYPT = '公司间贷项凭单 'ENDIF.
  IF WA_TAB-AUTYP = '7'. WA_TAB-AUTYPT = '发货/运货通知'ENDIF.
  IF WA_TAB-AUTYP = '8'. WA_TAB-AUTYPT = '运输'ENDIF.
  IF WA_TAB-AUTYP = 'a'. WA_TAB-AUTYPT = '装运成本'ENDIF.
  IF WA_TAB-AUTYP = 'b'. WA_TAB-AUTYPT = 'CRM 机会'ENDIF.
  IF WA_TAB-AUTYP = 'c'. WA_TAB-AUTYPT = '未校验的交付'ENDIF.
  IF WA_TAB-AUTYP = 'd'. WA_TAB-AUTYPT = '贸易合同'ENDIF.
  IF WA_TAB-AUTYP = 'e'. WA_TAB-AUTYPT = '分配表 'ENDIF.
  IF WA_TAB-AUTYP = 'g'. WA_TAB-AUTYPT = '粗加工收据(只有 IS-零售) 'ENDIF.
  IF WA_TAB-AUTYP = 'h'. WA_TAB-AUTYPT = '取消发货'ENDIF.
  IF WA_TAB-AUTYP = 'i'. WA_TAB-AUTYPT = '收货'ENDIF.
  IF WA_TAB-AUTYP = 'j'. WA_TAB-AUTYPT = 'JIT call'ENDIF.
  IF WA_TAB-AUTYP = 'p'. WA_TAB-AUTYPT = '货物移动(文档)'ENDIF.
  IF WA_TAB-AUTYP = 'r'. WA_TAB-AUTYPT = 'TD传输(仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = 's'. WA_TAB-AUTYPT = '装载确认,重过帐(仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = 't'. WA_TAB-AUTYPT = '获得    /  丢失    (仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = 'u'. WA_TAB-AUTYPT = '再进入存储(仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = 'v'. WA_TAB-AUTYPT = '数据校对(仅 IS-Oil) 'ENDIF.
  IF WA_TAB-AUTYP = 'w'. WA_TAB-AUTYPT = '预定(仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = 'x'. WA_TAB-AUTYPT = '装载确认,货物收据(仅IS-Oil)'ENDIF.
  IF WA_TAB-AUTYP = '$'. WA_TAB-AUTYPT = '(AFS)'ENDIF.

ENDFORM.                    "FRM_SET_TEXT

*&---------------------------------------------------------------------*
*&      Form  user_command5
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                  RS_SELFIELD TYPE SLIS_SELFIELD.
*显示发票
  IF RS_SELFIELD-FIELDNAME = 'VBELN'.
    SET PARAMETER ID 'VF' FIELD RS_SELFIELD-VALUE.
    CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
  ENDIF.

  IF RS_SELFIELD-FIELDNAME = 'MATNR'.
    CLEAR:L_OUT.
    CLEAR:WA_VALUE.
    READ TABLE I_VALUE INTO WA_VALUE INDEX RS_SELFIELD-TABINDEX.
    SELECT SINGLE *
      FROM VBRP "出具发票:项数据
      WHERE VBELN = WA_VALUE-VBELN AND
            POSNR = WA_VALUE-POSNR.
    IF VBRP-AUTYP = 'C'.  "销售订单
      L_OUT-MATNR = WA_VALUE-MATNR.
      L_OUT-BWKEY = WA_VALUE-WERKS.
      L_OUT-BWTAR = ''.
      L_OUT-VBELN = VBRP-AUBEL.
      L_OUT-POSNR = VBRP-AUPOS.
      L_OUT-PSPNR = '00000000'.
      L_OUT-BDATJ = P_MJAHR.
      L_OUT-POPER = WA_VALUE-MONAT.
    ELSE.
      IF VBRP-AUTYP = 'V'"采购订单
        SELECT SINGLE *
          FROM EKKN "采购凭证中的帐户设置
          WHERE EBELN = VBRP-AUBEL AND
                EBELP = VBRP-AUPOS.
        L_OUT-MATNR = WA_VALUE-MATNR.
        L_OUT-BWKEY = WA_VALUE-WERKS.
        L_OUT-BWTAR = ''.
        L_OUT-VBELN = EKKN-VBELN.
        L_OUT-POSNR = EKKN-VBELP.
        L_OUT-PSPNR = '00000000'.
        L_OUT-BDATJ = P_MJAHR.
        L_OUT-POPER = WA_VALUE-MONAT.
      ELSE"其它
        L_OUT-MATNR = WA_VALUE-MATNR.
        L_OUT-BWKEY = WA_VALUE-WERKS.
        L_OUT-BWTAR = ''.
        L_OUT-PSPNR = '00000000'.
        L_OUT-BDATJ = P_MJAHR.
        L_OUT-POPER = WA_VALUE-MONAT.
      ENDIF.

    ENDIF.
*物料帐对话控制 - CKM3
    CALL FUNCTION 'CKM8_ML_DATA_DISPLAY'
      EXPORTING
        I_MATNR = L_OUT-MATNR
        I_BWKEY = L_OUT-BWKEY
        I_BWTAR = L_OUT-BWTAR
        I_VBELN = L_OUT-VBELN
        I_POSNR = L_OUT-POSNR
        I_PSPNR = L_OUT-PSPNR
        I_BDATJ = L_OUT-BDATJ
        I_POPER = L_OUT-POPER
        I_CURTP = '10'.
  ENDIF.

ENDFORM.                    "user_command5
*&---------------------------------------------------------------------*
*&      Form  ALV_DATA_GROUP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ALV_DATA_GROUP .
  DATA :
        LS_SORT TYPE SLIS_SORTINFO_ALV.

  IF P_R1 = 'X'.
    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'MONAT'.
    LS_SORT-SPOS      = 1.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
*    LS_SORT-COMP = 'X'."没有了小按钮,直接展开
*    LS_SORT-OBLIGATORY = 'X'.
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'WERKS'.
    LS_SORT-SPOS      = 2.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'VTEXT'.
    LS_SORT-SPOS      = 3.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    LS_SORT-EXPA      = 'X'"默认显示合计
    APPEND LS_SORT TO GT_SORT.

*    CLEAR LS_SORT.
*    LS_SORT-FIELDNAME = 'NAME1'.
*    LS_SORT-SPOS      = 4.
*    LS_SORT-UP        = 'X'.
*    LS_SORT-SUBTOT    = 'X'.
*    LS_SORT-GROUP     = 'X'.
*    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'MAKTX'.
    LS_SORT-SPOS      = 4.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    LS_SORT-EXPA      = 'X'"默认显示合计
    APPEND LS_SORT TO GT_SORT.

*    CLEAR LS_SORT.
*    LS_SORT-FIELDNAME = 'HKONT'.
*    LS_SORT-SPOS      = 5.
*    LS_SORT-UP        = 'X'.
*    LS_SORT-SUBTOT    = 'X'.
*    LS_SORT-GROUP     = 'X'.
*    LS_SORT-EXPA      = 'X'. "默认显示合计
*    APPEND LS_SORT TO GT_SORT.

  ELSEIF P_R2 = 'X'.
    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'MONAT'.
    LS_SORT-SPOS      = 1.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'WERKS'.
    LS_SORT-SPOS      = 2.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'NAME1'.
    LS_SORT-SPOS      = 3.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    LS_SORT-EXPA      = 'X'"默认显示合计
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'VTEXT'.
    LS_SORT-SPOS      = 4.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    LS_SORT-EXPA      = 'X'"默认显示合计
    APPEND LS_SORT TO GT_SORT.

    CLEAR LS_SORT.
    LS_SORT-FIELDNAME = 'MAKTX'.
    LS_SORT-SPOS      = 5.
    LS_SORT-UP        = 'X'.
    LS_SORT-SUBTOT    = 'X'.
    LS_SORT-GROUP     = 'X'.
    LS_SORT-EXPA      = 'X'"默认显示合计
    APPEND LS_SORT TO GT_SORT.
  ENDIF.

ENDFORM.                    " ALV_DATA_GROUP
*&---------------------------------------------------------------------*
*&      Form  SUB_GET_EVENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_GET_EVENT .
  CONSTANTS :
          C_FORMNAME_SUBTOTAL_TEXT TYPE SLIS_FORMNAME VALUE 'SUBTOTAL_TEXT'.
*  CONSTANTS:
** Events
*  SLIS_EV_ITEM_DATA_EXPAND   TYPE SLIS_FORMNAME VALUE 'ITEM_DATA_EXPAND',
*  SLIS_EV_REPREP_SEL_MODIFY  TYPE SLIS_FORMNAME VALUE 'REPREP_SEL_MODIFY',
*  SLIS_EV_CALLER_EXIT_AT_START TYPE SLIS_FORMNAME VALUE 'CALLER_EXIT',
*  SLIS_EV_USER_COMMAND       TYPE SLIS_FORMNAME VALUE 'USER_COMMAND',
*  SLIS_EV_TOP_OF_PAGE        TYPE SLIS_FORMNAME VALUE 'TOP_OF_PAGE',
*  SLIS_EV_DATA_CHANGED       TYPE SLIS_FORMNAME VALUE 'DATA_CHANGED',
*  SLIS_EV_TOP_OF_COVERPAGE   TYPE SLIS_FORMNAME VALUE 'TOP_OF_COVERPAGE',
*  SLIS_EV_END_OF_COVERPAGE   TYPE SLIS_FORMNAME VALUE 'END_OF_COVERPAGE',
*  SLIS_EV_FOREIGN_TOP_OF_PAGE TYPE SLIS_FORMNAME
*                                         VALUE 'FOREIGN_TOP_OF_PAGE',
*  SLIS_EV_FOREIGN_END_OF_PAGE TYPE SLIS_FORMNAME
*                                         VALUE 'FOREIGN_END_OF_PAGE',
*  SLIS_EV_PF_STATUS_SET      TYPE SLIS_FORMNAME VALUE 'PF_STATUS_SET',
*  SLIS_EV_LIST_MODIFY        TYPE SLIS_FORMNAME VALUE 'LIST_MODIFY',
*  SLIS_EV_TOP_OF_LIST        TYPE SLIS_FORMNAME VALUE 'TOP_OF_LIST',
*  SLIS_EV_END_OF_PAGE        TYPE SLIS_FORMNAME VALUE 'END_OF_PAGE',
*  SLIS_EV_END_OF_LIST        TYPE SLIS_FORMNAME VALUE 'END_OF_LIST',
*  SLIS_EV_AFTER_LINE_OUTPUT  TYPE SLIS_FORMNAME VALUE 'AFTER_LINE_OUTPUT',
*  SLIS_EV_BEFORE_LINE_OUTPUT TYPE SLIS_FORMNAME VALUE
*                                                     'BEFORE_LINE_OUTPUT',
*  SLIS_EV_SUBTOTAL_TEXT      TYPE SLIS_FORMNAME VALUE 'SUBTOTAL_TEXT',
*  SLIS_EV_GROUPLEVEL_CHANGE  TYPE SLIS_FORMNAME VALUE 'GROUPLEVEL_CHANGE',
*  SLIS_EV_CONTEXT_MENU       TYPE SLIS_FORMNAME VALUE 'CONTEXT_MENU'.

  CLEAR : WA_EVENTS.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE     = 4
    IMPORTING
      ET_EVENTS       = I_EVENTS
    EXCEPTIONS
      LIST_TYPE_WRONG = 0
      OTHERS          = 0.

* Subtotal
  READ TABLE I_EVENTS  INTO WA_EVENTS
                    WITH KEY NAME = SLIS_EV_SUBTOTAL_TEXT.
  IF SY-SUBRC = 0.
    MOVE C_FORMNAME_SUBTOTAL_TEXT TO WA_EVENTS-FORM.
    MODIFY I_EVENTS FROM WA_EVENTS INDEX SY-TABIX.
  ENDIF.
ENDFORM.                    " SUB_GET_EVENT
*&---------------------------------------------------------------------*
*&      Form  subtotal_text
*&---------------------------------------------------------------------*
*       Build subtotal text
*----------------------------------------------------------------------*
*       P_total  Total
*       p_subtot_text Subtotal text info
*----------------------------------------------------------------------*
FORM SUBTOTAL_TEXT CHANGING
               P_TOTAL TYPE ANY
               P_SUBTOT_TEXT TYPE SLIS_SUBTOT_TEXT.

*  IF P_SUBTOT_TEXT-CRITERIA = 'WERKS'.
*    P_SUBTOT_TEXT-DISPLAY_TEXT_FOR_SUBTOTAL = '*'.
*  ENDIF.
ENDFORM.                    "subtotal_text

你可能感兴趣的:(程序人生,ABAPer)