SAP PP关务WIP报表分享

一、报表逻辑

二、报表界面

三、报表逻辑

*&———————————————————————*
*& Report ZRPPP_0026
*&———————————————————————*
*& 
*&———————————————————————*
REPORT zrppp_0026.

TABLES: afko,afpo,ztmm_marc,cskt,crhd,resb,caufv,
        sscrfields ,icon.
TYPE-POOLS:slis.

DATA: BEGIN OF gt_msg OCCURS 0,
        msgid  LIKE sy-msgid,
        msgty  LIKE sy-msgty,
        msgno  LIKE sy-msgno,
        msgv1  LIKE sy-msgv1,
        msgv2  LIKE sy-msgv2,
        msgv3  LIKE sy-msgv3,
        msgv4  LIKE sy-msgv4,
        lineno LIKE mesg-zeile,
      END OF gt_msg.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.

TYPES: BEGIN OF ty_salv  ,
         aufnr               TYPE  afpo-aufnr,
         matnr               TYPE  afpo-matnr,
         maktx               TYPE  makt-maktx,
         zzxmbm              TYPE  ztmm_marc-zzxmbm,
         psmng               TYPE  afpo-psmng,
         wemng               TYPE  afpo-wemng,
         zwemng              TYPE  afpo-wemng,
         zzt                 TYPE  char10,
         matnr1              TYPE  resb-matnr,
         maktx1              TYPE  makt-maktx,
         meins               TYPE  resb-meins,
         bdmng               TYPE  resb-bdmng,
         enmng               TYPE  resb-enmng,
         zenmng              TYPE  resb-enmng,
         zenmng1             TYPE  resb-enmng,
         zenmng2             TYPE  resb-enmng,
         labst               TYPE  mard-labst,
         zenmng3(16)         TYPE  p DECIMALS 9 , ” resb-enmng,
         zausch              TYPE  char10,
         zenmng4(16)         TYPE  p DECIMALS 9 , “resb-enmng,

         “关务begin….
         zenmng5(16)         TYPE  p DECIMALS 9,
         zenmng6(16)         TYPE  p DECIMALS 9,
         ausch1(16)          TYPE  p DECIMALS 9,
         zrec_handbook_index TYPE  char12 , “ztsd016-zrec_handbook_index,
         zdecl_com_code      TYPE  ztsd016-zdecl_com_code,
         zsubpro_code        TYPE  ztsd016-zsubpro_code,
*         zciq_code           TYPE  ztsd016-zciq_code,
         zsubpro_name        TYPE  ztsd016-zsubpro_name,
         zsubpro_spec        TYPE  ztsd016-zsubpro_spec,
         zdecl_conv_rate     TYPE  ztsd016-zdecl_conv_rate,
         zenmng7(16)         TYPE  p DECIMALS 9,
         zdecl_unit          TYPE  ztsd016-zdecl_unit,
         zscale_factor1      TYPE  ztsd016-zscale_factor1,
         zenmng8(16)         TYPE  p DECIMALS 9,
         zlegal_unit         TYPE  ztsd016-zlegal_unit,
         zscale_factor2      TYPE  ztsd016-zscale_factor2,
         zenmng9(16)         TYPE  p DECIMALS 9,
         zsec_unit           TYPE  ztsd016-zsec_unit,
         zenmng10(16)        TYPE  p DECIMALS 9,
         zplant_unit         TYPE  ztsd016-zplant_unit,
         zplant_conv_rate    TYPE  ztsd016-zplant_conv_rate,

         “关务end….

         dwerk               TYPE  afpo-dwerk,
         ftrmi               TYPE  afko-ftrmi,
         idat2               TYPE caufv-idat2,
         ltext               TYPE  cskt-ltext,
         arbpl               TYPE  crhd-arbpl,
         zzbfl               TYPE char10,
         zzdl                TYPE char10,

       END OF ty_salv .

DATA:BEGIN OF gt_tab OCCURS 0 .
       INCLUDE TYPE ty_salv .
DATA:

       posnr      TYPE resb-posnr,
       ausch      TYPE resb-ausch,
       routing_no TYPE co_aufpl,
       kostl      TYPE kostl,
       esmng      TYPE resb-esmng, “工单组件单位用量
       flg        TYPE c,
     END OF gt_tab .

DATA:BEGIN OF gt_anr OCCURS 0 .
DATA: aufnr      LIKE gt_tab-aufnr,
      zzt        LIKE gt_tab-zzt,
      flg        LIKE gt_tab-flg,
      arbpl      LIKE gt_tab-arbpl,
      routing_no LIKE gt_tab-routing_no,
      kostl      LIKE gt_tab-kostl,
      END OF gt_anr .

