财务生产成本计算单

REPORT zrfi_029.

TABLES:coep,afpo.
*ALV使用定义
TYPE-POOLS:slis.
*ALV属性使用定义

DATA: gs_repid TYPE sy-repid,
      gs_fieldcat TYPE slis_t_fieldcat_alv,
      gs_layout   TYPE slis_layout_alv,
      gs_sortinfo TYPE slis_t_sortinfo_alv.

DATA: as_fieldcat TYPE slis_fieldcat_alv.

DATA:t_ztfi023 LIKE TABLE OF ztfi023 WITH HEADER LINE.

DATA: BEGIN OF itab OCCURS 0.
        include structure ztfi023.
DATA: maktx LIKE makt-maktx.
DATA:END OF itab.

DATA:itab1 LIKE TABLE OF itab WITH HEADER LINE,
     itab2 LIKE TABLE OF itab WITH HEADER LINE.

DATA:BEGIN OF t_afpo OCCURS 0,
       aufnr LIKE coep-aufnr,
     END OF t_afpo.

DATA:BEGIN OF t_matnr OCCURS 0,
       matnr LIKE mara-matnr,
       werks LIKE marc-werks,
       kdauf LIKE afpo-kdauf,
       kdpos LIKE afpo-kdpos,
     END OF t_matnr.

DATA:BEGIN OF t_kalnr OCCURS 0,
       bwkey LIKE ckmlhd-bwkey,
       matnr LIKE mara-matnr,
       vbeln LIKE ckmlhd-vbeln,
       posnr LIKE ckmlhd-posnr,
       kalnr LIKE ckmlhd-kalnr,
     END OF t_kalnr.

DATA:BEGIN OF t_coep OCCURS 0,
       werks  LIKE coep-werks,
       gjahr  LIKE coep-gjahr,
       perio  LIKE coep-perio,
       belnr  LIKE coep-belnr,
       buzei  LIKE coep-buzei,
       aufnr  LIKE coep-aufnr,
       kstar  LIKE coep-kstar,
       wtgbtr LIKE coep-wtgbtr,
       wrttp  LIKE coep-wrttp,
     END OF t_coep.

DATA:BEGIN OF t_fcml_rep_v OCCURS 0,
       kalnr_mat LIKE fcml_rep_v-kalnr_mat,
       gjahr     LIKE mlauf-gjahr,
       poper     LIKE mlauf-poper,
       belnr     LIKE coep-belnr,
       buzei     LIKE coep-buzei,
       categ     LIKE fcml_rep_v-categ,
       ptyp      LIKE fcml_rep_v-ptyp,
       psart     LIKE fcml_rep_v-psart,
       estprd    LIKE fcml_rep_v-estprd,
       lbkum     LIKE fcml_rep_v-lbkum,
       salk3     LIKE fcml_rep_v-salk3,
     END OF t_fcml_rep_v.

DATA:BEGIN OF t_mlauf OCCURS 0,
       werks LIKE mlauf-werks,
       kalnr LIKE mlauf-kalnr,
       aufnr LIKE mlauf-aufnr,
       gjahr LIKE mlauf-gjahr,
       poper LIKE mlauf-poper,
       belnr LIKE coep-belnr,
       buzei LIKE coep-buzei,
       bwart LIKE mlauf-bwart,
       menge LIKE mlauf-menge,
     END OF t_mlauf.
"DATA:t_mlauf1 LIKE TABLE OF t_mlauf WITH HEADER LINE.

DATA:BEGIN OF t_bseg OCCURS 0,
       werks LIKE bseg-werks,
       aufnr LIKE bseg-aufnr,
       gjahr LIKE bseg-gjahr,
       monat LIKE bseg-h_monat,
       belnr LIKE bseg-belnr,
       buzei LIKE bseg-buzei,
       shkzg LIKE bseg-shkzg,
       dmbtr LIKE bseg-dmbtr,
     END OF t_bseg.
DATA:t_bseg1 LIKE TABLE OF t_bseg WITH HEADER LINE.

DATA:BEGIN OF t_ckmlcr OCCURS 0,
       bwkey LIKE ckmlhd-bwkey,
       kalnr LIKE ckmlhd-kalnr,
       matnr LIKE ckmlhd-matnr,
       vbeln LIKE ckmlhd-vbeln,
       posnr LIKE ckmlhd-posnr,
       peinh LIKE ckmlcr-peinh,
       pvprs LIKE ckmlcr-pvprs,
       stprs LIKE ckmlcr-stprs,
     END OF t_ckmlcr.

DATA:s_pvprs LIKE ckmlcr-pvprs,
     s_stprs LIKE ckmlcr-stprs,
     p_gjahr LIKE coep-gjahr,
     p_perio LIKE coep-perio.

