有关生产订单的成本分析

 *&---------------------------------------------------------------------*
*& Report:  ZCOR11
*& Description: 成本核算报表
*& Author: 谢怀庆
*& T-CODE:ZCOR11
*&---------------------------------------------------------------------*
* Change History:                                                      *
* Ver.  SR/Project    Date       Author       Description              *
* ----- ------------- ---------- ----------   -------------------------*
* V001  Create        2009/05/05 谢怀庆       Creation                 *
*&---------------------------------------------------------------------*

REPORT   ZCOR11 MESSAGE-ID ZCO.

**-----------------------------------------------------------------------
* Global data declaration
**-----------------------------------------------------------------------
INCLUDE ZCOR11TOP.

**-----------------------------------------------------------------------
* Selection screen definition
**-----------------------------------------------------------------------
INCLUDE ZCOR11SCREEN.

**-----------------------------------------------------------------------
* sub routing
**-----------------------------------------------------------------------
INCLUDE ZCOR11F01.

INITIALIZATION.
  IF SY-DATUM+4(2) = '01'.
    P_PERIOD(4) = SY-DATUM(4) - 1.
    P_PERIOD+4(2) = '12'.
  ELSE.
    P_PERIOD = SY-DATUM(6) - 1.
  ENDIF.

START-OF-SELECTION.
  IF SY-DATUM+4(2) = '01'.
    P_PERIOD(4) = SY-DATUM(4) - 1.
    P_PERIOD+4(2) = '12'.
  ELSE.
    P_PERIOD = SY-DATUM(6) - 1.
  ENDIF.
  PERFORM GET_INITIAL_DATE.
  PERFORM GET_PRODUCTION_ORDER.
  PERFORM GET_ORDER_DETAIL.

*END-OF-SELECTION.
*  IF GT_ALV IS NOT INITIAL.
*    CLEAR:GV_PERCENTAGE.
*    GV_TEXT = '准备输出结果'.
*    PERFORM DISPLAY_GUI_STATUS
*                           USING GV_PERCENTAGE
*                                 GV_TEXT.
*    REFRESH G_ALV_LISTHEADER[].
*    PERFORM F_ALV_MODIFY_LISTHEADER .
*    REFRESH G_ALV_FIELDCAT.
*    PERFORM F_ALV_BUILD_FIELDCAT.
*
**调用ALV控件的抬头输出程序
**    PERFORM F_ALV_EVENT_TOP_OF_PAGE.
*    PERFORM F_ALV_BUILD_EVENTCAT.
*    PERFORM F_DISPLAY_ALV.
*  ELSE.
*    MESSAGE S003.
*  ENDIF.

 

 

 *&---------------------------------------------------------------------*
*& Include ZCOR10TOP                                         Report ZCOR10
*&
*&---------------------------------------------------------------------*
TABLES: AFPO,AFKO,AUFK,AFVC,AFRV,MAKT,MARA,KEKO,MSEG,MKPF,
        AFVV,PLPO,T001W,CSKT,COEP,COVP,COSP,COSS,MBEW,JEST,TJ02T,JCDS,CKIS,CKHS,KALM,AFRU,MBEWH,RSEUMOD.
************************************************************************
* TYPE : 定义数据类型
************************************************************************
TYPE-POOLS: SLIS.

************************************************************************
*用于ALV控件双击事件
DATA: G_SELECTED_FIELD_VALUE(80).
DATA: G_TABINDEX TYPE I.
*ALV控件构造时需要的参数
DATA: G_ALV_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      G_ALV_FIELDCAT_LINE LIKE LINE OF G_ALV_FIELDCAT,
      G_ALV_EVENT         TYPE SLIS_T_EVENT.


*ALV控件输出的表头
DATA: G_ALV_LISTHEADER TYPE SLIS_T_LISTHEADER.

*指定ALV控件触发TOP_OF_PAGE事件时调用的子程序
DATA: G_ALV_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME
                             VALUE 'F_ALV_EVENT_TOP_OF_PAGE'.

*指定ALV控件的显示特征
DATA : G_ALV_LAYOUT                 TYPE SLIS_LAYOUT_ALV.


*TYPES: BEGIN OF TY_ALV,
*          MANDT   TYPE MANDT, "客户端号
*          SPMON   TYPE SPMON, "月份
*          WERKS   TYPE WERKS_D, "工厂
*          AUFNR   LIKE AFKO-AUFNR,   "生产订单
*          PLNBEZ  LIKE AFKO-PLNBEZ,  "产品料号
*          GAMNG   LIKE AFKO-GAMNG,   "生产订单计划数量
*          IGMNG   LIKE AFKO-IGMNG,   "本月累计入库数量
*          PLNTY   LIKE AFKO-PLNTY,  "任务清单类型
*          PLNNR   LIKE AFKO-PLNNR,  "任务清单组码
*          PLNAL   LIKE AFKO-PLNAL,  "组计数器
*          AUFLD   LIKE AFKO-AUFLD,  "BOM展开/工艺路线转换的日期
*          WRKST   LIKE MARA-WRKST,  "产品名称
*          MEINS   TYPE MEINS,       "基本计量单位
*          MAKTX   LIKE MAKT-MAKTX,  "规格型号
*
*          KOSTL   LIKE MSEG-KOSTL,  "成本中心
*          STTXT   TYPE CHAR80,    "生产订单状态
*
*          DM_11   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(期初)
*          DM_12   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(期初)
*          DM_13   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(期初)
*          DM_14   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(期初)
*          DM_15   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "成本合计(期初)
*
*          DM_21   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(本期)
*          DM_22   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(本期)
*          DM_23   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(本期)
*          DM_24   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(本期)
*          DM_25   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "成本合计(本期)
*
*          QTY_IN  LIKE AFKO-IGMNG,  "入库数量(本月入库)
*          DM_31   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(本月入库)
*          DM_32   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(本月入库)
*          DM_33   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(本月入库)
*          DM_34   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(本月入库)
*          DM_35   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "成本合计(本月入库)
*
*          DM_UM   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "单位成本(标准成本)
*          DM_41   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(标准成本)
*          DM_42   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(标准成本)
*          DM_43   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(标准成本)
*          DM_44   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(标准成本)
*
*          QTY_WIP LIKE AFKO-IGMNG,  "数量(在制品)
*          DM_51   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(在制品)
*          DM_52   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(在制品)
*          DM_53   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(在制品)
*          DM_54   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(在制品)
*          DM_55   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "成本合计(在制品)
*
*          DM_61   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接材料(期末差异)
*          DM_62   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "直接人工(期末差异)
*          DM_63   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "制造费用(期末差异)
*          DM_64   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "委托加工费(期末差异)
*          DM_65   TYPE P DECIMALS 4, "LIKE MSEG-DMBTR,  "成本合计(期末差异)
*
*          REL     TYPE SY-DATUM,    "订单的Rel时间
*          FLAG    TYPE C, "selection mark
*          DEL     TYPE C,
*
*       END OF TY_ALV,
TYPES: TY_ALV TYPE ZPPORDER_COST,

BEGIN OF TY_COMPOENT,                 "生产材料成本核算表
   KOSTL   LIKE MSEG-KOSTL,   "成本中心
   AUFNR   LIKE AFKO-AUFNR,   "生产订单
   PLNBEZ  LIKE AFKO-PLNBEZ,  "产品料号
   MATNR   TYPE MATNR,        "物料号 - 组件
   WRKST   TYPE WRKST,        "品名
   MAKTX   TYPE MAKTX,        "物料描述(短文本) - 组件
   STTXT   TYPE CHAR80,       "生产订单状态
   MEINS   TYPE MEINS,        "单位
   QTY_USE TYPE EINME,        "实际用量
   QTY_PLAN TYPE EINME,       "计划用量
   QTY_BOM TYPE EINME,        "标准用量
   PRICE   TYPE P DECIMALS 4,        "系统单价
   COST    TYPE P DECIMALS 4,        "实际用量金额
   FLAG    TYPE C,
END OF TY_COMPOENT,

BEGIN OF TY_PRO_COST,  "生产工费成本核算表
   KOSTL   LIKE MSEG-KOSTL,   "成本中心
   AUFNR   LIKE AFKO-AUFNR,   "生产订单
   PLNBEZ  LIKE AFKO-PLNBEZ,  "产品料号
   WRKST   TYPE WRKST,        "品名
   MAKTX   TYPE MAKTX,        "物料描述(短文本) - 组件
   STTXT   TYPE CHAR80,       "生产订单状态
   MEINS   TYPE MEINS,        "单位
   S100    LIKE COEP-WTGBTR,  "实际人工作业价格
   S200    LIKE COEP-WTGBTR,  "实际费用作业价格
    J100    LIKE COEP-WTGBTR,  "计划人工作业价格
    J200    LIKE COEP-WTGBTR,  "计划费用作业价格
    SJGS    LIKE COEP-MBGBTR,  "实际工时
    COST100 LIKE COEP-WTGBTR,  "实际人工
    COST200 LIKE COEP-WTGBTR,  "实际制造费
    COST300 LIKE COEP-WTGBTR,  "实际委托加工费
   FLAG    TYPE C,
END OF TY_PRO_COST,

BEGIN OF TY_COEP,           "相关价格表结构
  AUFNR   LIKE AFKO-AUFNR,  "对象号
  OBJNR   TYPE OBJNR,
  KSTAR   LIKE COEP-KSTAR,  "成本要素
  USPOB   LIKE COEP-USPOB,  "源对象 (成本中心/作业类型)
  WTGBTR  LIKE COEP-WTGBTR, "交易货币中的总值
  MBGBTR  LIKE COEP-MBGBTR, "输入的总数量
END OF TY_COEP,

BEGIN OF TY_LIST,
   AUFNR   LIKE AFKO-AUFNR,   "生产订单
   MATNR   TYPE MATNR,        "物料号 - 组件
   QTY_USE TYPE EINME,        "实际用量
END OF TY_LIST,

BEGIN OF TY_AFVC,
   AUFNR   TYPE AUFNR, "订单号
   AUFPL   TYPE CO_AUFPL, "订单中工序的工艺路线号
   RUECK   TYPE CO_RUECK, "操作完成的确认编号
END OF TY_AFVC,

BEGIN OF TY_JCDS,
         OBJNR TYPE J_OBJNR, "对象号
         UDATE TYPE CDDATUM, "创建修改文档的数据
END OF TY_JCDS,

BEGIN OF TY_AUFNR,
  MANDT TYPE MANDT, "客户端
  AUFNR TYPE AUFNR,
  OBJNR TYPE J_OBJNR,
END OF TY_AUFNR,

BEGIN OF TY_KOSTL,
     AUFNR TYPE AUFNR, "订单号
*            PLNTY TYPE PLNTY, "任务清单类型
*            PLNNR TYPE PLNNR, "任务清单组码
     KOSTL TYPE KOSTL, "成本中心
END OF TY_KOSTL,

BEGIN OF TY_DESC,
   MATNR   TYPE MATNR,        "物料号 - 组件
   WRKST   TYPE WRKST,        "品名
   MEINS   TYPE MEINS,        "基本单位
   MAKTX   TYPE MAKTX,        "物料描述(短文本) - 组件
END OF TY_DESC,

BEGIN OF TY_RESB,
     AUFNR   TYPE AUFNR, "订单号
     RSNUM   TYPE RSNUM, "预留/相关需求的编号
     RSPOS   TYPE RSPOS, "预留/相关需求的项目编号
     MATNR   TYPE MATNR, "物料号
     WERKS   TYPE WERKS_D,"工厂
     LGORT   TYPE LGORT_D,"库存地点
     BDMNG   TYPE BDMNG,  "需求量
     MEINS   TYPE MEINS,  "基本计量单位
END OF TY_RESB,

BEGIN OF TY_MSEG,
MANDT  LIKE MSEG-MANDT, "客户端
MBLNR  LIKE MSEG-MBLNR, "物料凭证编号
BUDAT  LIKE MKPF-BUDAT, "凭证中的过帐日期
MJAHR  LIKE MSEG-MJAHR, "物料凭证年度
ZEILE  LIKE MSEG-ZEILE, "物料凭证中的项目
BWART  LIKE MSEG-BWART, "移动类型(库存管理)
XAUTO  LIKE MSEG-XAUTO,
MATNR  LIKE MSEG-MATNR,  "物料号
WERKS  LIKE MSEG-WERKS,  "工厂
SHKZG  LIKE MSEG-SHKZG,
WAERS  LIKE MSEG-WAERS,
DMBTR  LIKE MSEG-DMBTR, "按本位币计的金额
MENGE  LIKE MSEG-MENGE, "数量
MEINS  LIKE MSEG-MEINS, "货币码
KOSTL  LIKE MSEG-KOSTL,
AUFNR  LIKE MSEG-AUFNR, "订单号
SAKTO  LIKE MSEG-SAKTO, "总帐科目编号
DEL   TYPE C,
END OF TY_MSEG,