DATA:BEGIN OF gw_info.
DATA: ztype     TYPE bapi_mtype,
      zmsg      TYPE bapi_msg,
*      m_best_eko TYPE char1, “采购组织
*      m_best_bsa TYPE char1, “凭证类型
*      m_best_wrk TYPE char1, “工厂
*      m_best_ekg TYPE char1, “采购组
      zaopp_prs TYPE char1, “价格权限

      END OF gw_info .

DATA: flg_err  TYPE c,
      gv_check TYPE i.

DATA: “dauat TYPE zspp_000-dauat,
  arbpl TYPE zspp_000-arbpl,
  ltext TYPE zspp_000-ltext.

SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: s_dwerk   FOR  afpo-dwerk NO-EXTENSION NO INTERVALS OBLIGATORY MEMORY ID wrk,
  s_aufnr   FOR  afpo-aufnr,
  s_matnr   FOR  afpo-matnr,
  s_zzxmbm  FOR  ztmm_marc-zzxmbm,
  s_matnr1  FOR  resb-matnr,”cskt-ltext,
  s_arbpl   FOR  arbpl,
  s_ltext   FOR  ltext,
  s_ftrmi   FOR  afko-ftrmi,
  s_idat2   FOR  caufv-idat2 .

*  PARAMETERS: zzt TYPE char10 DEFAULT '' AS  LISTBOX VISIBLE LENGTH 15 USER-COMMAND chgzt  .
*  PARAMETERS: zflag AS CHECKBOX DEFAULT '' USER-COMMAND chk.

  SELECTION-SCREEN SKIP 1 .

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 1(8)  txt .
    SELECTION-SCREEN POSITION 10.
    PARAMETERS all AS CHECKBOX USER-COMMAND cmd.
    SELECTION-SCREEN COMMENT 11(5)  chk FOR FIELD all.

  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN ULINE .
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 5(8)  chk1 FOR FIELD crtd.
    SELECTION-SCREEN COMMENT 20(5) chk2 FOR FIELD rel.
    SELECTION-SCREEN COMMENT 34(5) chk3 FOR FIELD teco.

    SELECTION-SCREEN POSITION 1.
    PARAMETERS crtd AS CHECKBOX .
    SELECTION-SCREEN POSITION 15.
    PARAMETERS rel AS CHECKBOX  DEFAULT 'X'.
    SELECTION-SCREEN POSITION 29.
    PARAMETERS teco AS CHECKBOX.
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 5(8)  chk4 FOR FIELD flag.
    SELECTION-SCREEN COMMENT 20(5) chk5 FOR FIELD del.
    SELECTION-SCREEN COMMENT 34(5) chk6 FOR FIELD lock.
    SELECTION-SCREEN COMMENT 48(5) chk7 FOR FIELD close.

    SELECTION-SCREEN POSITION 1.
    PARAMETERS flag AS CHECKBOX .
    SELECTION-SCREEN POSITION 15.
    PARAMETERS del AS CHECKBOX.
    SELECTION-SCREEN POSITION 29.
    PARAMETERS lock AS CHECKBOX.
    SELECTION-SCREEN POSITION 43.
    PARAMETERS close AS CHECKBOX.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK part1.

AT SELECTION-SCREEN OUTPUT.
  ADD 1 TO gv_check .
  CHECK gv_check > 1 .
  crtd = rel = teco = flag = del = lock = close = all .

*  IF zflag = 'X'  .
*    zzt = '' .
*  ENDIF.

*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-low .
*  PERFORM frm_search_ltext .
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-high .
*  PERFORM frm_search_ltext .

INITIALIZATION.
  txt = '工单状态:' .
  chk = '全选'.
  chk1 = '已创建'.
  chk2 = '已下达'.
  chk3 = '技术关闭' .
  chk4 = '标记'.
  chk5 = '删除'.
  chk6 = '锁定' .
  chk7 = '已财务结算' .
*  DATA itab_list TYPE vrm_values.
*  itab_list = VALUE #(
*  ( key = 'CRTD' text = '已创建' )
*  ( key = 'REL' text = '已审批' )
*  ( key = 'TECO' text = '技术性完成' )
*  ( key = '标记' text = '标记' )
*  ( key = '删除' text = '删除' )
*  ( key = '锁定' text = '锁定' )
*  ( key = '结算' text = '已财务结算' )
*
*  ).
*
*  CALL FUNCTION 'VRM_SET_VALUES'
*    EXPORTING
*      id     = 'ZZT'
*      values = itab_list.
*  REFRESH itab_list.

  DATA: lv_begdat TYPE datum,
        lv_enddat TYPE datum.
  DATA: BEGIN OF date,
          j(4),
          m(2),
          t(2),
        END OF date.

  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = sy-datum
    IMPORTING
      last_day_of_month = lv_enddat
    EXCEPTIONS
      day_in_no_date    = 1
      OTHERS            = 2.

  date = lv_enddat.
  date-t = '01'.
  lv_begdat = date .