SELECTION-SCREEN:BEGIN OF BLOCK a WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:s_werks FOR coep-werks DEFAULT 'S100'.

  PARAMETERS: s_gjahr LIKE coep-gjahr DEFAULT sy-datum(4),
              s_perio LIKE coep-perio DEFAULT sy-datum+4(2) OBLIGATORY.

  SELECT-OPTIONS:s_matnr FOR coep-matnr,
                 s_aufnr FOR coep-aufnr.

SELECTION-SCREEN:END OF BLOCK a.

SELECTION-SCREEN:BEGIN OF BLOCK b WITH FRAME TITLE TEXT-002.
  PARAMETERS:    p_so AS CHECKBOX DEFAULT 'X'.

  SELECT-OPTIONS:s_vbeln FOR afpo-kdauf MODIF ID c,
                 s_posnr FOR afpo-kdpos MODIF ID c.
SELECTION-SCREEN:END OF BLOCK b.

SELECTION-SCREEN:BEGIN OF BLOCK c WITH FRAME TITLE TEXT-003.
  PARAMETERS:p_zz AS CHECKBOX,
             p_fp AS CHECKBOX.
SELECTION-SCREEN:END OF BLOCK c.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.
*  LOOP AT SCREEN.
*    CASE screen-group1.
*      WHEN 'C'.
*        IF p_so = ''.
*          screen-active = '0'.
*        ELSE.
*          screen-active = '1'.
*        ENDIF.
*    ENDCASE.
*    MODIFY SCREEN.
*  ENDLOOP.