BEGIN OF TY_JEST,
MANDT TYPE MANDT,
OBJNR TYPE OBJNR,
TXT04 LIKE TJ02T-TXT04,
END OF TY_JEST.

DATA: S_OBJNR TYPE RANGE OF J_OBJNR WITH HEADER LINE,
      GV_PERCENTAGE TYPE P,
      GV_TEXT       TYPE STRING.


DATA: GV_START_DATE_1 TYPE SY-DATUM,
      GV_END_DATE_1   TYPE SY-DATUM,
      GV_START_DATE_2 TYPE SY-DATUM,
      GV_END_DATE_2   TYPE SY-DATUM,
      GV_GJAHR        TYPE GJAHR,     "截止到期初投入的年份
      GV_PERIO        TYPE AFWGO_MONTH,  "期间 -->月份
      GV_PERIO_NEW    TYPE CO_PERIO. "期间
DATA: GT_ALV   TYPE TABLE OF TY_ALV,
      GT_AUFNR TYPE TABLE OF TY_AUFNR,
      GT_JCDS  TYPE TABLE OF JCDS,
      GT_JCDS_TEMP TYPE TABLE OF JCDS,
      GT_COMPOENT TYPE TABLE OF TY_COMPOENT,
      GT_LIST TYPE TABLE OF TY_LIST WITH KEY AUFNR  MATNR,
      GT_RESB TYPE TABLE OF TY_RESB,
      GT_DESC TYPE TABLE OF TY_DESC,
      GT_MBEWH TYPE TABLE OF MBEWH,
      GT_PRO_COST TYPE TABLE OF TY_PRO_COST. 

 

 *&---------------------------------------------------------------------*
*&  包括                ZCOR11SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-T01.
PARAMETERS: P_PERIOD  LIKE  S069-SPMON  OBLIGATORY, "DEFAULT SY-DATUM(6).
            P_WERKS   LIKE T001W-WERKS OBLIGATORY DEFAULT '1000'."工厂
*SELECT-OPTIONS:
*            P_ROW     FOR RSEUMOD-TBMAXSEL .


SELECTION-SCREEN END OF BLOCK BLK1.
*选择报表类型
SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-T02 .
PARAMETERS: RB_TOTAL RADIOBUTTON GROUP R1 DEFAULT 'X',
            RB_M RADIOBUTTON GROUP R1 ,
            RB_C RADIOBUTTON GROUP R1,
            RB_CLSD RADIOBUTTON GROUP R1.
.
SELECTION-SCREEN END OF BLOCK BLK2. 

 

 

 *&---------------------------------------------------------------------*
*&  包括                ZCOR10F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  GET_INITIAL_DATE
*&---------------------------------------------------------------------*
*       得到要处理的关单时间范围
*----------------------------------------------------------------------*
FORM GET_INITIAL_DATE.
  DATA: LV_DATE TYPE SY-DATUM.

  GV_TEXT = '时间段初试使化......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.

*用于计算关单的时间
  GV_START_DATE_1+0(6) = P_PERIOD.
  GV_START_DATE_1+6(2) = '01'.
  GV_START_DATE_1 = GV_START_DATE_1 + 32.
  GV_START_DATE_1+6(2) = '01'.

  GV_END_DATE_1 = GV_START_DATE_1.
  GV_END_DATE_1 = GV_END_DATE_1 + 32.
  GV_END_DATE_1+6(2) = '01'.
  GV_END_DATE_1 =  GV_END_DATE_1 - 1.

*用于选取rel和teco的时间
  GV_START_DATE_2+0(6) = P_PERIOD.
  GV_START_DATE_2+6(2) = '01'.
  GV_END_DATE_2 = GV_START_DATE_2.
  GV_END_DATE_2 = GV_END_DATE_2 + 32.
  GV_END_DATE_2+6(2) = '01'.
  GV_END_DATE_2 =  GV_END_DATE_2 - 1.

  LV_DATE = GV_START_DATE_2.
*  LV_DATE = LV_DATE - 1.

  GV_GJAHR = LV_DATE+0(4)."截止到本期投入的年份
  GV_PERIO = LV_DATE+4(2)."期间
  CONCATENATE '0'
              GV_PERIO
              INTO GV_PERIO_NEW.
ENDFORM.                    " GET_INITIAL_DATE

*&---------------------------------------------------------------------*
*&      Form  GET_PRODUCTION_ORDER
*&---------------------------------------------------------------------*
*      选出所有相处理的订单号的对像ID列表
*----------------------------------------------------------------------*
FORM GET_PRODUCTION_ORDER .
  DATA: LT_JCDS TYPE TABLE OF JCDS.
*订单状态 Tj02t
*I0002  1 Rel  已释放
*I0045  1 TECO  技术实现
*I0046  1 CLSD  已结算

** 下个月clsd的订单
*  SELECT * INTO TABLE GT_JCDS
*                FROM JCDS
*                WHERE
*                STAT = 'I0046'
*                AND OBJNR LIKE 'OR%'
*                AND UDATE BETWEEN GV_START_DATE_1 AND GV_END_DATE_1
*                AND CHIND = 'I'  "状态更改
*                AND INACT <> 'X'. "指示符:状态未激活. "clsd
*  GT_JCDS_TEMP = GT_JCDS. "将clsd的订单先暂存入内表中
*  SORT GT_JCDS_TEMP BY OBJNR STAT.
*
** 到上个月为止已clsd的订单 - 需要排除
*  SELECT * INTO TABLE LT_JCDS
*                FROM JCDS
*                WHERE
*                STAT = 'I0046'
*                AND OBJNR LIKE 'OR%'
*                AND UDATE <= GV_END_DATE_2
*                AND CHIND = 'I'  "状态更改
*                AND INACT <> 'X'. "指示符:状态未激活. "clsd
*  SORT LT_JCDS BY OBJNR.
**截止到月底所有释放和技术关闭的订单
*  SELECT * APPENDING  TABLE GT_JCDS
*                FROM JCDS AS A
*                WHERE
*                OBJNR LIKE 'OR%'
*                AND STAT IN ('I0002','I0045')
*                AND A~UDATE <= GV_END_DATE_2
*                AND A~CHIND = 'I'  "状态更改
*                AND INACT <> 'X'. "指示符:状态未激活
*
*
*  SORT GT_JCDS BY OBJNR.
*  DELETE ADJACENT DUPLICATES FROM GT_JCDS COMPARING OBJNR.
*  IF LT_JCDS IS NOT INITIAL.
*    LOOP AT GT_JCDS INTO JCDS.
*      READ TABLE LT_JCDS TRANSPORTING NO FIELDS
*                         WITH KEY
*                         OBJNR = JCDS-OBJNR
*                         BINARY SEARCH.
*      IF SY-SUBRC = 0.
*        DELETE TABLE GT_JCDS FROM JCDS. "删除本月初为止所有clsd的单
*      ENDIF.
*    ENDLOOP.
*  ENDIF.

  GV_TEXT = '确定REL,TECO,CLSD订单......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.

*优化程序
*  SELECT * INTO TABLE GT_JCDS
*                FROM JCDS.
*  LOOP AT GT_JCDS INTO JCDS.
*    IF JCDS-OBJNR+0(2) <> 'OR' OR JCDS-INACT = 'X' OR JCDS-CHIND <> 'I'.
*      DELETE TABLE GT_JCDS FROM JCDS.
*    ELSEIF JCDS-UDATE >  GV_END_DATE_1.
*      DELETE TABLE GT_JCDS FROM JCDS.
*    ELSEIF JCDS-STAT <> 'I0046' AND JCDS-STAT <> 'I0002'  AND JCDS-STAT <> 'I0045'.
*      DELETE TABLE GT_JCDS FROM JCDS.
*    ENDIF.
*  ENDLOOP.

*  SELECT * INTO TABLE GT_JCDS
*                FROM JCDS
*                WHERE
*                OBJNR BETWEEN 'OR000000000001' AND 'OR003999999999'
*                AND STAT IN ('I0046','I0002','I0045')
*                AND UDATE <= GV_END_DATE_1
*                AND CHIND = 'I'  "状态更改
*                AND INACT <> 'X'. "指示符:状态未激活. "clsd
*优化程序
  SELECT * INTO TABLE GT_JCDS
                FROM JCDS
                WHERE
                STAT IN ('I0046','I0002','I0045')
                AND OBJNR LIKE 'OR%'
                AND UDATE <= GV_END_DATE_1
                AND CHIND = 'I'  "状态更改
                AND INACT <> 'X'"指示符:状态未激活. "clsd

  SORT GT_JCDS BY  OBJNR DESCENDING  STAT DESCENDING.
  DELETE ADJACENT DUPLICATES FROM GT_JCDS COMPARING OBJNR. "只保留最后的状态时间

*过滤掉不用处理的订单
  GV_TEXT = '过滤上月已关的订单......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  LOOP AT GT_JCDS INTO JCDS.
*    IF  JCDS-OBJNR+0(2) <> 'OR'.
*      DELETE TABLE GT_JCDS FROM JCDS. "不是生产订单号对应的对象号 -->删除
*    ELSE.
    IF JCDS-STAT <> 'I0046' AND JCDS-UDATE BETWEEN GV_START_DATE_1 AND GV_END_DATE_1."下个月才REL TECO的订单-->删除
      DELETE TABLE GT_JCDS FROM JCDS.
    ELSEIF  JCDS-STAT = 'I0046' AND  JCDS-UDATE <= GV_END_DATE_2. "上月已关的订单
      DELETE TABLE GT_JCDS FROM JCDS.
    ENDIF.
*    ENDIF.
  ENDLOOP.

*存放当月关了的订单
  GV_TEXT = '暂存本月clsd的订单......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  GT_JCDS_TEMP = GT_JCDS. "将clsd的订单先暂存入内表中
  DELETE GT_JCDS_TEMP WHERE STAT <> 'I0046' OR  UDATE NOT BETWEEN GV_START_DATE_1 AND GV_END_DATE_1.
  SORT GT_JCDS_TEMP BY OBJNR STAT.
  IF GT_JCDS IS INITIAL.
    MESSAGE I001.
    EXIT.
  ENDIF.
*  IF SY-SUBRC = 0.
*    SORT LT_JCDS BY OBJNR.
*    DELETE ADJACENT DUPLICATES FROM LT_JCDS COMPARING OBJNR.
*    LOOP AT LT_JCDS INTO JCDS.
*      S_OBJNR-SIGN = 'I'.
*      S_OBJNR-OPTION = 'EQ'.
*      S_OBJNR-LOW = JCDS-OBJNR.
*      APPEND S_OBJNR.
*    ENDLOOP.
*  ELSE.
*    MESSAGE I001.
*    EXIT.
*  ENDIF.
ENDFORM.                    " GET_PRODUCTION_ORDER
*&---------------------------------------------------------------------*
*&      Form  GET_ORDER_DETAIL
*&---------------------------------------------------------------------*
*       依据订单对像ID得到订单主数据,依据订单号得到相关的货物移动
*----------------------------------------------------------------------*
FORM GET_ORDER_DETAIL .
  DATA: LT_MSEG         TYPE TABLE OF TY_MSEG,
        LWA_MSEG        TYPE TY_MSEG,
        LT_PLPO         TYPE TABLE OF PLPO,
        LT_MSEG_QC      TYPE TABLE OF TY_MSEG, "期初投入
        LT_MSEG_BQ      TYPE TABLE OF TY_MSEG, "本期投入
        LT_MSEG_IN      TYPE TABLE OF TY_MSEG, "相关的收货数
        LT_AFRU         TYPE TABLE OF AFRU,
        LT_MSEG_IN_TEMP TYPE TABLE OF TY_MSEG, "相关的收货数
        LT_COEP         TYPE TABLE OF COEP,
        LT_COEP_TOTAL   TYPE TABLE OF COEP,
        LT_JEST         TYPE TABLE OF TY_JEST,
        LT_JEST_TEMP    TYPE TABLE OF TY_JEST,
        LT_STPO         TYPE TABLE OF STPO_API02,
        LT_STKO         TYPE TABLE OF STKO_API02,
        LV_DATUV_BI     TYPE DATUV_BI,
        LV_DATUB_BI     TYPE DATUB_BI,
        LWA_STPO        TYPE STPO_API02,
        LWA_STKO        TYPE STKO_API02,
        LWA_AUFNR       TYPE TY_AUFNR,
        LWA_JEST_TEMP   TYPE TY_JEST,
        LT_MSEG_QC_TEMP TYPE TABLE OF TY_MSEG,
        LV_COUNT        TYPE I,
        LV_CLSD         TYPE C,
        LT_KOSTL        TYPE TABLE OF TY_KOSTL,
        LWA_KOSTL       TYPE TY_KOSTL,
        LV_STANDARD     TYPE C,
        LV_STRING_TEMP  TYPE BASMN,
        LV_QTY          TYPE P DECIMALS 4,
        LV_QTY_COMPOENT TYPE P DECIMALS 4.

  FIELD-SYMBOLS: <FS_ALV> TYPE TY_ALV,
                 <FS_AUFNR> TYPE TY_AUFNR.