*  INSERT VALUE #( sign = 'I' option = 'BT' low = lv_begdat high = lv_enddat ) INTO TABLE s_erdat.

START-OF-SELECTION.
  IF crtd = '' AND rel = '' AND teco = '' AND flag = '' AND del = '' AND lock = '' AND close = '' AND all = '' .
    MESSAGE '请选择工单状态.' TYPE 'S' DISPLAY LIKE 'E' .
    RETURN.
  ENDIF.
  PERFORM frm_check_auth .

  CHECK flg_err = '' .

  PERFORM frm_get_data .

*  IF gt_tab[] IS INITIAL.
*    MESSAGE '未查询到数据' TYPE 'S' DISPLAY LIKE 'W' .
*  ENDIF.

  PERFORM frm_show_alv .

*&———————————————————————*
*& Form frm_show_alv
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_show_alv .

  DATA:lt_tab TYPE TABLE OF ty_salv .
  MOVE-CORRESPONDING gt_tab[] TO lt_tab[] .
  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = gr_table
      CHANGING
        t_table      = lt_tab[]
        ).
    CATCH cx_salv_msg.
  ENDTRY.

  gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( 'X' ).

  DEFINE mcr_undisplay.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      gr_column->set_visible( cl_salv_column_table=>false ).
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

  DATA: s TYPE scrtext_s,
        m TYPE scrtext_m,
        l TYPE scrtext_l.
  DEFINE mcr_setcoltext.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      s = &2 .m = &2. l = &2 .
      gr_column->set_short_text( s ).
      gr_column->set_medium_text( m ).
      gr_column->set_long_text( l ).
      IF gr_column->get_ddic_datatype( ) = 'QUAN' OR gr_column->get_ddic_datatype( ) = 'CURR' OR gr_column->get_ddic_inttype( ) = 'P' .
        gr_column->set_edit_mask( '==ZZERO' ).
      ENDIF.
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE mcr_zzero.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      gr_column->set_edit_mask( '==ZZERO' ).
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

*  mcr_undisplay: 'ROUTING_NO' , 'FLG'.

  mcr_setcoltext:
                  'AUFNR'  '工单号',
                  'MATNR'  '物料编码',
                  'MAKTX'  '物料描述',
                  'ZZXMBM'  '项目编码',
                  'PSMNG'  '已订购量',
                  'WEMNG'  '完成数量',
                  'ZWEMNG'  '未完成数量',
                  'ZZT'  '加工单状态',
                  'MATNR1'  '组件物料编码',
                  'MAKTX1'  '组件物料描述',
                  'MEINS'  '计量单位',
                  'BDMNG'  '需求数量',
                  'ENMNG'  '发放量',
                  'ZENMNG'  '组件短缺量',
                  'ZENMNG1'  '报废数量',
                  'ZENMNG2'  '在制品数量',
                  'LABST'  '现有数量',
                  'ZENMNG3'  '组件单位用量',
                  'ZAUSCH'  '单位损耗',
                  'ZENMNG4'  'BOM单位用量(不含报废率)',
                  'DWERK'  '地点',
                  'FTRMI'  '发放日期',
                  'IDAT2'  '工单关闭日期',
                  'LTEXT'  '部门名称',
                  'ARBPL'  '工作中心',
                  'ZZBFL'  '报废率',
                  'ZZDL'  '单龄',
                  “关务相关字段
                  'ZENMNG5' '工单标准总用量',
                  'ZENMNG6' 'WIP理论差异数量',
                  'AUSCH1' '差异数量比率',
                  'ZREC_HANDBOOK_INDEX' '备案序号',
                  'ZDECL_COM_CODE' '申报编码',
                  'ZSUBPRO_CODE' '商品编码',
*                  'ZCIQ_CODE' 'CIQ',
                  'ZSUBPRO_NAME' '品名',
                  'ZSUBPRO_SPEC' '规格',
                  'ZDECL_CONV_RATE' '申报单位转换率',
                  'ZENMNG7' '申报数量',
                  'ZDECL_UNIT' '申报单位',
                  'ZSCALE_FACTOR1' '比例因子一',
                  'ZENMNG8' '法1数量',
                  'ZLEGAL_UNIT' '法定单位名称',
                  'ZSCALE_FACTOR2' '比例因子二',
                  'ZENMNG9' '法2数量',
                  'ZSEC_UNIT' '第二法定单位名称',
                  'ZENMNG10' '工厂商品单位数量',
                  'ZPLANT_UNIT' '工厂商品单位',
                  'ZPLANT_CONV_RATE' '库存转报关率'.