START-OF-SELECTION.
  PERFORM get_data.

  "ALV全局属性
  "PERFORM frm_set_alv_layo." CHANGING ws_layout.

  PERFORM out_data .

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
  "上一期间
  IF s_perio = '001'.
    p_gjahr = s_gjahr - 1.
    p_perio = '012'.
  ELSE.
    p_gjahr = s_gjahr.
    p_perio = s_perio - 1.
  ENDIF.

  SELECT a~werks a~gjahr a~perio a~objnr
    b~kdauf b~kdpos b~matnr c~maktx b~aufnr b~dauat b~lgort b~psmng
    d~bklas
    FROM coep AS a
    INNER JOIN afpo AS b ON a~aufnr = b~aufnr
    INNER JOIN makt AS c ON b~matnr = c~matnr AND c~spras = '1'
    INNER JOIN mbew AS d ON b~matnr = d~matnr AND a~werks = d~bwkey
    INTO CORRESPONDING FIELDS OF TABLE itab1
    WHERE a~kokrs = 'SS88'
      AND a~werks IN s_werks
      AND a~gjahr = s_gjahr AND a~perio = s_perio
      AND b~matnr IN s_matnr
      AND a~aufnr IN s_aufnr
      AND a~wrttp = '04'
    .

  SORT itab1 BY werks gjahr perio objnr kdauf kdpos matnr aufnr dauat lgort .
  DELETE ADJACENT DUPLICATES FROM itab1.

  LOOP AT itab1.

    t_afpo-aufnr = itab1-aufnr.
    APPEND t_afpo.

    t_matnr-matnr = itab1-matnr.
    t_matnr-werks = itab1-werks.
    t_matnr-kdauf = itab1-kdauf.
    t_matnr-kdpos = itab1-kdpos.
    APPEND t_matnr.

    CLEAR:t_afpo,t_matnr,itab1.

  ENDLOOP.

  "抓成本估算号
  IF t_matnr[] IS NOT INITIAL.

    SORT t_matnr BY matnr werks kdauf kdpos.
    SELECT bwkey matnr vbeln posnr kalnr
      INTO CORRESPONDING FIELDS OF TABLE t_kalnr
     FROM ckmlhd
      FOR ALL ENTRIES IN t_matnr
     WHERE matnr = t_matnr-matnr AND bwkey = t_matnr-werks AND vbeln = t_matnr-kdauf AND posnr = t_matnr-kdpos.
    SORT t_kalnr BY matnr kalnr.
    DELETE ADJACENT DUPLICATES FROM t_kalnr.

  ENDIF.

  " 定价单价
  SELECT a~bwkey a~kalnr a~matnr a~vbeln a~posnr b~peinh b~pvprs b~stprs
    INTO CORRESPONDING FIELDS OF TABLE t_ckmlcr
   FROM ckmlhd AS a INNER JOIN ckmlcr AS b ON a~kalnr = b~kalnr
   WHERE b~bdatj = s_gjahr AND b~poper = s_perio AND vprsv = 'V' AND a~bwkey IN s_werks.
  SORT t_ckmlcr BY matnr vbeln posnr.
  DELETE ADJACENT DUPLICATES FROM t_ckmlcr.

  IF p_so = ''.
    DELETE itab1 WHERE kdauf <> ''.
    DELETE t_ckmlcr WHERE vbeln <> ''.
  ELSE.
    IF s_vbeln IS NOT INITIAL.
      DELETE itab1 WHERE kdauf NOT IN s_vbeln AND kdpos NOT IN s_posnr.
      DELETE t_ckmlcr WHERE vbeln NOT IN s_vbeln AND posnr NOT IN s_posnr.
    ENDIF.
  ENDIF.

  IF t_afpo[] IS NOT INITIAL.
    SORT t_afpo BY aufnr.
    DELETE ADJACENT DUPLICATES FROM t_afpo.
    "工单成本
    SELECT werks gjahr perio belnr buzei aufnr kstar wtgbtr wrttp
      INTO CORRESPONDING FIELDS OF TABLE t_coep
      FROM coep
      FOR ALL ENTRIES IN t_afpo
      WHERE coep~kokrs = 'SS88'
        "AND coep~werks IN s_werks  "   报工差异还原不分工厂。
        AND ( ( coep~gjahr = s_gjahr AND coep~perio <= s_perio ) OR coep~gjahr < s_gjahr )
        AND coep~aufnr = t_afpo-aufnr
        AND wrttp = '04'
      .

    "交货数量
    SELECT werks kalnr aufnr gjahr poper belnr buzei bwart menge
      INTO CORRESPONDING FIELDS OF TABLE t_mlauf
      FROM mlauf
      FOR ALL ENTRIES IN t_afpo
      WHERE aufnr = t_afpo-aufnr
      AND bwart IN ('101','102')
      AND ( ( gjahr = s_gjahr AND poper <= s_perio ) OR gjahr < s_gjahr )
      AND werks IN s_werks
      .

    "期末在制品金额
    SELECT werks aufnr gjahr h_monat AS monat belnr buzei shkzg dmbtr
      INTO CORRESPONDING FIELDS OF TABLE t_bseg
      FROM bseg
      FOR ALL ENTRIES IN t_afpo
      WHERE aufnr = t_afpo-aufnr
      AND hkont = '1406060001'
      AND ( ( gjahr = s_gjahr AND h_monat <= s_perio ) OR gjahr < s_gjahr )
      AND werks IN s_werks.

  ENDIF.

  IF t_kalnr[] IS NOT INITIAL.
    "半成品差异
    SELECT a~kalnr_mat a~bdatj AS gjahr a~poper a~estprd a~categ a~ptyp a~psart a~lbkum a~salk3
      INTO CORRESPONDING FIELDS OF TABLE t_fcml_rep_v
      FROM fcml_rep_v AS a
      FOR ALL ENTRIES IN t_kalnr
      WHERE a~kalnr_mat = t_kalnr-kalnr
      AND ( ( a~categ = 'ZU' AND a~ptyp = 'BF' AND a~psart = 'MC' )
         OR ( a~categ = 'ZU' AND a~ptyp = 'BF' AND a~psart = 'WC' )
         OR ( a~categ = 'AB' AND a~psart = '' )
         OR ( a~categ = 'ZU' AND a~psart = 'UP' )
           )
      AND a~bdatj = s_gjahr AND a~poper = s_perio
      "AND ( ( a~bdatj = s_gjahr AND a~poper <= s_perio ) OR a~bdatj < s_gjahr )
      .
  ENDIF.

  itab2[] = itab1[].
  LOOP AT itab1 WHERE gjahr = s_gjahr AND perio = s_perio.
    itab-werks = itab1-werks.
    itab-gjahr = itab1-gjahr.
    itab-perio = itab1-perio.
    itab-aufnr = itab1-aufnr.
    itab-kdauf = itab1-kdauf.
    itab-kdpos = itab1-kdpos.
    itab-matnr = itab1-matnr.
    itab-maktx = itab1-maktx.
    itab-dauat = itab1-dauat.
    itab-bklas = itab1-bklas.
    itab-lgort = itab1-lgort.
    itab-psmng = itab1-psmng.
    CALL FUNCTION 'STATUS_TEXT_EDIT'
      EXPORTING
        objnr            = itab1-objnr
        spras            = '1'
        bypass_buffer    = 'X'
      IMPORTING
        line             = itab-status
      EXCEPTIONS
        object_not_found = 1
        OTHERS           = 2.

    CLEAR:itab-kalnr.
    READ TABLE t_kalnr WITH KEY matnr = itab-matnr vbeln = itab-kdauf posnr = itab-kdpos.
    IF sy-subrc <> 0.
      READ TABLE t_kalnr WITH KEY matnr = itab-matnr.
    ENDIF.
    itab-kalnr = t_kalnr-kalnr.

    "   交货数量
    LOOP AT t_mlauf WHERE kalnr = itab-kalnr AND aufnr = itab-aufnr.
      IF t_mlauf-bwart = '102'.
        t_mlauf-menge = 0 - abs( t_mlauf-menge ).
      ENDIF.
      IF ( t_mlauf-gjahr = s_gjahr AND t_mlauf-poper < s_perio ) OR t_mlauf-gjahr < s_gjahr.  "期初交货数量
        itab-qcqty = itab-qcqty + t_mlauf-menge.
      ELSEIF t_mlauf-gjahr = s_gjahr AND t_mlauf-poper = s_perio.  "本期交货数量
        itab-bqqty = itab-bqqty + t_mlauf-menge.
      ENDIF.
    ENDLOOP.

    "   材料 ,人工,制费。
    LOOP AT t_coep WHERE aufnr = itab-aufnr.
      IF ( t_coep-gjahr = s_gjahr AND t_coep-perio < s_perio ) OR t_coep-gjahr < s_gjahr.  "期初材料 ,人工,制费
        IF t_coep-kstar >= '5001010001' AND t_coep-kstar <= '5001010009'.
          itab-qcmt = itab-qcmt + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010101'.
          itab-qczjrg = itab-qczjrg + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010102'.
          itab-qcjjrg = itab-qcjjrg + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010103'.
          itab-qczjdx = itab-qczjdx + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010104'.
          itab-qcsdhn = itab-qcsdhn + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010105'.
          itab-qcqtzf = itab-qcqtzf + t_coep-wtgbtr.
        ENDIF.
      ELSEIF t_coep-gjahr = s_gjahr AND t_coep-perio = s_perio.  "本期材料 ,人工,制费
        IF t_coep-kstar >= '5001010001' AND t_coep-kstar <= '5001010009'.
          itab-bqmt = itab-bqmt + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010101'.
          itab-bqzjrg = itab-bqzjrg + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010102'.
          itab-bqjjrg = itab-bqjjrg + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010103'.
          itab-bqzjdx = itab-bqzjdx + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010104'.
          itab-bqsdhn = itab-bqsdhn + t_coep-wtgbtr.
        ELSEIF t_coep-kstar = '8001010105'.
          itab-bqqtzf = itab-bqqtzf + t_coep-wtgbtr.
        ENDIF.
      ENDIF.
    ENDLOOP.

    "   差异
    LOOP AT t_fcml_rep_v WHERE kalnr_mat = itab-kalnr.