*找出对应的订单号
  GV_TEXT = '找出对应的订单号......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  SELECT  MANDT
          AUFNR
          OBJNR
          INTO TABLE GT_AUFNR
          FROM AUFK
          WHERE
          WERKS = P_WERKS.
  IF GT_AUFNR IS NOT INITIAL.
    SORT GT_JCDS BY OBJNR.
    LOOP AT GT_AUFNR ASSIGNING <FS_AUFNR> CASTING.
      READ TABLE GT_JCDS TRANSPORTING NO FIELDS
                          WITH KEY
                          OBJNR = <FS_AUFNR>-OBJNR
                          BINARY SEARCH.
      IF SY-SUBRC <> 0.
        DELETE TABLE GT_AUFNR FROM <FS_AUFNR>.
*        <FS_AUFNR>-DEL = 'X'.
      ENDIF.
    ENDLOOP.
  ENDIF.
*  DELETE GT_AUFNR WHERE DEL = 'X'.
  IF GT_AUFNR IS INITIAL.
    MESSAGE I002.
    EXIT.
  ENDIF.

*写入数据库表 ZPPCOST_ORDER
  GV_TEXT = '将要处理的订单号写入数据库表......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  DELETE FROM ZPPCOST_ORDER.
  INSERT ZPPCOST_ORDER FROM TABLE GT_AUFNR.
  SORT GT_AUFNR BY AUFNR.

*更新释放时间
*  DATA: LT_JCDS TYPE TABLE OF TY_JCDS,
*        LWA_JCDS TYPE TY_JCDS.
** cost 12 seconds
*  SELECT  B~OBJNR
*          B~UDATE
*          INTO TABLE LT_JCDS
*          FROM ZPPCOST_ORDER AS A INNER JOIN JCDS AS B
*          ON A~OBJNR = B~OBJNR AND B~STAT = 'I0002'
*          AND INACT <> 'X'.
*  SORT LT_JCDS BY OBJNR.

* cost 11 seconds
  GV_TEXT = '查找订单主数据......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
*          MANDT   TYPE MANDT, "客户端号

  SELECT  A~MANDT
*          SPMON   TYPE SPMON, "月份
*          WERKS   TYPE WERKS_D, "工厂
          A~AUFNR     "生产订单
          A~PLNBEZ     "产品料号
          A~GAMNG     "生产订单计划数量
          A~IGMNG     "本月累计入库数量
          A~PLNTY     "任务清单类型
          A~PLNNR     "任务清单组码
          A~PLNAL     "组计数器
          A~AUFLD     "BOM展开/工艺路线转换的日期
          B~WRKST     "产品名称
          B~MEINS     "基本计量单位
          C~MAKTX     "规格型号
          INTO CORRESPONDING FIELDS OF TABLE GT_ALV
          FROM ZPPCOST_ORDER AS D INNER JOIN AFKO AS A
          ON D~AUFNR = A~AUFNR INNER JOIN MARA AS B
          ON A~PLNBEZ = B~MATNR INNER JOIN MAKT AS C
          ON B~MATNR = C~MATNR AND C~SPRAS = 1.

  IF GT_ALV IS INITIAL.
    MESSAGE I002.
    EXIT.
  ENDIF.
  IF RB_C = 'X'.
    PERFORM GET_INDIRECT_COST.   "得到间接费用报表
    EXIT.
  ENDIF.
* cost 7 seconds
  GV_TEXT = '订单的相关货物移动......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  SELECT   A~MANDT    "客户端
           A~MBLNR    "物料凭证编号
           B~BUDAT    "凭证中的过帐日期
           A~MJAHR    "物料凭证年度
           A~ZEILE    "物料凭证中的项目
           A~BWART
           A~XAUTO
           A~MATNR
           A~WERKS
           A~SHKZG
           A~WAERS
           A~DMBTR
           A~MENGE
           A~MEINS
           A~KOSTL
           A~AUFNR    "订单号
           A~SAKTO    "总帐科目编号
           INTO TABLE LT_MSEG
           FROM ZPPCOST_ORDER AS D INNER JOIN MSEG AS A
           ON D~AUFNR = A~AUFNR INNER JOIN MKPF AS B
           ON A~MBLNR = B~MBLNR
           WHERE
           A~BWART IN ('101','102','122','261','262')
           AND B~BUDAT <= GV_END_DATE_2.

*更新订单状态 - cost 4 seconds
  GV_TEXT = '确认订单状态......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  SELECT  A~MANDT
          A~OBJNR
          B~TXT04
          INTO TABLE LT_JEST
          FROM ZPPCOST_ORDER AS D INNER JOIN JEST AS A
          ON D~OBJNR = A~OBJNR AND A~INACT <> 'X' INNER JOIN TJ02T AS B
          ON A~STAT = B~ISTAT AND B~SPRAS = 1.

*工作中心数据 - 2 seconds
  GV_TEXT = '订单对应的工作中心......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  SELECT A~AUFNR
         D~KOSTL
         INTO TABLE LT_KOSTL
         FROM ZPPCOST_ORDER AS A INNER JOIN AFKO AS B
         ON A~AUFNR = B~AUFNR INNER JOIN AFVC AS C
         ON B~AUFPL = C~AUFPL AND C~APLZL = 1 INNER JOIN CRCO AS D
         ON C~ARBID = D~OBJID.
*         WHERE
*         LOEKZ = ''
*         AND VORNR = '0010'.
  SORT LT_KOSTL BY AUFNR.

  IF RB_M = 'X'.  "订单物料消耗报表
    DATA: LWA_LIST TYPE TY_LIST,
          LWA_COMPOENT TYPE TY_COMPOENT.
    DELETE LT_MSEG WHERE  BWART <> '261' AND BWART <> '262'.   "只记录消耗的物料
    IF LT_MSEG IS INITIAL.
      MESSAGE I004.
      RETURN.
    ENDIF.
*对订单 - 组件号相同的物料进行汇总计算
    LOOP AT LT_MSEG INTO LWA_MSEG.
      LWA_LIST-AUFNR = LWA_MSEG-AUFNR. "生产订单
      LWA_LIST-MATNR = LWA_MSEG-MATNR."物料号 - 级件
      IF LWA_MSEG-BWART = '262'.
        LWA_LIST-QTY_USE = LWA_MSEG-MENGE * ( -1 ). "实际用量
      ELSE.
        LWA_LIST-QTY_USE = LWA_MSEG-MENGE. "实际用量
      ENDIF.
      COLLECT LWA_LIST INTO GT_LIST.
    ENDLOOP.

    SORT GT_ALV BY AUFNR.
    SORT GT_LIST BY AUFNR MATNR.
*将物料的BOM用量放入内表
    SELECT      A~AUFNR  "订单号
                C~RSNUM  "预留/相关需求的编号
                C~RSPOS  "预留/相关需求的项目编号
                C~MATNR  "物料号
                C~WERKS  "工厂
                C~LGORT  "库存地点
                C~BDMNG  "需求量
                C~MEINS  "基本计量单位
                INTO TABLE GT_RESB
                FROM ZPPCOST_ORDER AS A INNER JOIN AFKO AS B
                ON A~AUFNR = B~AUFNR INNER JOIN RESB AS C
                ON B~RSNUM  = C~RSNUM AND C~XLOEK = ''.
    SORT GT_RESB BY AUFNR MATNR.

*将组件的描述及品名写入内表
    SELECT  A~MATNR  "物料号 - 组件
            A~WRKST   "品名
            A~MEINS   "基本计量单位
            B~MAKTX   "物料描述(短文本) - 组件
            INTO TABLE GT_DESC
            FROM MARA AS A INNER JOIN MAKT AS B
            ON A~MATNR = B~MATNR AND B~SPRAS = 1
            FOR ALL ENTRIES IN LT_MSEG
            WHERE
            A~MATNR = LT_MSEG-MATNR.
    SORT GT_DESC BY MATNR.
*得到价格内表
    SELECT * INTO TABLE GT_MBEWH
             FROM MBEWH
             FOR ALL ENTRIES IN LT_MSEG
             WHERE
             MATNR = LT_MSEG-MATNR
             AND BWKEY = LT_MSEG-WERKS
             AND ( ( LFGJA < GV_GJAHR ) OR ( LFGJA = GV_GJAHR AND LFMON <= GV_PERIO ) ).

    SORT GT_MBEWH BY MATNR DESCENDING LFGJA DESCENDING LFMON DESCENDING.
    DELETE ADJACENT DUPLICATES FROM GT_MBEWH COMPARING MATNR.
    SORT GT_MBEWH BY MATNR.
    LOOP AT GT_LIST INTO LWA_LIST.
*更新 成本中心 KOSTL
      AT NEW AUFNR.
        FREE:LT_STPO,LT_STKO.
        CLEAR:LWA_STKO.
        READ TABLE GT_ALV ASSIGNING <FS_ALV>
                          WITH KEY
                          AUFNR = LWA_LIST-AUFNR
                          BINARY SEARCH.
        LWA_COMPOENT-AUFNR = LWA_LIST-AUFNR. "订单号
        LWA_COMPOENT-PLNBEZ = <FS_ALV>-PLNBEZ."订单物料
        READ TABLE LT_KOSTL INTO LWA_KOSTL
                                  WITH KEY
                                  AUFNR = LWA_LIST-AUFNR
                                  BINARY SEARCH.
        IF SY-SUBRC = 0.
          LWA_COMPOENT-KOSTL = LWA_KOSTL-KOSTL.   "成本中心
        ENDIF.
*
*        READ TABLE GT_AUFNR INTO LWA_AUFNR
*                        WITH KEY
*                        AUFNR = LWA_COMPOENT-AUFNR
*                        BINARY SEARCH.
*
*        READ TABLE LT_JCDS INTO LWA_JCDS
*                           WITH KEY
*                           OBJNR = LWA_AUFNR-OBJNR
*                           BINARY SEARCH.

*        IF SY-SUBRC = 0.

        LV_DATUV_BI = <FS_ALV>-AUFLD.     "BOM展开/工艺路线转换的日期.
        LV_DATUB_BI = <FS_ALV>-AUFLD.
*BOM标准用量
        CALL FUNCTION 'CSAP_MAT_BOM_READ'
          EXPORTING
            MATERIAL    = LWA_COMPOENT-PLNBEZ
            PLANT       = P_WERKS
            BOM_USAGE   = '1'
            ALTERNATIVE = '1'
            VALID_FROM  = LV_DATUB_BI
            VALID_TO    = LV_DATUB_BI
          TABLES
            T_STPO      = LT_STPO
            T_STKO      = LT_STKO
          EXCEPTIONS
            ERROR       = 1
            OTHERS      = 2"CS_WHERE_USED_MAT
        READ TABLE LT_STKO INTO LWA_STKO INDEX 1.
        REPLACE ',' IN LWA_STKO-BASE_QUAN WITH ' ' IN CHARACTER MODE.
        CONDENSE LWA_STKO-BASE_QUAN NO-GAPS.
        LV_STRING_TEMP = LWA_STKO-BASE_QUAN.
*        ENDIF.