*  mcr_zzero: 'PSMNG', 'WEMNG' , 'ZWEMNG' ,'BDMNG','ENMNG','ZENMNG', 'ZENMNG1',
*             'ZENMNG2' , 'LABST' , 'ZENMNG3' ,'ZENMNG4'.

  TRY.
      DATA lv_status TYPE sypfkey .
      lv_status = 'STANDARD' .
*      IF rd2 = 'X'.
*        lv_status = 'STANDARD_DEL' .
*      ENDIF.
      CALL METHOD gr_table->set_screen_status
        EXPORTING
          report        = sy-repid
          pfstatus      = lv_status
          set_functions = gr_table->c_functions_all.
    CATCH cx_sy_arithmetic_error INTO DATA(exc).
  ENDTRY.

  gr_layout = gr_table->get_layout( ).
  gs_program-report = sy-repid.
  gr_layout->set_key( gs_program ).
  gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
  gr_layout->set_default( 'X' ).

  gr_table->display( ).
ENDFORM.
*&———————————————————————*
*& Form frm_get_data
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_get_data .
  RANGES:r_matnr FOR mara-matnr,
         r_aufnr FOR afpo-aufnr,
         r_lgort FOR mdlg-lgort.
  DATA:lv_tmp       TYPE char20,
       lv_char      TYPE qsollwertc,
       lv_menge(16) TYPE  p DECIMALS 10,
       lv_dec(5)    TYPE p DECIMALS 2.

  DATA wheresql TYPE TABLE OF edpline .
*  DATA:tline  TYPE STANDARD TABLE OF tline WITH HEADER LINE,
*       tdname TYPE thead-tdname.
*  BREAK guoxiongjie .
*
  IF s_ltext[] IS NOT INITIAL.
    SELECT kostl, CAST( @space AS CHAR( 40 ) ) AS ltext INTO TABLE @DATA(lt_cskt) FROM cskt WHERE ltext IN @s_ltext .
  ENDIF.
*
  IF s_zzxmbm[] IS NOT INITIAL.
    LOOP AT s_zzxmbm.
      CONCATENATE '%' s_zzxmbm-low '%' INTO lv_tmp .
      SELECT matnr,werks, zzxmbm APPENDING TABLE @DATA(lt_xmbm)
        FROM ztmm_marc WHERE zzxmbm LIKE @lv_tmp AND werks IN @s_dwerk.
    ENDLOOP.

    DATA:lw_xmbm LIKE LINE OF lt_xmbm.

    LOOP AT lt_xmbm INTO lw_xmbm .
      r_matnr-sign = 'I'.
      r_matnr-option = 'EQ'.
      r_matnr-low = lw_xmbm-matnr .
      APPEND r_matnr .
    ENDLOOP.
    IF r_matnr[] IS INITIAL .
      RETURN .
    ENDIF .
  ENDIF.

  APPEND 'afpo~dwerk IN s_dwerk AND '  TO wheresql .
  APPEND 'afpo~aufnr IN s_aufnr AND '  TO wheresql .
  APPEND 'resb~matnr IN s_matnr1 AND '  TO wheresql .
  APPEND 'afko~ftrmi IN s_ftrmi AND '  TO wheresql .
  APPEND 'caufv~idat2 IN s_idat2 AND '  TO wheresql .

  IF s_matnr[] IS INITIAL AND r_matnr[] IS NOT INITIAL.
    APPEND 'afpo~matnr IN r_matnr  '  TO wheresql .
  ELSE.
    APPEND 'afpo~matnr IN s_matnr  '  TO wheresql .
  ENDIF.

  IF teco = 'X' OR flag = 'X' OR del = 'X' OR close = 'X' .
  ELSE.
    APPEND ' AND resb~xloek = '' '' '  TO wheresql .
  ENDIF.

  SELECT
    afpo~aufnr
    afpo~matnr
    afpo~psmng
    afpo~wemng
    resb~matnr AS matnr1
    resb~meins AS meins
    resb~bdmng
    resb~enmng
    resb~ausch
    afpo~dwerk
    afko~ftrmi
    resb~esmng
    resb~posnr
    caufv~idat2
  INTO CORRESPONDING FIELDS OF TABLE gt_tab
  FROM afpo INNER JOIN afko ON afpo~aufnr = afko~aufnr
  INNER JOIN caufv ON afpo~aufnr = caufv~aufnr
  INNER JOIN resb ON resb~rsnum = afko~rsnum
  WHERE (wheresql) .

  IF s_matnr[] IS INITIAL AND r_matnr[] IS NOT INITIAL.
  ELSE.
    DELETE gt_tab WHERE matnr NOT IN r_matnr .
  ENDIF.