*      IF ( t_fcml_rep_v-gjahr = s_gjahr AND t_fcml_rep_v-poper < s_perio ) OR t_fcml_rep_v-gjahr < s_gjahr.      "期初半成品差异
*        READ TABLE t_mlauf WITH KEY gjahr = t_fcml_rep_v-gjahr poper = t_fcml_rep_v-poper aufnr = t_coep-aufnr.  "判断相应期间工单有没有收货。有收货才抓差异
*        IF sy-subrc = 0.
*          IF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF'AND t_fcml_rep_v-psart = 'MC'.
*            itab-qccy = itab-qccy + t_fcml_rep_v-estprd.
*          ENDIF.
*        ENDIF.
      "ELSE.   "本期所有工单都要考虑,就不分工单查。
      IF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF'AND ( t_fcml_rep_v-psart = 'MC' OR t_fcml_rep_v-psart = 'WC' ).
        "物料总差异
        itab-wlzcy = itab-wlzcy + t_fcml_rep_v-estprd.
      ELSEIF t_fcml_rep_v-categ = 'AB' AND t_fcml_rep_v-psart = '' .
        "物料期初总库存数量
        itab-lbkum1 = itab-lbkum1 + t_fcml_rep_v-lbkum.
        itab-salk31  = itab-salk31 + t_fcml_rep_v-salk3.
      ELSEIF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF' AND t_fcml_rep_v-psart = 'UP' .   "
        "物料本期收货总数量
        itab-lbkum2 = itab-lbkum2 + t_fcml_rep_v-lbkum.
        "itab-salk32 = itab-salk32 + t_fcml_rep_v-salk3.
      ENDIF.
      " ENDIF.
    ENDLOOP.

    "期初差异  " 抓上一期间的累计差异。
    SELECT SINGLE ljcy INTO itab-qccy FROM  ztfi023  WHERE gjahr = p_gjahr AND perio = p_perio AND werks = itab-werks AND aufnr = itab-aufnr.

    "本期差异 :( 物料总差异/ 成本核算号的所有工单本期的合计交货数量 ) * 本工单本期的合计收货总数量
    IF itab-lbkum2 <> 0.
      itab-bqcy = ( itab-wlzcy / itab-lbkum2 ) * itab-bqqty.
    ELSE.
      itab-bqcy = 0.
    ENDIF.

    "累计
    itab-ljmt = itab-qcmt + itab-bqmt.
    itab-ljzjrg = itab-qczjrg + itab-bqzjrg.
    itab-ljjjrg = itab-qcjjrg + itab-bqjjrg.
    itab-ljzjdx = itab-qczjdx + itab-bqzjdx.
    itab-ljsdhn = itab-qcsdhn + itab-bqsdhn.
    itab-ljqtzf = itab-qcqtzf + itab-bqqtzf.

    itab-ljcy = itab-qccy + itab-bqcy.
    itab-ljqty = itab-qcqty + itab-bqqty.

    itab-qcje = itab-qcmt + itab-qczjrg + itab-qcjjrg + itab-qczjdx + itab-qcsdhn + itab-qcqtzf." + itab-qccy.
    itab-bqje = itab-bqmt + itab-bqzjrg + itab-bqjjrg + itab-bqzjdx + itab-bqsdhn + itab-bqqtzf." + itab-bqcy.
    itab-ljje = itab-ljmt + itab-ljzjrg + itab-ljjjrg + itab-ljzjdx + itab-ljsdhn + itab-ljqtzf." + itab-ljcy.

    "期末在制品金额
    LOOP AT t_bseg WHERE aufnr = itab-aufnr.
      IF t_bseg-shkzg = 'H'.
        itab-qmzzje = itab-qmzzje - abs( t_bseg-dmbtr ).
      ELSE.
        itab-qmzzje = itab-qmzzje + abs( t_bseg-dmbtr ).
      ENDIF.
    ENDLOOP.

    "期末在制品数量:订单数量 - 累计交货数量
    itab-qmzzqty = itab-psmng - itab-ljqty.

    "定期单价
    IF p_so = ''.
      READ TABLE t_ckmlcr WITH KEY matnr = itab-matnr.
    ELSE.
      READ TABLE t_ckmlcr WITH KEY matnr = itab-matnr vbeln = itab-kdauf posnr = itab-kdpos.
    ENDIF.
    IF sy-subrc = 0.
      IF t_ckmlcr-peinh = 0.
        t_ckmlcr-peinh = 1.
      ENDIF.
      s_pvprs = t_ckmlcr-pvprs / t_ckmlcr-peinh.
      s_stprs = t_ckmlcr-stprs / t_ckmlcr-peinh.
    ENDIF.

    "期末完工金额
    itab-qmhg = itab-ljje - itab-qmzzje.

    "单位实际成本。
    itab-sjcb = s_pvprs.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
      EXPORTING
        input  = itab-aufnr
      IMPORTING
        output = itab-aufnr.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
      EXPORTING
        input  = itab-matnr
      IMPORTING
        output = itab-matnr.

    APPEND itab.
    CLEAR:itab,itab1,itab2,t_coep,t_fcml_rep_v,t_mlauf,t_bseg,t_ckmlcr,s_pvprs.
  ENDLOOP.