*更新订单状态
        CLEAR:LT_JEST_TEMP.
        READ TABLE GT_AUFNR INTO LWA_AUFNR
                            WITH KEY
                            AUFNR = <FS_ALV>-AUFNR
                            BINARY SEARCH.
        IF SY-SUBRC = 0.
          LT_JEST_TEMP = LT_JEST.
          DELETE LT_JEST_TEMP WHERE OBJNR <> LWA_AUFNR-OBJNR.
          IF LT_JEST_TEMP IS NOT INITIAL.
            LOOP AT LT_JEST_TEMP INTO LWA_JEST_TEMP.
              IF SY-TABIX = 1.
                LWA_COMPOENT-STTXT = LWA_JEST_TEMP-TXT04.
              ELSE.
                CONCATENATE  LWA_COMPOENT-STTXT
                             ','
                             LWA_JEST_TEMP-TXT04
                             INTO LWA_COMPOENT-STTXT. "订单状态
              ENDIF.
            ENDLOOP.
          ENDIF.
        ENDIF.
        CONDENSE LWA_COMPOENT-STTXT.
      ENDAT.
      SELECT SINGLE A~WRKST B~MAKTX A~MEINS INTO (LWA_COMPOENT-WRKST,LWA_COMPOENT-WRKST,LWA_COMPOENT-MEINS )
                    FROM MARA AS A INNER JOIN MAKT AS B
                    ON A~MATNR = B~MATNR AND B~SPRAS = '1'
                    WHERE A~MATNR = LWA_LIST-MATNR.
      LWA_COMPOENT-QTY_USE = LWA_LIST-QTY_USE."实际用量
      PERFORM GET_MTL_BOM USING LWA_LIST-AUFNR
                                LWA_LIST-MATNR
                          CHANGING
                                LWA_COMPOENT-QTY_PLAN.  "计划用量

      READ TABLE LT_STPO INTO LWA_STPO
                         WITH KEY
                         COMPONENT = LWA_LIST-MATNR.
      CLEAR:LWA_COMPOENT-QTY_BOM.
      IF SY-SUBRC = 0.
        REPLACE ',' IN LWA_STPO-COMP_QTY WITH ' ' IN CHARACTER MODE.
        CONDENSE LWA_STPO-COMP_QTY NO-GAPS.
        LV_QTY_COMPOENT = LWA_STPO-COMP_QTY.
        LWA_COMPOENT-QTY_BOM =  LV_QTY_COMPOENT / LV_STRING_TEMP.
      ENDIF.

*      LWA_COMPOENT-QTY_BOM = LWA_COMPOENT-QTY_PLAN.    "标准用量

      PERFORM GET_MTL_BASIC USING LWA_LIST-MATNR
                            CHANGING  LWA_COMPOENT-WRKST   "品名
                                      LWA_COMPOENT-MAKTX   "物料描述(短文本) - 组件
                                      LWA_COMPOENT-MEINS.  "单位
      LWA_COMPOENT-MATNR = LWA_LIST-MATNR.               "物料号 - 组件

      PERFORM GET_PRICE USING LWA_LIST-MATNR
                        CHANGING LWA_COMPOENT-PRICE.     "系统单价

      LWA_COMPOENT-COST =  LWA_COMPOENT-QTY_USE *  LWA_COMPOENT-PRICE."实际用量金额
      PERFORM SKIP_LEADING_ZERO CHANGING LWA_COMPOENT-AUFNR
                                         LWA_COMPOENT-MATNR
                                         LWA_COMPOENT-KOSTL.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
        EXPORTING
          INPUT  = LWA_COMPOENT-PLNBEZ "物料号
        IMPORTING
          OUTPUT = LWA_COMPOENT-PLNBEZ.

      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          INPUT  = LWA_COMPOENT-MEINS
        IMPORTING
          OUTPUT = LWA_COMPOENT-MEINS.

      APPEND LWA_COMPOENT TO GT_COMPOENT.

    ENDLOOP.
    SORT GT_COMPOENT BY AUFNR MATNR.
    EXIT.
  ENDIF.


*期初投入 及收货
  GV_TEXT = '订单的收入库汇总处理......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  LT_MSEG_QC = LT_MSEG.
  DELETE LT_MSEG_QC WHERE BUDAT >= GV_START_DATE_2.

*本期投入 及收货
  LT_MSEG_BQ = LT_MSEG.
  DELETE LT_MSEG_BQ WHERE BUDAT NOT BETWEEN GV_START_DATE_2 AND GV_END_DATE_2.

*所有的对订单收货和退货的记录 101 - 102
  LT_MSEG_IN = LT_MSEG.
  DELETE LT_MSEG_IN WHERE BWART <> '101' AND BWART <> '102' AND BWART <> '122' AND BUDAT < GV_START_DATE_1.


*标准价格相关数据内表
  GV_TEXT = '确认物料的标准价格......'.
  PERFORM DISPLAY_GUI_STATUS
                            USING GV_PERCENTAGE
                                  GV_TEXT.
  DATA: LV_KALNR TYPE CK_KALNR1,  " 产品成本核算号
        LV_LOSGR TYPE LOSGR,      "计划批量 - >评估基数量
        LT_CKIS TYPE TABLE OF CKIS,
        LT_CKIS_TOTAL TYPE TABLE OF CKIS.
  TYPESBEGIN OF TY_KALM,
           MANDT TYPE MANDT,     "客户端
           MATNR TYPE MATNR,     "物料号
           KALNR TYPE CK_KALNR1, "成本估算号 - 产品成本核算
           LOSGR TYPE LOSGR,     "计划批量
         END OF TY_KALM.
  DATA: LT_KALM TYPE TABLE OF TY_KALM,
        LWA_KALM TYPE TY_KALM.
  SELECT  DISTINCT  MANDT  "客户端
                    MATNR  "物料号
                    KALNR  "成本估算号 - 产品成本核算
                    LOSGR  "计划批量
                    INTO TABLE LT_KALM
                    FROM KEKO "KALM
                    WHERE
                    WERKS = P_WERKS
                    AND BWVAR = 'Z10'.
  SORT GT_ALV BY PLNBEZ.
  LOOP AT LT_KALM INTO LWA_KALM.
    READ TABLE GT_ALV TRANSPORTING NO FIELDS
                       WITH KEY
                       PLNBEZ = LWA_KALM-MATNR
                       BINARY SEARCH.
    IF SY-SUBRC <> 0.
      DELETE TABLE LT_KALM FROM LWA_KALM.
    ENDIF.
  ENDLOOP.

*把物料的标准价格运算编号
  DELETE FROM ZPPCOST_MTL.
  INSERT ZPPCOST_MTL FROM TABLE LT_KALM.
  SORT GT_ALV BY AUFNR.
  SORT LT_KALM BY MATNR.

*标准价明细表 - 27 seconds
  SELECT  A~MANDT
          A~LEDNR
          A~BZOBJ
          A~KALNR  "成本估算编号
          A~KALKA
          A~KADKY
          A~TVERS
          A~BWVAR
          A~KKZMA
          A~POSNR "单位成本核算行项目编号
          A~STATP "项目状态
          A~STRGP "项目控制(为内部使用)
          A~TYPPS "项目类别
          A~KSTAR "成本要素
          A~MATNR "物料号
          A~WRTFW_KPF "对象货币记帐值
          A~FWAER     "业务货币
          A~MENGE
          A~MEEHT
          A~ARBID
          A~KOSTL
          A~SSEDD
          A~STEAS
          INTO CORRESPONDING FIELDS OF TABLE LT_CKIS_TOTAL
          FROM ZPPCOST_MTL AS B INNER JOIN CKIS AS A
          ON B~KALNR = A~KALNR. "成本估算编号

* cost 10 seconds
  SELECT  A~MANDT  "客户端
          A~KOKRS  "控制范围
          A~BELNR  "凭证编号
          A~BUZEI  "过帐行
          A~PERIO  "期间
          A~WTGBTR "交易货币中的总值
          A~WOGBTR "对象货币的总值
          A~MBGBTR "输入的总数量
          A~OBJNR  "对象号
          A~GJAHR  "会计年度
          A~WRTTP  "值类型
          A~VERSN
          A~KSTAR  "成本要素
          A~BEKNZ  "借/贷标记
          A~TWAER
          A~OWAER
          A~MEINH
          A~WERKS  "工厂
          A~MATNR  "物料号
          A~BUKRS
          INTO CORRESPONDING FIELDS OF TABLE LT_COEP_TOTAL
          FROM ZPPCOST_ORDER AS D INNER JOIN COEP AS A
          ON D~OBJNR = A~OBJNR
          AND A~KOKRS = 'EVOC'
          AND A~WRTTP = '04' "值类型 - 实际值
          WHERE
          ( A~GJAHR < GV_GJAHR OR ( A~GJAHR = GV_GJAHR AND A~PERIO <= GV_PERIO_NEW ) ).

  SORT GT_ALV BY AUFNR.
  DATA:LV_COUNT_LINES TYPE I,
       LV_LINE_MARK   TYPE I.
  DESCRIBE TABLE GT_ALV LINES LV_COUNT_LINES.
*  LV_LINE_MARK = P_ROW-HIGH + 1.
*  DELETE GT_ALV FROM LV_LINE_MARK TO LV_COUNT_LINES.
*  IF P_ROW-LOW >= 2.
*    LV_COUNT_LINES = P_ROW-LOW - 1.
*    DELETE GT_ALV FROM 1 TO LV_COUNT_LINES.
*    DESCRIBE TABLE GT_ALV LINES LV_COUNT_LINES.
*  ENDIF.
  GV_TEXT = LV_COUNT_LINES.
  CONCATENATE '订单数为:'
              GV_TEXT
              INTO
              GV_TEXT.
**  GV_TEXT = '订单对应的工作中心......'.
*  PERFORM DISPLAY_GUI_STATUS
*                            USING GV_PERCENTAGE
*                                  GV_TEXT.
*  DATA: LV_ANSWER TYPE STRING,
*        LT_SPOPLI TYPE TABLE OF SPOPLI.
*  CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
*    EXPORTING
*      TEXTLINE1          = GV_TEXT
*      TITEL              = '订单搜索结果'
*    IMPORTING
*      ANSWER             = LV_ANSWER
*    TABLES
*      T_SPOPLI           = LT_SPOPLI
*    EXCEPTIONS
*      NOT_ENOUGH_ANSWERS = 1
*      TOO_MUCH_ANSWERS   = 2
*      TOO_MUCH_MARKS     = 3.

  DATA: LV_PERCT TYPE P DECIMALS 6,
        LV_TEMP TYPE STRING.
  LOOP AT GT_ALV ASSIGNING <FS_ALV> CASTING.
    <FS_ALV>-SPMON = P_PERIOD. "月份
    <FS_ALV>-WERKS = P_WERKS.  "工厂
    GV_TEXT = '订单处理进度%比为:'.
    LV_LINE_MARK = LV_LINE_MARK + 1.
    LV_PERCT = LV_LINE_MARK * 100 / LV_COUNT_LINES.
*    GV_PERCENTAGE = LV_PERCT.
*    CONCATENATE GV_PERCENTAGE
*                '%......'
*                INTO
*                GV_PERCENTAGE.
    LV_TEMP = LV_PERCT.
    CONCATENATE GV_TEXT
                LV_TEMP
                INTO
                GV_TEXT.

    PERFORM DISPLAY_GUI_STATUS
                            USING LV_PERCT
                                  GV_TEXT.
*更新 成本中心 KOSTL
    READ TABLE LT_KOSTL INTO LWA_KOSTL
                              WITH KEY
                              AUFNR = <FS_ALV>-AUFNR
                              BINARY SEARCH.
    IF SY-SUBRC = 0.
      <FS_ALV>-KOSTL = LWA_KOSTL-KOSTL.   "成本中心
    ENDIF.
*更新订单状态
    CLEAR:LT_JEST_TEMP.
    READ TABLE GT_AUFNR INTO LWA_AUFNR
                        WITH KEY
                        AUFNR = <FS_ALV>-AUFNR
                        BINARY SEARCH.
    IF SY-SUBRC = 0.
      LT_JEST_TEMP = LT_JEST.
      DELETE LT_JEST_TEMP WHERE OBJNR <> LWA_AUFNR-OBJNR.
      IF LT_JEST_TEMP IS NOT INITIAL.
        LOOP AT LT_JEST_TEMP INTO LWA_JEST_TEMP.
          IF SY-TABIX = 1.
            <FS_ALV>-STTXT = LWA_JEST_TEMP-TXT04.
          ELSE.
            CONCATENATE  <FS_ALV>-STTXT
                         ','
                         LWA_JEST_TEMP-TXT04
                         INTO <FS_ALV>-STTXT.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDIF.
    CONDENSE <FS_ALV>-STTXT.

*更新释放时间
*    READ TABLE LT_JCDS INTO LWA_JCDS
*                       WITH KEY
*                       OBJNR = LWA_AUFNR-OBJNR
*                       BINARY SEARCH.
*    IF SY-SUBRC = 0.
*      <FS_ALV>-REL = LWA_JCDS-UDATE. "释放时间
*    ENDIF.
    <FS_ALV>-REL = <FS_ALV>-AUFLD."释放时间