**  “结算日期.
**  SELECT aufnr,idat2 INTO TABLE @DATA(lt_caufv) FROM caufv FOR ALL ENTRIES IN @gt_tab
**        WHERE aufnr = @gt_tab-aufnr .
**  DATA:lw_caufv LIKE LINE OF lt_caufv .
*
  “筛选工作中心/部门/删除订单.
  LOOP AT gt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>).

*    READ TABLE lt_caufv INTO lw_caufv WITH KEY aufnr = <sy_tab>-aufnr .
*    IF sy-subrc EQ 0.
*      <sy_tab>-idat2 = lw_caufv-idat2 .
*    ENDIF.
    PERFORM frm_get_aufnr TABLES lt_cskt USING <sy_tab> .

    INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-aufnr ) INTO TABLE r_aufnr.
    DATA(lv_aufnr) = |{ <sy_tab>-aufnr ALPHA = OUT }|.
    INSERT VALUE #( sign = 'I' option = 'EQ' low = lv_aufnr ) INTO TABLE r_aufnr.

    INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-matnr1  ) INTO TABLE r_matnr.
  ENDLOOP.

  DELETE gt_tab WHERE flg = 'X' .
*
  “物料描述
  SELECT matnr, maktx INTO TABLE @DATA(lt_makt) FROM makt FOR ALL ENTRIES IN @gt_tab
        WHERE ( matnr = @gt_tab-matnr OR matnr = @gt_tab-matnr1 )
              AND spras = @sy-langu .
  DATA:lw_makt LIKE LINE OF lt_makt.

  “物料项目编码
  SELECT matnr, werks ,zzxmbm INTO TABLE @lt_xmbm FROM ztmm_marc FOR ALL ENTRIES IN @gt_tab
  WHERE matnr = @gt_tab-matnr AND werks = @gt_tab-dwerk .

  “成本中心名称
  SELECT kostl,ltext INTO TABLE @lt_cskt FROM cskt FOR ALL ENTRIES IN @gt_tab
  WHERE kostl = @gt_tab-kostl AND spras = @sy-langu .
  DATA:lw_cskt LIKE LINE OF lt_cskt.

  “报废数量
  SELECT aufnr, matnr, SUM( enmng1 ) AS bfsl INTO TABLE @DATA(lt_005)
    FROM ztpp005
        WHERE aufnr IN @r_aufnr GROUP BY aufnr, matnr.
  DATA:lw_005 LIKE LINE OF lt_005 .

  SELECT aufnr, matnr1, SUM( znum1 ) AS bfsl INTO TABLE @DATA(lt_009)
        FROM ztpp009
        WHERE aufnr IN @r_aufnr GROUP BY aufnr, matnr1.
  DATA:lw_009 LIKE LINE OF lt_009 .

  “库存数量
  SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
    INTO TABLE @r_lgort
    FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_dwerk .

  SELECT matnr, SUM( labst ) AS labst INTO TABLE @DATA(lt_mard)
    FROM mard
    WHERE matnr IN @r_matnr AND werks IN @s_dwerk AND lgort NOT IN @r_lgort
    GROUP BY matnr .
  DATA:lw_mard LIKE LINE OF lt_mard .

  SELECT * INTO TABLE @DATA(lt_012)
    FROM ztpp012 .
  DATA:lw_012 LIKE LINE OF lt_012 .

  “关务相关数据
  IF s_dwerk-low+0(3) NE '825'.
    SELECT
        matnr,
        CAST( zrec_handbook_index AS CHAR( 12 ) ) AS zrec_handbook_index,
        zdecl_com_code,
        zsubpro_code,
        zciq_code,
        zsubpro_name,
        zsubpro_spec,
        zdecl_conv_rate,
        zdecl_unit,
        zscale_factor1,
        zlegal_unit,
        zscale_factor2,
        zsec_unit,
        zplant_unit,
        zplant_conv_rate
      INTO TABLE @DATA(lt_sd016)
        FROM ztsd016 WHERE matnr IN @r_matnr .
  ELSE.
    SELECT
      matnr,
      zserial_no_049 AS zrec_handbook_index,
      zdecl_com_code,
      zsubpro_code,