* 增加:工单在本期没有投入,没有收货,但上期有期末在制,

  SELECT * INTO CORRESPONDING FIELDS OF TABLE t_ztfi023 FROM ztfi023 WHERE werks IN s_werks AND gjahr = p_gjahr AND perio = p_perio AND qmzzje <> 0.
  IF sy-subrc = 0.
    LOOP AT t_ztfi023.
      READ TABLE itab WITH KEY werks = t_ztfi023-werks aufnr = t_ztfi023-aufnr+4(8).
      IF sy-subrc <> 0.
        itab-werks   = t_ztfi023-werks.
        itab-gjahr   = s_gjahr.
        itab-perio   = s_perio.
        itab-aufnr   = t_ztfi023-aufnr.
        itab-kdauf   = t_ztfi023-kdauf.
        itab-kdpos   = t_ztfi023-kdpos.
        itab-matnr   = t_ztfi023-matnr.
        SELECT SINGLE maktx INTO itab-maktx FROM makt WHERE matnr = t_ztfi023-matnr AND spras = sy-langu.
        itab-dauat   = t_ztfi023-dauat.
        itab-bklas   = t_ztfi023-bklas.
        itab-lgort   = t_ztfi023-lgort.
        itab-psmng   = t_ztfi023-psmng.
        itab-status  = t_ztfi023-status.

        itab-qcmt    = t_ztfi023-ljmt.
        itab-qczjrg  = t_ztfi023-ljzjrg.
        itab-qcjjrg  = t_ztfi023-ljjjrg.
        itab-qczjdx  = t_ztfi023-ljzjdx.
        itab-qcsdhn  = t_ztfi023-ljsdhn.
        itab-qcqtzf  = t_ztfi023-ljqtzf.
        itab-qccy    = t_ztfi023-ljcy.
        itab-qcje    = t_ztfi023-ljje.
        itab-qcqty   = t_ztfi023-ljqty.

        itab-ljmt    = t_ztfi023-ljmt.
        itab-ljzjrg  = t_ztfi023-ljzjrg.
        itab-ljjjrg  = t_ztfi023-ljjjrg.
        itab-ljzjdx  = t_ztfi023-ljzjdx.
        itab-ljsdhn  = t_ztfi023-ljsdhn.
        itab-ljqtzf  = t_ztfi023-ljqtzf.
        itab-ljcy    = t_ztfi023-ljcy.
        itab-ljje    = t_ztfi023-ljje.
        itab-ljqty   = t_ztfi023-ljqty.

        itab-qmzzje  = t_ztfi023-qmzzje.
        itab-qmzzqty = t_ztfi023-qmzzqty.
        itab-zzcy    = t_ztfi023-zzcy.
        itab-qmhg    = t_ztfi023-qmhg.

        itab-kalnr   = t_ztfi023-kalnr.
        itab-lbkum1  = t_ztfi023-lbkum1.
        itab-salk31  = t_ztfi023-salk31.
        itab-lbkum2  = t_ztfi023-lbkum2.

        itab-wlzcy   = t_ztfi023-wlzcy.
        itab-sjcb    = t_ztfi023-sjcb.


        CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
          EXPORTING
            input  = itab-aufnr
          IMPORTING
            output = itab-aufnr.

        CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
          EXPORTING
            input  = itab-matnr
          IMPORTING
            output = itab-matnr.

        APPEND itab.

      ENDIF.
      CLEAR:itab,t_ztfi023.
    ENDLOOP.
  ENDIF.

  IF p_fp = 'X' AND p_zz = ''.   "完工
    DELETE itab WHERE qmzzje <> 0.
  ENDIF.

  IF p_zz = 'X' AND p_fp = ''.   "在制
    DELETE itab WHERE qmzzje = 0.
  ENDIF.