*更新本月累计入库数和本用入库数
    CLEAR:<FS_ALV>-IGMNG.
    LT_MSEG_IN_TEMP = LT_MSEG_IN.
    DELETE LT_MSEG_IN_TEMP WHERE AUFNR <> <FS_ALV>-AUFNR.
    IF LT_MSEG_IN_TEMP IS NOT INITIAL.
      LOOP AT LT_MSEG_IN_TEMP INTO LWA_MSEG.
        IF LWA_MSEG-MATNR IS NOT INITIAL"对订单最终的收退货
          IF  LWA_MSEG-BUDAT < GV_START_DATE_1.
            IF LWA_MSEG-BWART = '101'.
              <FS_ALV>-IGMNG =  <FS_ALV>-IGMNG + LWA_MSEG-MENGE."本月累计收货
            ELSE.
              <FS_ALV>-IGMNG =  <FS_ALV>-IGMNG - LWA_MSEG-MENGE."本月累计收货
            ENDIF.
          ENDIF.
          IF LWA_MSEG-BUDAT BETWEEN GV_START_DATE_2 AND GV_END_DATE_2.
            IF LWA_MSEG-BWART = '101'.
              <FS_ALV>-QTY_IN = <FS_ALV>-QTY_IN + LWA_MSEG-MENGE. "本月入库数
            ELSE.
              <FS_ALV>-QTY_IN = <FS_ALV>-QTY_IN - LWA_MSEG-MENGE. "本月入库数
            ENDIF.
          ENDIF.
        ELSE.                             "对订单委外产品的收退货
          IF  LWA_MSEG-BUDAT < GV_START_DATE_2.
            IF LWA_MSEG-BWART = '101'.
              <FS_ALV>-DM_14 =  <FS_ALV>-DM_14 + LWA_MSEG-MENGE."本月前累计收货 - 委外
            ELSE.
              <FS_ALV>-DM_14 =  <FS_ALV>-DM_14 - LWA_MSEG-MENGE."本月前累计收货 - 委外
            ENDIF.
          ENDIF.
          IF LWA_MSEG-BUDAT BETWEEN GV_START_DATE_2 AND GV_END_DATE_2.
            IF LWA_MSEG-BWART = '101'.
              <FS_ALV>-DM_24 = <FS_ALV>-DM_24 + LWA_MSEG-MENGE. "本月入库数 - 委外
            ELSE.
              <FS_ALV>-DM_24 = <FS_ALV>-DM_24 - LWA_MSEG-MENGE. "本月入库数 - 委外
            ENDIF.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.

*更新标准成本价格
    CLEAR:LV_KALNR,LV_LOSGR.
    READ TABLE LT_KALM INTO LWA_KALM
                       WITH KEY
                       MATNR = <FS_ALV>-PLNBEZ
                       BINARY SEARCH.
    IF SY-SUBRC = 0.
      LV_KALNR = LWA_KALM-KALNR.
      LV_LOSGR = LWA_KALM-LOSGR.
    ENDIF.

    FREE: LT_CKIS.
    LT_CKIS = LT_CKIS_TOTAL.
    DELETE LT_CKIS WHERE KALNR <> LV_KALNR OR SSEDD > <FS_ALV>-REL.
*
*    SELECT  MANDT
*            LEDNR
*            BZOBJ
*            KALNR   "成本估算编号
*            KALKA
*            KADKY
*            TVERS
*            BWVAR
*            KKZMA
*            POSNR "单位成本核算行项目编号
*            STATP "项目状态
*            STRGP "项目控制(为内部使用)
*            TYPPS "项目类别
*            KSTAR "成本要素
*            MATNR "物料号
*            WRTFW_KPF "对象货币记帐值
*            FWAER     "业务货币
*            MENGE
*            MEEHT
*            ARBID
*            KOSTL
*            SSEDD "最迟计划完成:执行(日期
*            STEAS
*            INTO CORRESPONDING FIELDS OF TABLE LT_CKIS
*            FROM CKIS AS A
*            WHERE
*            KALNR = LV_KALNR  "成本估算编号
*            AND WERKS = P_WERKS
*            AND SSEDD <= <FS_ALV>-REL "最迟计划完成:执行(日期)
*            AND NOT EXISTS
*            ( SELECT MATNR FROM CKIS AS B WHERE B~KALNR = A~KALNR AND B~SSEDD > A~SSEDD ).

    IF LT_CKIS IS NOT INITIAL.
      LOOP AT LT_CKIS INTO CKIS.
*确认当前价格是否为要处理的标准价格
        CLEAR: LV_STANDARD.
        PERFORM CHECK_STAND_VALUE TABLES LT_CKIS
                                  USING CKIS-KALNR
                                        CKIS-SSEDD
                                  CHANGING LV_STANDARD.
        IF LV_STANDARD = 'X'.
          IF CKIS-KSTAR = '0094300001'.  "直接人工(标准成本)
            <FS_ALV>-DM_42 = CKIS-WRTFW_KPF / LV_LOSGR.
          ELSEIF CKIS-KSTAR = '0094300002'"制造费用(标准成本)
            <FS_ALV>-DM_43 = CKIS-WRTFW_KPF / LV_LOSGR.
          ELSEIF CKIS-KSTAR = '6602000300'.   "委托加工费(标准成本)
            <FS_ALV>-DM_44 = CKIS-WRTFW_KPF / LV_LOSGR.   "委托加工费(标准成本)
          ELSE.
            <FS_ALV>-DM_41 = <FS_ALV>-DM_41 +  CKIS-WRTFW_KPF. "直接材料(标准成本) - 总和
          ENDIF.
        ENDIF.
      ENDLOOP.
      <FS_ALV>-DM_41 = <FS_ALV>-DM_41 / LV_LOSGR. "直接材料(标准成本) - 单价
      <FS_ALV>-DM_UM = <FS_ALV>-DM_41 + <FS_ALV>-DM_42 + <FS_ALV>-DM_43 + <FS_ALV>-DM_44. "标准单价 - 总计
    ENDIF.

*更新期初余额 --> 直接材料投入 和 委托加工费
*    LT_MSEG_QC_TEMP = LT_MSEG_QC.
*    DELETE LT_MSEG_QC_TEMP WHERE AUFNR <> <FS_ALV>-AUFNR. "只处理当前的订单
*    LOOP AT LT_MSEG_QC_TEMP INTO LWA_MSEG.
*      IF LWA_MSEG-BWART = '261'.  "直接材料投入
*        <FS_ALV>-DM_11 = <FS_ALV>-DM_11 + LWA_MSEG-DMBTR . "累加金额
*      ELSEIF LWA_MSEG-BWART = '262'. "直接材料退回.
*        <FS_ALV>-DM_11 = <FS_ALV>-DM_11 - LWA_MSEG-DMBTR .
*      ELSEIF LWA_MSEG-BWART = '101' AND LWA_MSEG-MATNR IS INITIAL. "委外入库
*        <FS_ALV>-DM_14 = <FS_ALV>-DM_14 + LWA_MSEG-DMBTR . "累加金额
*      ELSEIF LWA_MSEG-BWART = '102' AND LWA_MSEG-MATNR IS INITIAL. "委外入库
*        <FS_ALV>-DM_14 = <FS_ALV>-DM_14 - LWA_MSEG-DMBTR . "累加金额
*      ELSEIF LWA_MSEG-BWART = '122' AND LWA_MSEG-MATNR IS INITIAL. "委外入库
*        <FS_ALV>-DM_14 = <FS_ALV>-DM_14 - LWA_MSEG-DMBTR . "累加金额
*      ENDIF.
**          DM_11   LIKE MSEG-DMBTR,  "直接材料(期初)
**          DM_12   LIKE MSEG-DMBTR,  "直接人工(期初)
**          DM_13   LIKE MSEG-DMBTR,  "制造费用(期初)
**          DM_14   LIKE MSEG-DMBTR,  "委托加工费(期初)
**          DM_15   LIKE MSEG-DMBTR,  "成本合计(期初)
*
*    ENDLOOP.
**更新期初余额 --> 直接人工 和 制造费用
*    DATA: LWA_AFVC TYPE TY_AFVC,
*          LT_AFVC_TEMP TYPE TABLE OF TY_AFVC,
*          LT_AFRU_TEMP TYPE TABLE OF AFRU,
*          LV_QC_ISM03  LIKE AFRU-ISM01,
*          LV_QC_ISM04  LIKE AFRU-ISM01,
*          LV_BQ_ISM03  LIKE AFRU-ISM01,
*          LV_BQ_ISM04  LIKE AFRU-ISM01.
*
*    CLEAR: LT_AFVC_TEMP,LT_AFRU_TEMP,LV_QC_ISM03,LV_QC_ISM04,LV_BQ_ISM03,LV_BQ_ISM04.
*    LT_AFVC_TEMP = LT_AFVC.
*    DELETE LT_AFVC_TEMP WHERE AUFNR <> <FS_ALV>-AUFNR.
*    LOOP AT LT_AFVC_TEMP INTO LWA_AFVC.  "找确认号
*      LT_AFRU_TEMP = LT_AFRU.
*      DELETE LT_AFRU_TEMP WHERE RUECK <> LWA_AFVC-RUECK. "只对当前确认号处理
*      LOOP AT LT_AFRU_TEMP INTO AFRU.
*        IF AFRU-BUDAT < GV_START_DATE_2. "期初投入
*          LV_QC_ISM03 = LV_QC_ISM03 + AFRU-ISM03. "人工费用
*          LV_QC_ISM04 = LV_QC_ISM04 + AFRU-ISM04. "制造费用
*        ELSEIF AFRU-BUDAT BETWEEN GV_START_DATE_2 AND GV_END_DATE_2. "本月投入
*          LV_BQ_ISM03 = LV_BQ_ISM03 + AFRU-ISM03. "人工费用
*          LV_BQ_ISM04 = LV_BQ_ISM04 + AFRU-ISM04. "制造费用
*        ENDIF.
*      ENDLOOP.
*    ENDLOOP.

*期初余额

    FREE:LT_COEP.
    LT_COEP = LT_COEP_TOTAL.
    DELETE  LT_COEP WHERE OBJNR <> LWA_AUFNR-OBJNR.
*    SELECT  MANDT  "客户端
*            KOKRS  "控制范围
*            BELNR  "凭证编号
*            BUZEI  "过帐行
*            PERIO  "期间
*            WTGBTR "交易货币中的总值
*            WOGBTR "对象货币的总值
*            MBGBTR "输入的总数量
*            OBJNR  "对象号
*            GJAHR  "会计年度
*            WRTTP  "值类型
*            VERSN
*            KSTAR  "成本要素
*            BEKNZ  "借/贷标记
*            TWAER
*            OWAER
*            MEINH
*            WERKS  "工厂
*            MATNR  "物料号
*            BUKRS
*            INTO CORRESPONDING FIELDS OF TABLE LT_COEP
*            FROM COEP AS A
*            WHERE
*            A~KOKRS = 'EVOC'
*            AND OBJNR = LWA_AUFNR-OBJNR
*            AND WRTTP = '04'
*            AND ( GJAHR < GV_GJAHR OR ( GJAHR = GV_GJAHR AND PERIO <= GV_PERIO ) ).
    IF LT_COEP IS NOT INITIAL.
      PERFORM GET_AMOUNT_QC_BQ    TABLES LT_COEP
                                  CHANGING
                                  <FS_ALV>-DM_11  "直接材料(期初)
                                  <FS_ALV>-DM_12  "直接人工(期初)
                                  <FS_ALV>-DM_13  "制造费用(期初)
                                  <FS_ALV>-DM_14  "委托加工费(期初)
                                  <FS_ALV>-DM_15  "成本合计(期初)
                                  <FS_ALV>-DM_21  "直接材料(本期)
                                  <FS_ALV>-DM_22  "直接人工(本期)
                                  <FS_ALV>-DM_23  "制造费用(本期)
                                  <FS_ALV>-DM_24  "委托加工费(本期)
                                  <FS_ALV>-DM_25.  "成本合计(本期)
      <FS_ALV>-DM_11 = <FS_ALV>-DM_11 - ( <FS_ALV>-IGMNG - <FS_ALV>-QTY_IN ) * <FS_ALV>-DM_41.                                  .
      <FS_ALV>-DM_12 = <FS_ALV>-DM_12 - ( <FS_ALV>-IGMNG - <FS_ALV>-QTY_IN ) * <FS_ALV>-DM_42.
      <FS_ALV>-DM_13 = <FS_ALV>-DM_13 - ( <FS_ALV>-IGMNG - <FS_ALV>-QTY_IN ) * <FS_ALV>-DM_43.
      <FS_ALV>-DM_14 = <FS_ALV>-DM_14 - ( <FS_ALV>-IGMNG - <FS_ALV>-QTY_IN ) * <FS_ALV>-DM_44.
      <FS_ALV>-DM_15 = <FS_ALV>-DM_11 +  <FS_ALV>-DM_12 + <FS_ALV>-DM_13 + <FS_ALV>-DM_14.
    ENDIF.