*      zciq_code,
      zsubpro_name,
      zsubpro_spec,
      zdecl_conv_rate,
      zdecl_unit,
      zscale_factor1,
      zlegal_unit,
      zscale_factor2,
      zsec_unit,
      zplant_unit,
      zplant_conv_rate
          FROM ztsd050vn WHERE matnr IN @r_matnr
      INTO TABLE @DATA(lt_050vn).
    MOVE-CORRESPONDING lt_050vn[] TO lt_sd016[] .

  ENDIF.

  SORT gt_tab ASCENDING BY aufnr posnr .
  LOOP AT gt_tab ASSIGNING <sy_tab>.

    READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr .
    IF sy-subrc EQ 0.
      <sy_tab>-maktx = lw_makt-maktx .
    ENDIF.
    READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr1 .
    IF sy-subrc EQ 0.
      <sy_tab>-maktx1 = lw_makt-maktx .
    ENDIF.

    READ TABLE lt_xmbm INTO lw_xmbm WITH KEY matnr = <sy_tab>-matnr werks = <sy_tab>-dwerk .
    IF sy-subrc EQ 0.
      <sy_tab>-zzxmbm = lw_xmbm-zzxmbm .
    ENDIF.

    READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = <sy_tab>-kostl .
    IF sy-subrc EQ 0.
      <sy_tab>-ltext = lw_cskt-ltext .
    ENDIF.

    <sy_tab>-zwemng = <sy_tab>-psmng – <sy_tab>-wemng.
    <sy_tab>-zenmng = <sy_tab>-bdmng – <sy_tab>-enmng.

    “报废数量
    READ TABLE lt_009 INTO lw_009 WITH KEY aufnr = <sy_tab>-aufnr matnr1 = <sy_tab>-matnr1.
    IF sy-subrc EQ 0.
      <sy_tab>-zenmng1 = lw_009-bfsl .
    ENDIF.

    lv_aufnr = |{ <sy_tab>-aufnr ALPHA = OUT }|.
    DATA(lv_matnr) = |{ <sy_tab>-matnr1 ALPHA = OUT }|.

    IF <sy_tab>-zenmng1 IS INITIAL .
      READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = lv_aufnr matnr = lv_matnr.
      IF sy-subrc EQ 0.
        <sy_tab>-zenmng1 = lw_005-bfsl .
      ELSE.
        READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = <sy_tab>-aufnr matnr = <sy_tab>-matnr1.
        IF sy-subrc EQ 0.
          <sy_tab>-zenmng1 = lw_005-bfsl .
        ENDIF.
      ENDIF.
    ENDIF.

    “库存数量
    READ TABLE lt_mard INTO lw_mard WITH KEY matnr = <sy_tab>-matnr1 .
    IF sy-subrc EQ 0 .
      <sy_tab>-labst = lw_mard-labst .
    ENDIF.

    “组件单位用量
    “开工单的时候如果不手动对工单组件需求数量进行修改,工单生成的预留的ESMNG与原组件BOM单耗一致,与使用可能性和优先级无关。
    “如果对工单组件的需求数量进行修改后,预留的ESMNG变成(1-使用可能性)*原BOM单耗。
    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = 9
        i_fltp_value       = <sy_tab>-esmng
      IMPORTING
        e_char_field       = lv_char.
    <sy_tab>-zenmng3 = lv_char .

    DATA(lv_bfsl) = <sy_tab>-bdmng – <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) .
    “BOM单位用量(不含报废率)
    lv_menge = ( <sy_tab>-bdmng – lv_bfsl ) /  <sy_tab>-psmng.
    CALL FUNCTION 'ROUND'
      EXPORTING
        decimals      = 6
        input         = lv_menge
        sign          = '-'
      IMPORTING
        output        = <sy_tab>-zenmng4
      EXCEPTIONS
        input_invalid = 1
        overflow      = 2
        type_invalid  = 3
        OTHERS        = 4.

    “单位损耗
    IF <sy_tab>-ausch IS NOT INITIAL.
      <sy_tab>-zausch = <sy_tab>-ausch .” / 100 .
      CONCATENATE <sy_tab>-zausch '%' INTO <sy_tab>-zausch .
      CONDENSE <sy_tab>-zausch NO-GAPS .
    ENDIF.

    “报废率
    IF <sy_tab>-zenmng1 > 0 AND <sy_tab>-enmng > 0 .
      <sy_tab>-zzbfl = <sy_tab>-zenmng1 / <sy_tab>-enmng  .
      lv_dec = <sy_tab>-zzbfl * 100 .
      <sy_tab>-zzbfl = lv_dec .
      CONCATENATE <sy_tab>-zzbfl '%' INTO <sy_tab>-zzbfl .
    ELSE.
      CLEAR:<sy_tab>-zzbfl .
    ENDIF.

    “单龄

    <sy_tab>-zzdl = <sy_tab>-ftrmi – sy-datum  .

    “在制品数量