ENDFORM. " GET_DATA

*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV_LAYO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GS_LAYO
*&---------------------------------------------------------------------*
FORM frm_set_alv_layo CHANGING p_gs_layo TYPE lvc_s_layo.

*ALV界面呈现颜色交替
  p_gs_layo-zebra  = 'X'.
*选择方式
*A:行与列的选择,无法选择单元格
*B:单选,不可以多选行,不可以多选单元格(为空时,默认选B)
*C:多选行、列,不可以多选单元格
*D:多选行列,还可以多选单元格
  p_gs_layo-sel_mode = 'D'.

*自动优化列宽,当这里指定后FCAT里COL_POT可不用重复指定
*  P_GS_LAYO-CWIDTH_OPT = 'X'.

*是否出现细节屏幕
  p_gs_layo-detailinit = 'X'.

*细节屏幕标题
  p_gs_layo-detailtitl = ''.

*控制求和后是否出现在第一行
  p_gs_layo-totals_bef = ''.

*复选框
  " p_gs_layo-box_fname = 'SEL'.

ENDFORM.
*&      Form  OUT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM out_data .
  CLEAR:gs_fieldcat,gs_fieldcat[].

  SORT itab BY werks gjahr perio aufnr kdauf kdpos matnr .
  PERFORM frm_field USING 'ITAB' 'WERKS'   '工厂'             'X'.
  PERFORM frm_field USING 'ITAB' 'GJAHR'   '年'               'X'.
  PERFORM frm_field USING 'ITAB' 'PERIO'   '期间'             'X'.
  PERFORM frm_field USING 'ITAB' 'AUFNR'   '工单'             'X'.

  IF p_so = 'X'.
    PERFORM frm_field USING 'ITAB' 'KDAUF'   '销售订单'         'X'.
    PERFORM frm_field USING 'ITAB' 'KDPOS'   '项目'             'X'.
  ENDIF.

  PERFORM frm_field USING 'ITAB' 'MATNR'   '物料'             'X'.
  PERFORM frm_field USING 'ITAB' 'MAKTX'   '描述'             'X'.
  PERFORM frm_field USING 'ITAB' 'DAUAT'   '订单类型'          'X'.
  PERFORM frm_field USING 'ITAB' 'BKLAS'   '评估类'            'X'.
  PERFORM frm_field USING 'ITAB' 'LGORT'   '存储地点'          'X'.
  PERFORM frm_field USING 'ITAB' 'PSMNG'   '工单数量'          'X'.
  PERFORM frm_field USING 'ITAB' 'STATUS'  '工单状态'          'X'.

  PERFORM frm_field USING 'ITAB' 'QCMT'   '期初材料'            'X'.
  PERFORM frm_field USING 'ITAB' 'QCZJRG' '期初直接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'QCJJRG' '期初间接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'QCZJDX' '期初折旧/摊销'       'X'.
  PERFORM frm_field USING 'ITAB' 'QCSDHN' '期初水电耗能'        'X'.
  PERFORM frm_field USING 'ITAB' 'QCQTZF' '期初其它制费'        'X'.
  "PERFORM frm_field USING 'ITAB' 'QCCY'   '期初承担其他差异'     'X'.
  PERFORM frm_field USING 'ITAB' 'QCJE'   '期初金额'             'X'.
  PERFORM frm_field USING 'ITAB' 'QCQTY'  '期初交货数量'         'X'.

  PERFORM frm_field USING 'ITAB' 'BQMT'   '本期材料'             'X'.
  PERFORM frm_field USING 'ITAB' 'BQZJRG' '本期直接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'BQJJRG' '本期间接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'BQZJDX' '本期折旧/摊销'       'X'.
  PERFORM frm_field USING 'ITAB' 'BQSDHN' '本期水电耗能'        'X'.
  PERFORM frm_field USING 'ITAB' 'BQQTZF' '本期其它制费'        'X'.
  "PERFORM frm_field USING 'ITAB' 'BQCY'   '本期承担其他差异'     'X'.
  PERFORM frm_field USING 'ITAB' 'BQJE'   '本期金额'             'X'.
  PERFORM frm_field USING 'ITAB' 'BQQTY'  '本期交货数量'         'X'.

  PERFORM frm_field USING 'ITAB' 'LJMT'   '累计材料'             'X'.
  PERFORM frm_field USING 'ITAB' 'LJZJRG' '累计直接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'LJJJRG' '累计间接人工'        'X'.
  PERFORM frm_field USING 'ITAB' 'LJZJDX' '累计折旧/摊销'       'X'.
  PERFORM frm_field USING 'ITAB' 'LJSDHN' '累计水电耗能'        'X'.
  PERFORM frm_field USING 'ITAB' 'LJQTZF' '累计其它制费'        'X'.
  "PERFORM frm_field USING 'ITAB' 'LJCY'   '累计承担其他差异'     'X'.
  PERFORM frm_field USING 'ITAB' 'LJJE'   '累计金额'             'X'.
  PERFORM frm_field USING 'ITAB' 'LJQTY'  '累计交货数量'         'X'.


  PERFORM frm_field USING 'ITAB' 'QMZZJE'   '期末在制品金额'        'X'.
  PERFORM frm_field USING 'ITAB' 'QMZZQTY'  '期末在制品数量'        'X'.
  PERFORM frm_field USING 'ITAB' 'QMHG'     '期末完工金额'          'X'.

  "PERFORM frm_field USING 'ITAB' 'KALNR'    '成本估算号'             'X'.
  "PERFORM frm_field USING 'ITAB' 'LBKUM1'   '物料期初库存总数量'        'X'.
  "PERFORM frm_field USING 'ITAB' 'SALK31'   '物料期初总实际价值'         'X'.
  "PERFORM frm_field USING 'ITAB' 'LBKUM2'   '物料本期生产收货总数量'    'X'.
  "PERFORM frm_field USING 'ITAB' 'WLZCY'    '物料本期承担的其它总差异'  'X'.
  "PERFORM frm_field USING 'ITAB' 'SJCB'     '单位实际成本'             'X'.

  "lv_title = ''.