*更新本月入库成本.
    <FS_ALV>-DM_31 =  <FS_ALV>-QTY_IN  * <FS_ALV>-DM_41.  "直接材料(本月入库)                                .
    <FS_ALV>-DM_32 =  <FS_ALV>-QTY_IN  * <FS_ALV>-DM_42.  "直接人工(本月入库)
    <FS_ALV>-DM_33 =  <FS_ALV>-QTY_IN  * <FS_ALV>-DM_43.  "制造费用(本月入库)                                .
    <FS_ALV>-DM_34 =  <FS_ALV>-QTY_IN  * <FS_ALV>-DM_44.  "委托加工费(本月入库)
    <FS_ALV>-DM_35 =  <FS_ALV>-DM_31 + <FS_ALV>-DM_32 + <FS_ALV>-DM_33 + <FS_ALV>-DM_34.  "成本合计(本月入库)

*更新在制品 -- > 没有clsd的订单
*    CLEAR: LV_COUNT.
*    FIND FIRST OCCURRENCE OF 'CLSD' IN <FS_ALV>-STTXT MATCH COUNT LV_COUNT.

    CLEAR: LV_CLSD.
    PERFORM CHECK_CLSD_ORDER USING LWA_AUFNR-OBJNR
                             CHANGING LV_CLSD.

    IF LV_CLSD = 'X'.  "更新差异值 -- > 已 clsd的订单
      <FS_ALV>-DM_61 = <FS_ALV>-DM_11 + <FS_ALV>-DM_21 - <FS_ALV>-DM_31. "直接材料(在制品)
      <FS_ALV>-DM_62 = <FS_ALV>-DM_12 + <FS_ALV>-DM_22 - <FS_ALV>-DM_32. "直接人工(在制品)
      <FS_ALV>-DM_63 = <FS_ALV>-DM_13 + <FS_ALV>-DM_23 - <FS_ALV>-DM_33. "制造费用(在制品)
      <FS_ALV>-DM_64 = <FS_ALV>-DM_14 + <FS_ALV>-DM_24 - <FS_ALV>-DM_34. "委托加工费(在制品)
      <FS_ALV>-DM_65 = <FS_ALV>-DM_61 + <FS_ALV>-DM_62 + <FS_ALV>-DM_63 + <FS_ALV>-DM_64."成本合计(在制品)
    ELSE.  "没有clsd的订单
      <FS_ALV>-QTY_WIP =  <FS_ALV>-GAMNG - <FS_ALV>-IGMNG. "数量(在制品)
      <FS_ALV>-DM_51 = <FS_ALV>-DM_11 + <FS_ALV>-DM_21 - <FS_ALV>-DM_31. "直接材料(在制品)
      <FS_ALV>-DM_52 = <FS_ALV>-DM_12 + <FS_ALV>-DM_22 - <FS_ALV>-DM_32. "直接人工(在制品)
      <FS_ALV>-DM_53 = <FS_ALV>-DM_13 + <FS_ALV>-DM_23 - <FS_ALV>-DM_33. "制造费用(在制品)
      <FS_ALV>-DM_54 = <FS_ALV>-DM_14 + <FS_ALV>-DM_24 - <FS_ALV>-DM_34. "委托加工费(在制品)
      <FS_ALV>-DM_55 = <FS_ALV>-DM_51 + <FS_ALV>-DM_52 + <FS_ALV>-DM_53 + <FS_ALV>-DM_54."成本合计(在制品)

    ENDIF.
*skip leading zero before output
*    PERFORM SKIP_LEADING_ZERO CHANGING <FS_ALV>-AUFNR
*                                       <FS_ALV>-PLNBEZ
*                                       <FS_ALV>-KOSTL.

  ENDLOOP.
*写入数据库.
  DELETE FROM ZPPORDER_COST WHERE SPMON = P_PERIOD AND WERKS = P_WERKS. "删除此月的旧数据
  DELETE GT_ALV WHERE AUFNR = '001200000001'.
*  LOOP AT GT_ALV ASSIGNING <FS_ALV>.
  INSERT ZPPORDER_COST FROM TABLE GT_ALV ACCEPTING DUPLICATE KEYS.  "加入此月的新数据
*    INSERT ZPPORDER_COST FROM <FS_ALV>.
*  ENDLOOP.
ENDFORM.                    " GET_ORDER_DETAIL
*&---------------------------------------------------------------------*
*&      Form  F_ALV_MODIFY_LISTHEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_ALV_MODIFY_LISTHEADER .
  DATA : L_ALV_LISTHEADER_LINE LIKE LINE OF G_ALV_LISTHEADER,
         LV_MSG TYPE STRING.
  L_ALV_LISTHEADER_LINE-TYP = 'H'.
  L_ALV_LISTHEADER_LINE-KEY = ' '.
  IF RB_M = 'X'.
    LV_MSG = '生产材料成本核算表'.
  ELSEIF RB_TOTAL = 'X'.
    LV_MSG = '成本核算表'.
  ENDIF.
  APPEND L_ALV_LISTHEADER_LINE TO G_ALV_LISTHEADER.
  CONCATENATE '期间"'
              GV_START_DATE_2+0(4)
              '年'
              GV_START_DATE_2+4(2)
              '月 '
              INTO
              LV_MSG.
  APPEND L_ALV_LISTHEADER_LINE TO G_ALV_LISTHEADER.
  LV_MSG = '公司代码:1000'.
  APPEND L_ALV_LISTHEADER_LINE TO G_ALV_LISTHEADER.
ENDFORM.                    " F_ALV_MODIFY_LISTHEADER
*&---------------------------------------------------------------------*
*&      Form  F_ALV_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_ALV_BUILD_FIELDCAT .
  DATA : COL_POS TYPE I VALUE 0.
  G_ALV_LAYOUT-GET_SELINFOS      = 'X'.
  G_ALV_LAYOUT-DETAIL_POPUP      = 'X'.
  G_ALV_LAYOUT-BOX_FIELDNAME     = 'FLAG'.
  G_ALV_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  G_ALV_LAYOUT-NO_KEYFIX         = 'X'.
  G_ALV_LAYOUT-ZEBRA(1) = 'X'.                  "隔行显示不同颜色
  G_ALV_FIELDCAT_LINE-CHECKBOX = ''.

  CLEAR:  G_ALV_FIELDCAT_LINE-CHECKBOX.
  IF RB_TOTAL = 'X'.
    PERFORM F_ALV_ADD_FIELD USING  'KOSTL' '成本中心'.
    PERFORM F_ALV_ADD_FIELD USING  'AUFNR' '生产订单'.
    PERFORM F_ALV_ADD_FIELD USING  'PLNBEZ' '产品料号'.
    PERFORM F_ALV_ADD_FIELD USING  'WRKST' '产品名称'.
    PERFORM F_ALV_ADD_FIELD USING  'MAKTX' '规格型号'.
    PERFORM F_ALV_ADD_FIELD USING  'STTXT' '生产订单状态'.
    PERFORM F_ALV_ADD_FIELD USING  'GAMNG' '生产订单计划数量'.
    PERFORM F_ALV_ADD_FIELD USING  'IGMNG' '本月累计入库数量'.

    PERFORM F_ALV_ADD_FIELD USING  'DM_11' '直接材料(期初)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_12' '直接人工(期初)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_13' '制造费用(期初)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_14' '委托加工费(期初)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_15'  '成本合计(期初)'.

    PERFORM F_ALV_ADD_FIELD USING  'DM_21' '直接材料(本期)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_22' '直接人工(本期)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_23' '制造费用(本期)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_24' '委托加工费(本期)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_25'  '成本合计(本期)'.

    PERFORM F_ALV_ADD_FIELD USING  'QTY_IN' '入库数量(本月入库)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_31' '直接材料(本月入库)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_32' '直接人工(本月入库)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_33' '制造费用(本月入库)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_34' '委托加工费(本月入库)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_35'  '成本合计(本月入库)'.

    PERFORM F_ALV_ADD_FIELD USING  'DM_UM' '单位成本(标准成本)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_41' '直接材料(标准成本)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_42' '直接人工(标准成本)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_43' '制造费用(标准成本)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_44' '委托加工费(标准成本)'.

    PERFORM F_ALV_ADD_FIELD USING  'QTY_WIP' '数量(在制品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_51' '直接材料(在制品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_52' '直接人工(在制品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_53' '制造费用(在制品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_54' '委托加工费(在制品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_55'  '成本合计(在制品)'.

    PERFORM F_ALV_ADD_FIELD USING  'DM_61' '直接材料(期末差异)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_62' '直接人工(期末差异)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_63' '制造费用(期末差异)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_64' '委托加工费(期末差异品)'.
    PERFORM F_ALV_ADD_FIELD USING  'DM_65'  '成本合计(期末差异)'.
  ELSEIF RB_M = 'X'.
    PERFORM F_ALV_ADD_FIELD USING  'KOSTL' '成本中心'.
    PERFORM F_ALV_ADD_FIELD USING  'AUFNR' '生产订单'.
    PERFORM F_ALV_ADD_FIELD USING  'PLNBEZ' '产品料号'.
    PERFORM F_ALV_ADD_FIELD USING  'MATNR' '物料编号'.
    PERFORM F_ALV_ADD_FIELD USING  'WRKST' '品名'.
    PERFORM F_ALV_ADD_FIELD USING  'MAKTX' '物料描述'.
    PERFORM F_ALV_ADD_FIELD USING  'STTXT' '生产订单状态'.
    PERFORM F_ALV_ADD_FIELD USING  'MEINS' '单位'.
    PERFORM F_ALV_ADD_FIELD USING  'QTY_USE'  '实际用量'.
    PERFORM F_ALV_ADD_FIELD USING  'QTY_PLAN ' '计划用量'.
    PERFORM F_ALV_ADD_FIELD USING  'QTY_BOM' '标准用量'.
    PERFORM F_ALV_ADD_FIELD USING  'PRICE' '系统单价'.
    PERFORM F_ALV_ADD_FIELD USING  'COST' '实际用量金额  '.
  ELSEIF RB_C = 'X'.

    PERFORM F_ALV_ADD_FIELD USING  'KOSTL' '成本中心'.
    PERFORM F_ALV_ADD_FIELD USING  'AUFNR' '生产订单'.
    PERFORM F_ALV_ADD_FIELD USING  'PLNBEZ' '产品料号'.
    PERFORM F_ALV_ADD_FIELD USING  'MATNR' '物料编号'.
    PERFORM F_ALV_ADD_FIELD USING  'WRKST' '品名'.
    PERFORM F_ALV_ADD_FIELD USING  'MAKTX' '物料描述'.
    PERFORM F_ALV_ADD_FIELD USING  'STTXT' '生产订单状态'.
    PERFORM F_ALV_ADD_FIELD USING  'MEINS' '单位'.
    PERFORM F_ALV_ADD_FIELD USING  'S100'  '实际人工作业价格'.
    PERFORM F_ALV_ADD_FIELD USING  'S200 ' '实际费用作业价格'.
    PERFORM F_ALV_ADD_FIELD USING  'J100' '计划人工作业价格'.
    PERFORM F_ALV_ADD_FIELD USING  'J200' '计划费用作业价格'.
    PERFORM F_ALV_ADD_FIELD USING  'SJGS' '实际工时'.
    PERFORM F_ALV_ADD_FIELD USING  'COST100' '实际人工'.
    PERFORM F_ALV_ADD_FIELD USING  'COST200' '实际制造费'.
    PERFORM F_ALV_ADD_FIELD USING  'COST300' '实际委托加工费'.

  ENDIF.

ENDFORM.                    " F_ALV_BUILD_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  F_ALV_EVENT_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_ALV_EVENT_TOP_OF_PAGE .
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = G_ALV_LISTHEADER.
ENDFORM.                    " F_ALV_EVENT_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*&      Form  F_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_DISPLAY_ALV .
  DATA: LV_MSG TYPE LVC_TITLE.
  IF RB_TOTAL = 'X'.
    LV_MSG = '成本核算表'.
  ELSEIF RB_M = 'X'.
    LV_MSG = '生产材料成本核算表'.
  ELSEIF RB_C = 'X'.
    LV_MSG = '生产工费成本核算表'.
  ENDIF.
  CONCATENATE '公司代码:1000 期间'
              GV_START_DATE_2+0(4)
              '年'
              GV_START_DATE_2+4(2)
              '月 '
              LV_MSG
              INTO
              LV_MSG.
  IF RB_TOTAL = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING

        I_INTERFACE_CHECK        = ''
        I_CALLBACK_PROGRAM       = SY-REPID
        I_CALLBACK_USER_COMMAND  = 'F_ALV_USER_COMMAND'
        IS_LAYOUT                = G_ALV_LAYOUT
        IT_FIELDCAT              = G_ALV_FIELDCAT