*    1  组件单位用量
*    2  BOM单位用量(不含报废率)
*    READ TABLE lt_012 INTO lw_012 WITH KEY werks = s_dwerk-low .
*    IF sy-subrc EQ 0.
*      IF lw_012-dwyl = '1'.
*        DATA(lv_dwyl) = <sy_tab>-zenmng3. “组件单位用量
*      ELSEIF lw_012-dwyl = '2'.
*        lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
*      ENDIF.
*    ELSE.
*      “没维护,默认
*      IF s_dwerk-low = '1001'.
*        lv_dwyl = <sy_tab>-zenmng3. “组件单位用量
*      ELSEIF s_dwerk-low = '1002' .
*        lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
*      ENDIF.
*    ENDIF.
*    <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-wemng * lv_dwyl ) – <sy_tab>-zenmng1 .
*    ENMNG发放量 – ( BDMNG需求数量 / PSMNG已订购量) * WEMNG完成数量 * (1-AUSCH单位损耗/100) – ZENMNG1报废数量
    <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-bdmng / <sy_tab>-psmng ) * <sy_tab>-wemng * ( 1 – <sy_tab>-ausch / 100 ) – <sy_tab>-zenmng1 .

    “关务数据
    READ TABLE lt_sd016 INTO DATA(lw_sd016) WITH KEY matnr = <sy_tab>-matnr1 BINARY SEARCH.
    IF sy-subrc EQ 0.
      MOVE-CORRESPONDING lw_sd016 TO <sy_tab> .
      <sy_tab>-zrec_handbook_index = |{ <sy_tab>-zrec_handbook_index ALPHA = OUT }|.

      “工单标准总用量=  已订购量*BOM单位用量(不含报废率)
      <sy_tab>-zenmng5 = <sy_tab>-psmng * <sy_tab>-zenmng4 .
      “WIP理论差异数量  = 发放量-(完成数量*BOM单位用量(不含报废率))
      <sy_tab>-zenmng6 = <sy_tab>-enmng – ( <sy_tab>-wemng * <sy_tab>-zenmng4 ) .
      “差异数量比率  =  WIP理论差异数量/(已订购量*BOM单位用量(不含报废率))
      <sy_tab>-ausch1 = <sy_tab>-zenmng6 / <sy_tab>-zenmng5 .
      “申报数量  =  工厂商品单位数量*申报单位转换率
      <sy_tab>-zenmng7 = <sy_tab>-zenmng10 * <sy_tab>-zdecl_conv_rate .
      “法1数量  =  申报数量*比例因子一
      <sy_tab>-zenmng8 = <sy_tab>-zenmng7 * <sy_tab>-zscale_factor1 .
      “法2数量  =  申报数量*比例因子二
      <sy_tab>-zenmng9 = <sy_tab>-zenmng7 * <sy_tab>-zscale_factor2 .
      “工厂商品单位数量  =  在制品数量*库存转报关率(库存转报关率无数值时,按1计算)
      DATA(lv_rate) = <sy_tab>-zplant_conv_rate.
      IF lv_rate IS INITIAL.
        lv_rate = 1 .
      ENDIF.
      <sy_tab>-zenmng10 = <sy_tab>-zenmng2 * lv_rate .

    ENDIF.

  ENDLOOP.

ENDFORM.
*&———————————————————————*
*& Form frm_check_auth
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_check_auth .
*  DATA:lt_values TYPE TABLE OF us335 WITH HEADER LINE .
*  CLEAR:gw_info .
*
*  CLEAR:gt_msg,gt_msg[].
*  gt_msg-msgid = '00' .
*  gt_msg-msgty = 'E' .
*  gt_msg-msgno = '001' .
*
*  AUTHORITY-CHECK OBJECT 'ZAUTMM_PRS' ID 'ZACTIVE' FIELD 'X'.
*  IF sy-subrc NE 0. “价格权限
*    gw_info-zaopp_prs = 'X'.
*  ENDIF.

ENDFORM.
*&———————————————————————*
*& Form frm_search_ltext
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_search_ltext .
  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
    EXPORTING
      tabname           = 'CSKT'
      fieldname         = 'LTEXT'
      searchhelp        = 'ZSH_CSKT_LTEXT'
      dynpprog          = sy-repid
      dynpnr            = sy-dynnr
      dynprofield       = 'S_LTEXT'
    EXCEPTIONS
      field_not_found   = 1
      no_help_for_field = 2
      inconsistent_help = 3
      no_values_found   = 4
      OTHERS            = 5.