*设置此变量后,ALV修改的数据按回车会立即更新内表数据
*  gs_settings-edt_cll_cb = 'X'.

  gs_layout-zebra             = 'X'.
*  gs_layout-get_selinfos      = 'X'.
  gs_layout-colwidth_optimize = 'X'.
*  gs_layout-detail_popup      = 'X'.
*  gs_layout-info_fieldname = 'STYLE'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_save                   = 'A'
      i_callback_pf_status_set = 'PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      it_fieldcat              = gs_fieldcat[]
      it_sort                  = gs_sortinfo[]
      is_layout                = gs_layout
    TABLES
      t_outtab                 = itab
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

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

ENDFORM. " OUT_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TABNAME  text
*      -->P_FIELDNAME  text
*      -->P_SELTEXT  text
*      -->P_NO_ZERO  text
*----------------------------------------------------------------------*
FORM frm_field USING p_tabname p_fieldname p_seltext p_no_zero.
  as_fieldcat-tabname     = p_tabname.
  as_fieldcat-fieldname   = p_fieldname.
  as_fieldcat-seltext_l   = p_seltext.
  as_fieldcat-no_zero     = p_no_zero.
  APPEND as_fieldcat TO gs_fieldcat.
  CLEAR as_fieldcat.
ENDFORM. "FRM_FIELD
*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*    ALV 动态调用
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM pf_status USING rt_extab TYPE slis_t_extab.
*  DATA: cmd_data TYPE TABLE OF sy-ucomm.

*  APPEND 'CMD_VIEW' TO cmd_data.
  SET PF-STATUS 'ZRFI_029' ." EXCLUDING cmd_data.

ENDFORM. "PF_STATUS
*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*     ALV 动态调用
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
  rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.