*      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'   "添加的GUI
        I_SAVE                   = 'A'
*      IT_EVENTS                = G_ALV_EVENT
        I_GRID_TITLE             = LV_MSG  "NEED MODIFY
      TABLES
        T_OUTTAB                 = GT_ALV
      EXCEPTIONS
        PROGRAM_ERROR            = 1
        OTHERS                   = 2.
  ELSEIF RB_M = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_INTERFACE_CHECK        = ''
        I_CALLBACK_PROGRAM       = SY-REPID
        I_CALLBACK_USER_COMMAND  = 'F_ALV_USER_COMMAND'
        IS_LAYOUT                = G_ALV_LAYOUT
        IT_FIELDCAT              = G_ALV_FIELDCAT
*          I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'   "添加的GUI
        I_SAVE                   = 'A'
*          IT_EVENTS                = G_ALV_EVENT
        I_GRID_TITLE             = LV_MSG  "NEED MODIFY
      TABLES
        T_OUTTAB                 = GT_COMPOENT
      EXCEPTIONS
        PROGRAM_ERROR            = 1
        OTHERS                   = 2.
  ELSEIF RB_C = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_INTERFACE_CHECK        = ''
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'F_ALV_USER_COMMAND'
      IS_LAYOUT                = G_ALV_LAYOUT
      IT_FIELDCAT              = G_ALV_FIELDCAT
*          I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'   "添加的GUI
      I_SAVE                   = 'A'
*          IT_EVENTS                = G_ALV_EVENT
      I_GRID_TITLE             = LV_MSG  "NEED MODIFY
    TABLES
      T_OUTTAB                 = GT_PRO_COST
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  ENDIF.
ENDFORM.                    " F_DISPLAY_ALV
*&---------------------------------------------------------------------*
*&      Form  F_ALV_ADD_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FIELDNAME_VALUE  text
*      -->REPTEXT_DDIC     text
*----------------------------------------------------------------------*
FORM F_ALV_ADD_FIELD USING  FIELDNAME_VALUE
                             REPTEXT_DDIC.
  DATA : COL_POS TYPE I VALUE 0.

  ADD 1 TO COL_POS.
  G_ALV_FIELDCAT_LINE-EDIT = ''.
  G_ALV_FIELDCAT_LINE-COL_POS = G_ALV_FIELDCAT_LINE-COL_POS + 1.
*  G_ALV_FIELDCAT_LINE-REF_TABNAME = REF_TABNAME_VALUE.
*  G_ALV_FIELDCAT_LINE-TABNAME = 'IT_ZPAYREQ'.
*  G_ALV_FIELDCAT_LINE-REF_FIELDNAME = REF_FIELDNAME_VALUE.
  G_ALV_FIELDCAT_LINE-FIELDNAME = FIELDNAME_VALUE.
*  G_ALV_FIELDCAT_LINE-FIX_COLUMN = FIX_COLUMN.
*  G_ALV_FIELDCAT_LINE-EDIT = EDIT.
*  G_ALV_FIELDCAT_LINE-OUTPUTLEN = OUTPUTLEN_VALUE.
*  G_ALV_FIELDCAT_LINE-KEY = ''.
*  G_ALV_FIELDCAT_LINE-SELTEXT_S =
*  G_ALV_FIELDCAT_LINE-SELTEXT_L =
*  G_ALV_FIELDCAT_LINE-SELTEXT_M =
  G_ALV_FIELDCAT_LINE-REPTEXT_DDIC = REPTEXT_DDIC.

  APPEND G_ALV_FIELDCAT_LINE TO G_ALV_FIELDCAT.

ENDFORM.                    "F_ALV_ADD_FIELD
*&---------------------------------------------------------------------*
*&      Form  GET_AMOUNT_QC_BQ
*&---------------------------------------------------------------------*
*       得到期初余额相关数据 及本期投入
*----------------------------------------------------------------------*
FORM GET_AMOUNT_QC_BQ   TABLES   PT_COEP STRUCTURE COEP
                         CHANGING P_DM_11  TYPE P
                              P_DM_12  TYPE P
                              P_DM_13  TYPE P
                              P_DM_14  TYPE P
                              P_DM_15  TYPE P
                              P_DM_21  TYPE P
                              P_DM_22  TYPE P
                              P_DM_23  TYPE P
                              P_DM_24  TYPE P
                              P_DM_25  TYPE P                             .

  LOOP AT PT_COEP INTO COEP.
    IF  COEP-GJAHR = GV_GJAHR AND COEP-PERIO = GV_PERIO_NEW. "本月投入
      IF COEP-KSTAR = '6501000300' OR COEP-KSTAR = '6501000100'"原材料及半成品的投入
        P_DM_21 = P_DM_21 + COEP-WTGBTR. "直接材料(本期)
      ELSEIF  COEP-KSTAR =  '0094300001'.  "直接人工.
        P_DM_22 = P_DM_22 + COEP-WTGBTR. "直接人工(本期)
      ELSEIF  COEP-KSTAR =  '0094300002'.  "制造费用
        P_DM_23 = P_DM_23 + COEP-WTGBTR. "制造费用(本期)
      ELSEIF  COEP-KSTAR =  '6602000300'.  "委外加工费
        P_DM_24 = P_DM_24 + COEP-WTGBTR. "委托加工费(本期)
      ENDIF.
    ELSE"期初投入
      IF COEP-KSTAR = '6501000300' OR COEP-KSTAR = '6501000100'"原材料及半成品的投入
        P_DM_11 = P_DM_11 + COEP-WTGBTR. "直接材料(期初)
      ELSEIF  COEP-KSTAR =  '0094300001'.  "直接人工.
        P_DM_12 = P_DM_12 + COEP-WTGBTR. "直接人工(期初)
      ELSEIF  COEP-KSTAR =  '0094300002'.  "制造费用
        P_DM_13 = P_DM_13 + COEP-WTGBTR. "制造费用(期初)
      ELSEIF  COEP-KSTAR =  '6602000300'.  "委外加工费
        P_DM_14 = P_DM_14 + COEP-WTGBTR. "委托加工费(期初)
      ENDIF.
    ENDIF.
  ENDLOOP.

  P_DM_25 = P_DM_21 + P_DM_22 + P_DM_23 + P_DM_24."成本合计(本期)
*  <FS_ALV>-DM_11  "直接材料(期初)
*  <FS_ALV>-DM_12  "直接人工(期初)
*  <FS_ALV>-DM_13  "制造费用(期初)
*  <FS_ALV>-DM_14  "委托加工费(期初)
*  <FS_ALV>-DM_15  "成本合计(期初)
*  <FS_ALV>-DM_21  "直接材料(本期)
*  <FS_ALV>-DM_22  "直接人工(本期)
*  <FS_ALV>-DM_23  "制造费用(本期)
*  <FS_ALV>-DM_24  "委托加工费(本期)
*  <FS_ALV>-DM_25.  "成本合计(本期)
*
ENDFORM.                    " GET_AMOUNT_QC

*改变ALV的TOP_OF_PAGE事件处理过程
FORM F_ALV_BUILD_EVENTCAT .
  DATA : LS_EVENT TYPE SLIS_ALV_EVENT.
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE = 0
    IMPORTING
      ET_EVENTS   = G_ALV_EVENT.
  READ TABLE G_ALV_EVENT WITH KEY NAME =
SLIS_EV_TOP_OF_PAGE
                          INTO LS_EVENT.
  IF SY-SUBRC = 0.
    MOVE G_ALV_FORMNAME_TOP_OF_PAGE TO LS_EVENT-FORM.
    APPEND LS_EVENT TO G_ALV_EVENT.
  ENDIF.
ENDFORM.                    " F_ALV_BUILD_EVENTCAT

*&      Form  FUNCTION_EXECUTE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PF_UCOMM     text
*      -->PS_SELFIELD  text
*----------------------------------------------------------------------*
FORM F_ALV_USER_COMMAND USING PF_UCOMM LIKE SY-UCOMM
                            PS_SELFIELD TYPE SLIS_SELFIELD.
  DATA: LV_AUFNR LIKE AUFK-AUFNR.
  LV_AUFNR  =  PS_SELFIELD-VALUE.
*  G_TABINDEX = PS_SELFIELD-TABINDEX.
  CASE PF_UCOMM.
    WHEN '&IC1'.
      IF PS_SELFIELD-FIELDNAME = 'AUFNR'.

        LV_AUFNR = G_SELECTED_FIELD_VALUE.
        CALL FUNCTION 'K_KKB_KKBCS_ORDER_REPORT'
          EXPORTING
            I_AUFNR          = LV_AUFNR
          EXCEPTIONS
            OBJECT_NOT_FOUND = 1
            NO_DATA          = 2
            NO_AUTHORITY     = 3
            OTHERS           = 4.

      ENDIF.
  ENDCASE.
ENDFORM.                    "function_execute
*&---------------------------------------------------------------------*
*&      Form  CHECK_STAND_VALUE
*&---------------------------------------------------------------------*
*       确认当前价格是否为要处理的标准价格
*----------------------------------------------------------------------*
*      -->PT_CKIS  text
*      -->PV_KALNR  text
*      -->PV_SSEDD  text
*      <--PV_STANDARD  text
*----------------------------------------------------------------------*
FORM CHECK_STAND_VALUE  TABLES   PT_CKIS STRUCTURE CKIS
                        USING    PV_KALNR TYPE CK_KALNR
                                 PV_SSEDD TYPE SSEDD
                        CHANGING PV_STANDARD TYPE C.
  DATA:LT_TEMP TYPE TABLE OF CKIS WITH HEADER LINE,
       LWA_CKIS_TEMP TYPE CKIS.
  LT_TEMP[] = PT_CKIS[].
  SORT LT_TEMP BY KALNR SSEDD.
  READ TABLE LT_TEMP INTO LWA_CKIS_TEMP INDEX 1.
  IF LWA_CKIS_TEMP-KALNR = PV_KALNR AND LWA_CKIS_TEMP-SSEDD = PV_SSEDD.
    PV_STANDARD = 'X'.
  ENDIF.
ENDFORM.                    " CHECK_STAND_VALUE
*&---------------------------------------------------------------------*
*&      Form  CHECK_CLSD_ORDER
*&---------------------------------------------------------------------*
*       确认是否为clsd订单
*----------------------------------------------------------------------*
*      -->PV_OBJNR  text
*      <--PV_CLSD  text
*----------------------------------------------------------------------*
FORM CHECK_CLSD_ORDER  USING    PV_OBJNR
                       CHANGING PV_CLSD.

  READ TABLE GT_JCDS_TEMP TRANSPORTING NO FIELDS
                          WITH KEY
                          OBJNR = PV_OBJNR
                          STAT = 'I0046'
                          BINARY SEARCH.
  IF SY-SUBRC = 0.
    PV_CLSD = 'X'.
  ENDIF.

ENDFORM.                    " CHECK_CLSD_ORDER
*&---------------------------------------------------------------------*
*&      Form  GET_MTL_BOM
*&---------------------------------------------------------------------*
*      得到标准用量
*----------------------------------------------------------------------*
*      -->Pv_AUFNR  text
*      -->Pv_MATNR  text
*      <--Pv_QTY_BOM  text
*      <--PV_MEINS text
*----------------------------------------------------------------------*
FORM GET_MTL_BOM  USING    PV_AUFNR   TYPE AUFNR
                           PV_MATNR   TYPE MATNR
                  CHANGING PV_QTY_BOM TYPE EINME .
  CLEAR:PV_QTY_BOM.
  DATA: LWA_RESB TYPE TY_RESB.
  READ TABLE GT_RESB INTO LWA_RESB
                     WITH KEY
                     AUFNR = PV_AUFNR
                     MATNR = PV_MATNR
                     BINARY SEARCH.
  IF SY-SUBRC = 0.
    PV_QTY_BOM = LWA_RESB-BDMNG. "需求数
*    PV_MEINS = LWA_RESB-MEINS.   "单位
  ENDIF.