ENDFORM.
*&———————————————————————*
*& Form frm_get_aufnr
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> <SY_TAB>
*&      –> FLG_GET
*&———————————————————————*
FORM frm_get_aufnr TABLES pt_cskt USING pv_tab LIKE LINE OF gt_tab.

  DATA:lw_objects   TYPE bapi_pp_order_objects,
       lt_header    TYPE TABLE OF bapi_order_header1 WITH HEADER LINE,
       lt_operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE,
       lw_return    TYPE bapiret2.

  DATA:BEGIN OF lt_cskt OCCURS 0 .
  DATA:kostl TYPE cskt-kostl,
       ltext TYPE cskt-ltext,
       END OF lt_cskt .

  READ TABLE gt_anr WITH KEY aufnr = pv_tab-aufnr .
  IF sy-subrc EQ 0.
    MOVE-CORRESPONDING gt_anr TO pv_tab .
    RETURN.
  ENDIF.

  lt_cskt[] = pt_cskt[].

  CLEAR pv_tab-flg .
  lw_objects-header = 'X' .
  lw_objects-operations = 'X' .

  CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
    EXPORTING
      number        = pv_tab-aufnr
      order_objects = lw_objects
    IMPORTING
      return        = lw_return
    TABLES
      header        = lt_header
      operation     = lt_operation.

  LOOP AT lt_header.
    pv_tab-zzt = lt_header-system_status .
    IF lt_header-system_status CS 'CRTD' OR lt_header-system_status CS 'REL' OR lt_header-system_status CS 'TECO'
      OR lt_header-system_status CS '锁定' OR lt_header-system_status CS '结算'  OR lt_header-system_status CS '删除'
      OR lt_header-system_status CS '标记'.
      pv_tab-flg = ''.
      IF crtd = '' AND lt_header-system_status CS 'CRTD'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF rel = '' AND lt_header-system_status CS 'REL'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF teco = '' AND lt_header-system_status CS 'TECO'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF flag = '' AND lt_header-system_status CS '标记'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF del = '' AND lt_header-system_status CS '删除'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF lock = '' AND lt_header-system_status CS '锁定'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
      IF close = '' AND lt_header-system_status CS '结算'.
        pv_tab-zzt = ''.
        pv_tab-flg = 'X' .
        RETURN .
      ENDIF.
    ELSE.
      pv_tab-zzt = ''.
      pv_tab-flg = 'X' .
      RETURN .
    ENDIF.
    DATA(routing_no) = lt_header-routing_no .

  ENDLOOP.

  LOOP AT lt_operation WHERE routing_no = routing_no AND system_status NS '删除' AND work_center <> ''.
    DATA(work_center) = lt_operation-work_center .
    EXIT .
  ENDLOOP.

  IF work_center NOT IN s_arbpl.
    pv_tab-flg = 'X' .
    RETURN .
  ENDIF.
  pv_tab-arbpl = work_center .

  SELECT SINGLE kostl INTO @DATA(lv_kostl) FROM crhd INNER JOIN crco ON crhd~objid = crco~objid
        WHERE arbpl = @work_center .

  pv_tab-routing_no = routing_no .
  pv_tab-kostl = lv_kostl .

  IF lt_cskt[] IS NOT INITIAL.
    DATA:lw_cskt LIKE LINE OF lt_cskt .
    READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = lv_kostl .
    IF sy-subrc NE 0.
      pv_tab-flg = 'X' .
      RETURN .
    ENDIF.
  ENDIF.

  DEFINE marco_anr_txt.
    IF lt_header-system_status CS &1 .”'CRTD' .
       pv_tab-zzt = &2 .”'创建' .
    ENDIF.
  END-OF-DEFINITION.
  marco_anr_txt:'CRTD' '已创建',
                'REL'  '已下达' ,
                'TECO' '技术关闭' ,
                '标记' '标记' ,
                '删除' '删除' ,
                '锁定' '锁定' ,
                '结算' '已财务结算' .

  INSERT VALUE #( aufnr       = pv_tab-aufnr
                  zzt         = pv_tab-zzt
                  flg         = pv_tab-flg
                  arbpl       = pv_tab-arbpl
                  routing_no  = pv_tab-routing_no
                  kostl       = pv_tab-kostl ) INTO TABLE gt_anr.

ENDFORM.

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
ETX_-的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容