* 将界面中的选择数据更新到内表中
*=====GET_GLOBALS_FROM_SLVC_FULLSCR  start==========
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.
*=====GET_GLOBALS_FROM_SLVC_FULLSCR  end============

  CASE r_ucomm.
    WHEN 'F_SAVE' OR '&DATA_SAVE'.
* 保存数据
*      IF s_gjahr < '2022'.
*        MESSAGE '不能保存2022年以前的数据!' TYPE 'E'.
*        EXIT.
*      ENDIF.
*      p_gjahr = s_gjahr.
*      p_monat = s_budat2+4(2).
      DELETE FROM ztfi023 WHERE gjahr = s_gjahr AND perio = s_perio AND werks IN s_werks.
      COMMIT WORK AND WAIT.

      CLEAR:t_ztfi023,t_ztfi023[].
      LOOP AT itab.
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input  = itab-matnr
          IMPORTING
            output = itab-matnr.

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = itab-aufnr
          IMPORTING
            output = itab-aufnr.

        t_ztfi023 = itab.

        APPEND t_ztfi023.
      ENDLOOP.

      INSERT ztfi023 FROM TABLE t_ztfi023 ACCEPTING DUPLICATE KEYS.
      IF sy-subrc = 0 .
        MESSAGE '数据保存成功!' TYPE 'S'.
      ELSE.
        MESSAGE '数据保存失败,请重新保存!' TYPE 'E'.
      ENDIF.

    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      STOP.
  ENDCASE.

ENDFORM. "USER_COMMAND

*Text elements
*----------------------------------------------------------
* 001 筛选条件
* 002 筛选范围一
* 003 筛选范围二


*Selection texts
*----------------------------------------------------------
* P_FP         完工产品
* P_SO         订单库存
* P_ZZ         在制品
* S_AUFNR         工单
* S_GJAHR         会计年度
* S_MATNR         料号
* S_PERIO         期间
* S_POSNR         项目
* S_VBELN         销售订单
* S_WERKS         工厂


*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   数据保存成功!

Table: ZTFI023 Description: 生产成本结算单表

RowField namePositionKeyData elementDomainDatatypeLengthLowercaseDomain text
1MANDT1XMANDTMANDTCLNT3集团
2WERKS2XWERKS_DWERKSCHAR4工厂
3GJAHR3XGJAHRGJAHRNUMC4会计年度
4PERIO4XCO_PERIOPERBLNUMC3期间
5AUFNR5XAUFNRAUFNRCHAR12订单号
6KDAUF6KDAUFVBELNCHAR10销售订单数
7KDPOS7KDPOSNUM06NUMC6销售订单中的条款数
8MATNR8MATNRMATNRCHAR40物料编号
9DAUAT9AUFARTAUFARTCHAR4订单类型
10BKLAS10BKLASBKLASCHAR4评估类
11LGORT11LGORT_DLGORTCHAR4存储地点
12PSMNG12GSMNGMENG13QUAN13计划的订单总数量
13STATUS13STTXTTEXT40CHAR40X维护状态的描述
14QCMT14WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
15QCCY15WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
16QCZJRG16WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
17QCJJRG17WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
18QCZJDX18WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
19QCSDHN19WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
20QCQTZF20WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
21QCJE21WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
22QCQTY22MENGE_DMENG13QUAN13数量
23BQMT23WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
24BQCY24WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
25BQZJRG25WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
26BQJJRG26WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
27BQZJDX27WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
28BQSDHN28WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
29BQQTZF29WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
30BQJE30WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
31BQQTY31MENGE_DMENG13QUAN13数量
32LJMT32WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
33LJCY33WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
34LJZJRG34WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
35LJJJRG35WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
36LJZJDX36WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
37LJSDHN37WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
38LJQTZF38WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
39LJJE39WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
40LJQTY40MENGE_DMENG13QUAN13数量
41QMZZJE41WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
42QMZZQTY42MENGE_DMENG13QUAN13数量
43ZZCY43WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
44QMHG44WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
45KALNR45CK_KALNRCK_KALNRNUMC12没有数量结构的成本估算的成本估算编号
46LBKUM146LBKUMMENG13VQUAN13总计已估计库存
47SALK3147SALK3WERT13NCURR13估价的总库存价值
48LBKUM248LBKUMMENG13VQUAN13总计已估计库存
49SALK3249SALK3WERT13NCURR13估价的总库存价值
50BQSHBTR50WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
51WLZCY51WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
52SJCB52WRBTRAFLE13D2O16N_TO_23D2O30NCURR23凭证货币金额
53OBJNR53J_OBJNRJ_OBJNRCHAR22对象号
54KSTAR54KSTARKSTARCHAR10成本要素
55WTGBTR55WTGXXXAFLE15D2O21S_TO_23D2O31SCURR23交易货币中的总值
  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值