ENDFORM.                    " GET_MTL_BOM
*&---------------------------------------------------------------------*
*&      Form  GET_MTL_BASIC
*&---------------------------------------------------------------------*
*       得到品名和物料描述
*----------------------------------------------------------------------*
*      -->Pv_MATNR  text
*      <--PV_WRKST  text
*      <--PV_MAKTX  text
*----------------------------------------------------------------------*
FORM GET_MTL_BASIC  USING    PV_MATNR TYPE MATNR
                    CHANGING PV_WRKST TYPE WRKST
                             PV_MAKTX TYPE MAKTX
                             PV_MEINS TYPE MEINS  .
  DATA: LWA_DESC TYPE TY_DESC.
  CLEAR:PV_WRKST,PV_MAKTX.
  READ TABLE GT_DESC INTO LWA_DESC
                     WITH KEY
                     MATNR = PV_MATNR
                     BINARY SEARCH.
  IF SY-SUBRC = 0.
    PV_WRKST = LWA_DESC-WRKST.
    PV_MAKTX = LWA_DESC-MAKTX.
    PV_MEINS = LWA_DESC-MEINS.
  ENDIF.

ENDFORM.                    " GET_MTL_BASIC
*&---------------------------------------------------------------------*
*&      Form  GET_PRICE
*&---------------------------------------------------------------------*
*       得到指定月份的单价
*----------------------------------------------------------------------*
*      -->PV_MATNR  text
*      <--PV_PRICE  text
*----------------------------------------------------------------------*
FORM GET_PRICE  USING    PV_MATNR TYPE MATNR
                CHANGING PV_PRICE TYPE P .
  CLEAR:PV_PRICE.
  READ TABLE GT_MBEWH INTO MBEWH
                      WITH KEY
                      MATNR = PV_MATNR
                      BINARY SEARCH.
  IF SY-SUBRC = 0.
    IF MBEWH-VPRSV = 'S'.
      PV_PRICE = MBEWH-STPRS / MBEWH-PEINH. "标准价格
    ELSEIF MBEWH-VPRSV = 'V'.
      PV_PRICE = MBEWH-VERPR / MBEWH-PEINH. "移动平均价格
    ENDIF.
  ENDIF.

ENDFORM.                    " GET_PRICE
*&---------------------------------------------------------------------*
*&      Form  SKIP_LEADING_ZERO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--PV_AUFNR  text
*      <--PV_PLNBEZ  text
*      <--PV_KOSTL  text
*----------------------------------------------------------------------*
FORM SKIP_LEADING_ZERO  CHANGING PV_AUFNR  TYPE AUFNR "订单号
                                 PV_PLNBEZ TYPE MATNR "物料号
                                 PV_KOSTL  TYPE KOSTL. "成本中心
* leading zero skip
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      INPUT  = PV_AUFNR   "订单号
    IMPORTING
      OUTPUT = PV_AUFNR.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
    EXPORTING
      INPUT  = PV_PLNBEZ "物料号
    IMPORTING
      OUTPUT = PV_PLNBEZ.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      INPUT  = PV_KOSTL  "成本中心
    IMPORTING
      OUTPUT = PV_KOSTL.

ENDFORM.                    " SKIP_LEADING_ZERO

*&---------------------------------------------------------------------*
*&      Form  GET_INDIRECT_COST
*&---------------------------------------------------------------------*
*       得到间接费用报表
*----------------------------------------------------------------------*
FORM GET_INDIRECT_COST .
*       BEGIN OF TY_COEP,           "相关价格表结构
*         OBJNR   LIKE COEP-OBJNR,  "对象号
*         KSTAR   LIKE COEP-KSTAR,  "成本要素
*         USPOB   LIKE COEP-USPOB,  "源对象 (成本中心/作业类型)
*         WTGBTR  LIKE COEP-WTGBTR, "交易货币中的总值
*         MBGBTR  LIKE COEP-MBGBTR, "输入的总数量
*       END OF TY_COEP,
  DATA: LT_COEP_PLAN TYPE TABLE OF TY_COEP,
        LT_COEP_USED TYPE TABLE OF TY_COEP,
        LWA_COEP     TYPE TY_COEP,
        LWA_PRO_COST TYPE TY_PRO_COST,
        LT_JEST      TYPE TABLE OF TY_JEST,
        LT_TEMP_JEST TYPE TABLE OF TY_JEST,
        LWA_JEST_TEMP TYPE TY_JEST,
        LV_USPOB     TYPE USPOB,
        LWA_COEP_TEMP TYPE TY_COEP.

*更新订单状态 - cost 4 seconds
  SELECT DISTINCT  A~MANDT
                   A~OBJNR
                   B~TXT04
        INTO TABLE LT_JEST
        FROM ZPPCOST_ORDER AS D INNER JOIN JCDS AS A
        ON D~OBJNR = A~OBJNR AND A~UDATE <= GV_END_DATE_2 AND A~INACT <> 'X' INNER JOIN TJ02T AS B
        ON A~STAT = B~ISTAT AND B~SPRAS = 1.

  SELECT A~AUFNR
         A~OBJNR
         B~KSTAR
         B~USPOB    "源对象 (成本中心/作业类型)
         B~WTGBTR  "交易货币中的总值
         B~MBGBTR  "输入的总数量
         INTO TABLE LT_COEP_PLAN
         FROM ZPPCOST_ORDER AS A INNER JOIN COEP AS B
         ON A~OBJNR = B~OBJNR AND B~WRTTP = '04' AND B~BWSTRAT = 1 AND  B~KOKRS = 'EVOC'
         AND B~GJAHR = GV_GJAHR AND PERIO =  GV_PERIO_NEW
         WHERE
         B~KSTAR IN ('6602000300','0094300001','0094300002').

  SELECT A~AUFNR
         A~OBJNR
         B~KSTAR
         B~USPOB    "源对象 (成本中心/作业类型)
         SUM( B~WTGBTR ) AS WTGBTR  "交易货币中的总值
         SUM( B~MBGBTR ) AS MBGBTR "输入的总数量
         INTO TABLE LT_COEP_USED
         FROM ZPPCOST_ORDER AS A INNER JOIN COEP AS B
         ON A~OBJNR = B~OBJNR AND B~WRTTP = '04' AND  B~KOKRS = 'EVOC'
         AND B~GJAHR = GV_GJAHR AND PERIO =  GV_PERIO_NEW
         WHERE
         B~KSTAR IN ('6602000300','0094300001','0094300002')
         GROUP BY
         A~AUFNR A~OBJNR B~KSTAR B~USPOB.
  IF LT_COEP_USED  IS INITIAL.
    MESSAGE I005.
    RETURN.
  ELSE.
    SORT GT_ALV BY AUFNR.
    SORT LT_COEP_USED BY AUFNR.

    LOOP AT LT_COEP_USED INTO LWA_COEP WHERE KSTAR = '0094300001'.
      LT_TEMP_JEST = LT_JEST.
      DELETE LT_TEMP_JEST WHERE OBJNR <> LWA_COEP-OBJNR.
      LWA_PRO_COST-KOSTL = LWA_COEP-USPOB+6(10). "成本中心
      LWA_PRO_COST-AUFNR = LWA_COEP-AUFNR. "生产订单
      PERFORM GET_ORDER_BASIC USING LWA_COEP-AUFNR
                              CHANGING LWA_PRO_COST-PLNBEZ "产品料号
                                       LWA_PRO_COST-WRKST  "品名
                                       LWA_PRO_COST-MAKTX  "物料描述(短文本)
                                       LWA_PRO_COST-MEINS. "单位
      IF LT_TEMP_JEST IS NOT INITIAL.
        LOOP AT LT_TEMP_JEST INTO LWA_JEST_TEMP.
          IF SY-TABIX = 1.
            LWA_PRO_COST-STTXT = LWA_JEST_TEMP-TXT04.
          ELSE.
            CONCATENATE  LWA_PRO_COST-STTXT
                         ','
                         LWA_JEST_TEMP-TXT04
                         INTO LWA_PRO_COST-STTXT. "订单状态
          ENDIF.
        ENDLOOP.
      ENDIF.
      IF LWA_COEP-MBGBTR IS NOT INITIAL.
        LWA_PRO_COST-S100 = LWA_COEP-WTGBTR / LWA_COEP-MBGBTR.   "实际人工作业价格
      ENDIF.
      LV_USPOB = LWA_COEP-USPOB.
      LV_USPOB+16(3) = '200'.
      READ TABLE LT_COEP_USED INTO LWA_COEP_TEMP
                              WITH KEY
                              AUFNR = LWA_COEP-AUFNR
                              USPOB = LV_USPOB.
      IF SY-SUBRC = 0.
        LWA_PRO_COST-S200 = LWA_COEP_TEMP-WTGBTR / LWA_COEP_TEMP-MBGBTR.   "实际费用作业价格
      ENDIF.

      READ TABLE LT_COEP_PLAN INTO LWA_COEP_TEMP
                               WITH KEY
                               AUFNR = LWA_COEP-AUFNR
                               USPOB = LWA_COEP-USPOB.
      IF SY-SUBRC = 0.
        LWA_PRO_COST-J100 = LWA_COEP_TEMP-WTGBTR / LWA_COEP_TEMP-MBGBTR.   "计划人工作业价格
      ENDIF.

      READ TABLE LT_COEP_PLAN INTO LWA_COEP_TEMP
                               WITH KEY
                               AUFNR = LWA_COEP-AUFNR
                               USPOB = LV_USPOB.
      IF SY-SUBRC = 0.
        LWA_PRO_COST-J200 = LWA_COEP_TEMP-WTGBTR / LWA_COEP_TEMP-MBGBTR.   "计划费用作业价格
      ENDIF.
      LWA_PRO_COST-SJGS = LWA_COEP-MBGBTR. "实际工时
      LWA_PRO_COST-COST100 = LWA_COEP-MBGBTR * LWA_PRO_COST-S100. "实际人工
      LWA_PRO_COST-COST200 = LWA_COEP-MBGBTR * LWA_PRO_COST-S200. "实际制造费

      READ TABLE LT_COEP_USED INTO LWA_COEP_TEMP
                               WITH KEY
                               AUFNR = LWA_COEP-AUFNR
                               KSTAR = '6602000300'.
      IF SY-SUBRC = 0.
        LWA_PRO_COST-COST300 = LWA_COEP_TEMP-WTGBTR.   "实际委托加工费
      ENDIF.
      PERFORM SKIP_LEADING_ZERO CHANGING LWA_PRO_COST-AUFNR
                                   LWA_PRO_COST-PLNBEZ
                                   LWA_PRO_COST-KOSTL.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          INPUT  = LWA_PRO_COST-MEINS
        IMPORTING
          OUTPUT = LWA_PRO_COST-MEINS.

      APPEND LWA_PRO_COST TO GT_PRO_COST.
      CLEAR:LWA_PRO_COST.
    ENDLOOP.
  ENDIF.
  SORT GT_PRO_COST BY AUFNR KOSTL.
ENDFORM.                    " GET_INDIRECT_COST
*&---------------------------------------------------------------------*
*&      Form  GET_ORDER_BASIC
*&---------------------------------------------------------------------*
*      得到订单的基本信息
*----------------------------------------------------------------------*
*      -->PV_OBJNR  text
*      <--PV_AUFNR  text
*      <--PV_PLNBEZ  text
*      <--PV_WRKST  text
*      <--PV_MAKTX  text
*----------------------------------------------------------------------*
FORM GET_ORDER_BASIC  USING    PV_AUFNR TYPE AUFNR
                      CHANGING PV_PLNBEZ TYPE MATNR
                               PV_WRKST TYPE WRKST
                               PV_MAKTX TYPE MAKTX
                               PV_MEINS TYPE MEINS."单位.
  DATA: LWA_ALV TYPE TY_ALV.
  READ TABLE GT_ALV INTO LWA_ALV
                    WITH KEY
                    AUFNR = PV_AUFNR
                    BINARY SEARCH.
  IF SY-SUBRC = 0.
    PV_PLNBEZ = LWA_ALV-PLNBEZ. "订单物料
    PV_WRKST = LWA_ALV-WRKST.   "品名
    PV_MAKTX = LWA_ALV-MAKTX.   "订单物料描述
    PV_MEINS = LWA_ALV-MEINS.   "单位
  ENDIF.
ENDFORM.                    " GET_ORDER_BASIC

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_GUI_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_PERCENTAGE  text
*      -->PV_TEXT  text
*----------------------------------------------------------------------*
FORM DISPLAY_GUI_STATUS  USING    PV_PERCENTAGE TYPE P
                                  PV_TEXT TYPE STRING.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = PV_PERCENTAGE
      TEXT       = PV_TEXT.
ENDFORM.                    " DISPLAY_GUI_STATUS 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值