镶套procedure

那年仲夏 提交于 2019-12-23 05:28:31

CREATE OR REPLACE PROCEDURE HHPMES."S_CAP_SOP_SIMULATE" (
 s_sim_index  IN cap_sop_simulate_index.sim_index%TYPE,
 s_from_date  IN cap_sop_simulate_index.prod_start_date%TYPE,
 s_to_date  IN cap_sop_simulate_index.prod_start_date%TYPE,
 s_plant   IN bsc_sect.plant_code%TYPE,
 s_analysis_flag IN cap_sop_simulate_index.analysis_method%TYPE,
 s_line_flag  IN cap_sop_simulate_index.line_type%TYPE,
 outmessage  OUT VARCHAR2)
IS
 h_sim_index    cap_sop_prod_line_info.sim_index%TYPE;
 h_year_date    cap_sop_prod_line_info.year_date%TYPE;
 h_sect_code    cap_sop_prod_line_info.sect%TYPE;
 h_line     cap_sop_prod_line_info.shop_code%TYPE;
 h_prod_group   cap_sop_prod_line_info.prod_group%TYPE;
 h_prod_group2   cap_sop_prod_line_info.prod_group%TYPE;
 h_time_prod_group  cap_sop_prod_line_info.prod_group%TYPE;
 h_prod_qty    cap_sop_prod_line_info.prod_qty%TYPE;
 h_tot_prod_qty   cap_sop_prod_line_info.prod_qty%TYPE;
 h_change_group_cnt  cap_sop_prod_line_info.change_group_cnt%TYPE;
 h_change_group_cnt2  cap_sop_prod_line_info.change_group_cnt%TYPE;
 h_line_cnt    cap_sop_prod_line_info.cell_line_cnt%TYPE;
 h_cell_run_line_cnt  cap_sop_prod_line_info.cell_run_line_cnt%TYPE;
 h_cell_line_cnt   cap_sop_prod_line_info.cell_line_cnt%TYPE;
 h_cell_line_cnt2  cap_sop_prod_line_info.cell_line_cnt%TYPE;
 h_cv_run_line_cnt  cap_sop_prod_line_info.cv_run_line_cnt%TYPE;
 h_cv_line_cnt   cap_sop_prod_line_info.cv_line_cnt%TYPE;
 h_cv_line_cnt2   cap_sop_prod_line_info.cv_line_cnt%TYPE;
 h_plan_week    cap_sop_simulate.plan_week%TYPE;
 h_line_plan_week  cap_sop_simulate.plan_week%TYPE;
 h_cell_time_qty   cap_sop_simulate.cell_time_qty%TYPE;
 h_cv_time_qty   cap_sop_simulate.cv_time_qty%TYPE;
 h_cv_line_time_qty  cap_sop_prod_line_info.cv_time_qty%TYPE;
 h_cell_line_time_qty cap_sop_prod_line_info.cv_time_qty%TYPE;
 h_depart_cell   bsc_sect.depart_code%TYPE;
 h_sect_cell    cap_sop_prod_line_info.sect%TYPE;
 h_line_cell    cap_sop_prod_line_info.shop_code%TYPE;
 h_depart_cv    bsc_sect.depart_code%TYPE;
 h_sect_cv    cap_sop_prod_line_info.sect%TYPE;
 h_line_cv    cap_sop_prod_line_info.shop_code%TYPE;
 h_line_type    bsc_line.line_category%TYPE;
 h_analysis_flag   cap_sop_simulate_index.analysis_method%TYPE;
 h_line_flag    cap_sop_simulate_index.line_type%TYPE;
 h_term_flag    cap_sop_simulate_index.term_flag%TYPE;
 h_plan_start_week  cap_sop_simulate_index.plan_start_week%TYPE;
 h_plan_end_week   cap_sop_simulate_index.plan_end_week%TYPE;
 h_max_week    bsc_week_info.week_code%TYPE;
  h_work_time   NUMBER(12);
  h_loss_time   NUMBER(12);
  h_time_prod_qty  NUMBER(12);

CURSOR cur_cap_sop_prod_line_info IS
  SELECT a.year_date, a.sect,a.shop_code,  a.line_category, a.prod_group,
      a.prod_qty, b.tot_prod_qty,
      round(decode(b.tot_prod_qty,0,0,a.prod_qty/b.tot_prod_qty),1) rate,a.change_group_cnt,
                       decode((a.work_time -a.loss_time),0,0, round(a.prod_qty *60 /(a.work_time -a.loss_time),0)) time_qty
 FROM
  (SELECT   substr(v.year_week,0,4) year_date,decode(w.line_category,'C','C','V') line_category,  
      v.sect,v.shop_code, nvl(v.prod_group,'ETC') prod_group,
     nvl(sum(v.prod_qty),0) prod_qty, max(v.change_group) change_group_cnt,
     sum(nvl(v.loss_time,0)) loss_time, sum(nvl(v.access_time,0)) work_time
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'Y'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , decode(w.line_category,'C','C','V'), v.sect,v.shop_code,nvl(v.prod_group,'ETC')
  ) A,
  (SELECT   substr(v.year_week,0,4) year_date, decode(w.line_category,'C','C','V') line_category,   v.sect,v.shop_code,
     nvl(sum(v.prod_qty),0) tot_prod_qty
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'Y'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , decode(w.line_category,'C','C','V'),v.sect,v.shop_code)B
 WHERE a.sect = b.sect
 AND a.shop_code = b.shop_code
 AND a.year_date = b.year_date
 AND a.line_category = b.line_category ;


CURSOR cur_cap_sop_simulate IS
  SELECT distinct v.year_date year_date, v.plan_week year_week,
  nvl(v.prod_group,'ETC')
  FROM cap_sop_prod_line_info v
  WHERE v.sim_index = s_sim_index
  ;
/*  SELECT   substr(v.year_week,0,4) year_date, substr(v.year_week,5,2) year_week,
  nvl(v.prod_group,'ETC')
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'Y'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , substr(v.year_week,5,2) ,
  nvl(v.prod_group,'ETC')
  ;
*/
CURSOR cur_cap_sop_simulate_pcb IS
  SELECT   substr(v.year_week,0,4) year_date, substr(v.year_week,5,2) year_week,
  nvl(v.prod_group,'ETC')
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  --AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'N'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , substr(v.year_week,5,2) ,
  nvl(v.prod_group,'ETC')
  ;

CURSOR cur_line_rate IS
 SELECT a.year_date, a.sect,a.shop_code,   a.prod_group,
      a.prod_qty, b.tot_prod_qty,
      round(decode(b.tot_prod_qty,0,0,a.prod_qty/b.tot_prod_qty),3) rate
 FROM
  (SELECT   substr(v.year_week,0,4) year_date, v.sect,v.shop_code, nvl(v.prod_group,'ETC') prod_group,
     nvl(sum(v.prod_qty),0) prod_qty
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'Y'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , v.sect,v.shop_code,nvl(v.prod_group,'ETC')
  ) A,
  (SELECT   substr(v.year_week,0,4) year_date, v.sect,v.shop_code,
     nvl(sum(v.prod_qty),0) tot_prod_qty
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  d.outgoing = 'Y' 
  AND  p.outgoing = 'Y'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , v.sect,v.shop_code)B
 WHERE a.sect = b.sect
 AND a.shop_code = b.shop_code
 AND a.year_date = b.year_date ;


CURSOR cur_line_rate_pcb IS
 SELECT a.year_date, a.sect,a.shop_code, a.prod_group,
      a.prod_qty, b.tot_prod_qty,
      round(decode(b.tot_prod_qty,0,0,a.prod_qty/b.tot_prod_qty),3) rate,a.change_group_cnt,
                        round(a.prod_qty *60 /(a.work_time -a.loss_time),0) time_qty
 FROM
  (SELECT   substr(v.year_week,0,4) year_date,  
      v.sect,v.shop_code, nvl(v.prod_group,'ETC') prod_group,
     nvl(sum(v.prod_qty),0) prod_qty, max(v.change_group) change_group_cnt,
     sum(nvl(v.loss_time,0)) loss_time, sum(nvl(v.access_time,0)) work_time
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  p.outgoing = 'N'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , v.sect,v.shop_code,nvl(v.prod_group,'ETC')
  ) A,
  (SELECT   substr(v.year_week,0,4) year_date, v.sect,v.shop_code,
     nvl(sum(v.prod_qty),0) tot_prod_qty
  FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
  WHERE v.sect = p.sect 
  AND  p.depart_code = d.depart_code
  AND  v.sect = w.sect 
  AND  v.shop_code = w.shop_code 
  AND  v.sect = r.sect
  AND  v.shop_code = r.shop_code 
  AND  v.route_code = r.route_code
  AND  v.sect  in (select sect from bsc_sect
      where plant_code = s_plant)
  AND  p.outgoing = 'N'  
  AND  w.outgoing = 'Y'
  AND  r.outgoing = 'Y' 
  AND  v.work_date between s_from_date and s_to_date
  AND  v.analysis_flag like 'Y'
  AND  0 < ( SELECT decode('%','%',1,count(*))
      FROM bsc_line_type_hist lt
      WHERE lt.sect = v.sect
      AND  lt.shop_code = v.shop_code
      AND  lt.line_category like '%'
      AND  v.work_date between start_date  and end_date)
  GROUP BY substr(v.year_week,0,4) , v.sect,v.shop_code)B
 WHERE a.sect = b.sect
 AND a.shop_code = b.shop_code
 AND a.year_date = b.year_date ;

CURSOR cur_plan_week IS
   SELECT a.YEAR , a.YEAR||a.WEEK_CODE PLAN_WEEK , a.year_MONTH
     FROM BSC_WEEK_INFO a, CAP_SOP_SIMULATE_INDEX b
   WHERE b.SIM_INDEX =h_sim_index
   AND a.YEAR||a.WEEK_CODE BETWEEN b.PLAN_START_WEEK AND  b.PLAN_END_WEEK
   order by a.YEAR , a.YEAR||a.WEEK_CODE
   ;

CURSOR cur_line_time_qty IS
 SELECT pdm.line_category, pdm.prod_group,     
    nvl(sum(pdm.prod_qty),0) prod_qty,
    nvl(sum(pdm.loss_time),0) loss_time,
    nvl(sum(pdm.work_time),0) work_time
  FROM (
   SELECT  decode(w.line_category,'C','C','V') line_category,
     nvl(v.prod_group,'ETC') prod_group,
     nvl(sum(v.prod_qty),0) prod_qty,
     sum(nvl(v.loss_time,0)) loss_time, sum(nvl(v.access_time,0)) work_time
   FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
   WHERE v.sect = p.sect 
   AND  p.depart_code = d.depart_code
   AND  v.sect = w.sect 
   AND  v.shop_code = w.shop_code 
   AND  v.sect = r.sect
   AND  v.shop_code = r.shop_code 
   AND  v.route_code = r.route_code
   AND  v.sect  in (select sect from bsc_sect
       where plant_code = s_plant)
   AND  d.outgoing = 'Y' 
   AND  p.outgoing = 'Y'  
   AND  w.outgoing = 'Y'
   AND  r.outgoing = 'Y' 
   AND  v.work_date between s_from_date and s_to_date
   AND  nvl(v.prod_group,'ETC') = h_prod_group
   AND  v.analysis_flag like 'Y'
   AND  0 < ( SELECT decode('%','%',1,count(*))
       FROM bsc_line_type_hist lt
       WHERE lt.sect = v.sect
       AND  lt.shop_code = v.shop_code
       AND  lt.line_category like '%'
       AND  v.work_date between start_date  and end_date)
   GROUP BY decode(w.line_category,'C','C','V'), nvl(v.prod_group,'ETC')
  )PDM
  GROUP BY pdm.line_category, pdm.prod_group;


BEGIN

 IF (s_sim_index = '') OR (s_sim_index IS NULL) THEN  
  RETURN;
 ELSE
  h_sim_index := s_sim_index ;
 END IF;

 IF (s_line_flag = '') OR (s_line_flag IS NULL) THEN  
  RETURN;
 ELSE
  h_line_flag := s_line_flag ;
 END IF;

  
 BEGIN
  DELETE CAP_SOP_PROD_LINE_INFO
  WHERE SIM_INDEX = h_sim_index
  ;
  
 EXCEPTION
 WHEN OTHERS THEN
  outmessage := sqlerrm ;
  ROLLBACK ;
  RETURN ;
 END ;

 BEGIN
  DELETE CAP_SOP_SIMULATE   
  WHERE SIM_INDEX = h_sim_index
   ;
 EXCEPTION
 WHEN OTHERS THEN
  outmessage := sqlerrm ;
  ROLLBACK ;
  RETURN ;
 END;

 BEGIN
  select max(week_code)
  INTO h_max_week
  from bsc_week_info a, CAP_SOP_SIMULATE_INDEX b
  where b.SIM_INDEX =h_sim_index
  and a.YEAR = substr(b.PLAN_START_WEEK,0,4);
 EXCEPTION
 WHEN OTHERS THEN
  h_plan_week := 0 ;
  RETURN ;
 END;

 IF h_line_flag = 'M' THEN

  BEGIN
   SELECT TERM_FLAG
   INTO h_term_flag
   FROM CAP_SOP_SIMULATE_INDEX
   WHERE SIM_INDEX =h_sim_index
   ;
  EXCEPTION
  WHEN OTHERS THEN
   h_term_flag := 'M' ;
   RETURN ;
  END;

  IF h_term_flag ='W' THEN

   BEGIN
    SELECT PLAN_START_WEEK , PLAN_END_WEEK
    INTO h_plan_start_week, h_plan_end_week
    FROM CAP_SOP_SIMULATE_INDEX
    WHERE SIM_INDEX =h_sim_index
    ;
   EXCEPTION
   WHEN OTHERS THEN
    h_plan_start_week := 0 ;
    h_plan_end_week := 0 ;
    RETURN ;
   END;

  ELSE
   BEGIN
    SELECT MIN(A.YEAR_MONTH), MAX(A.YEAR_MONTH)
    INTO h_plan_start_week, h_plan_end_week
    FROM BSC_WEEK_INFO A, CAP_SOP_SIMULATE_INDEX B
    WHERE A.YEAR||A.WEEK_CODE  BETWEEN  B.PLAN_START_WEEK AND  B.PLAN_END_WEEK
    AND B.SIM_INDEX =h_sim_index
    ;
   EXCEPTION
   WHEN OTHERS THEN
    h_plan_start_week := 0 ;
    h_plan_end_week := 0 ;
    RETURN ;
   END;
  END IF;

  IF h_plan_start_week < h_plan_end_week THEN
  LOOP
   OPEN cur_cap_sop_prod_line_info ;
   LOOP
    FETCH cur_cap_sop_prod_line_info
    INTO h_year_date, h_sect_code, h_line, h_line_type, h_prod_group, h_prod_qty, h_tot_prod_qty, h_line_cnt, h_change_group_cnt, h_cv_line_time_qty ;
    EXIT WHEN cur_cap_sop_prod_line_info%NOTFOUND;

    BEGIN
    
     IF h_line_type ='C' THEN 
  
      BEGIN
       UPDATE CAP_SOP_PROD_LINE_INFO
       SET PROD_QTY   = h_prod_qty,
        CELL_LINE_CNT  = h_line_cnt,
        CHANGE_GROUP_CNT = h_change_group_cnt,
        CELL_RUN_LINE_CNT = h_line_cnt*h_change_group_cnt,
        CELL_LINE_APPLIED_CNT = h_line_cnt*h_change_group_cnt,
        CELL_TIME_QTY  = h_cv_line_time_qty,
        UPDATE_DATE   = sysdate
       WHERE SIM_INDEX = h_sim_index
         AND YEAR_DATE = substr(h_plan_start_week,0,4)
         AND SECT = h_sect_code
         AND SHOP_CODE = h_line
         AND PROD_GROUP = h_prod_group
         AND PLAN_WEEK = substr(h_plan_start_week,5,2)
        ;
      EXCEPTION
      WHEN OTHERS THEN
       outmessage := sqlerrm ;
       ROLLBACK ;
       RETURN ;
      END ;

      IF sql%rowcount = 0 THEN
       BEGIN
        INSERT INTO CAP_SOP_PROD_LINE_INFO
          (SIM_INDEX, YEAR_DATE,   PLAN_WEEK, SECT,       SHOP_CODE, PROD_GROUP,  PROD_QTY,  CHANGE_GROUP_CNT,  CELL_LINE_CNT, CELL_RUN_LINE_CNT,            CELL_TIME_QTY, CELL_LINE_APPLIED_CNT, INSERT_DATE)   
        VALUES (h_sim_index, substr(h_plan_start_week,0,4),substr(h_plan_start_week,5,2),h_sect_code,h_line,    h_prod_group,h_prod_qty,h_change_group_cnt,h_line_cnt,    h_line_cnt*h_change_group_cnt,h_cv_line_time_qty,h_line_cnt*h_change_group_cnt,
          sysdate)
        ;
       EXCEPTION
       WHEN OTHERS THEN
        outmessage := sqlerrm ;
        ROLLBACK ;
        RETURN ;
       END ;
      END IF ;

     ELSE
      
      BEGIN
       UPDATE CAP_SOP_PROD_LINE_INFO
       SET PROD_QTY   = h_prod_qty,
        CV_LINE_CNT   = h_line_cnt,
        CHANGE_GROUP_CNT = h_change_group_cnt,
        CV_RUN_LINE_CNT  = h_line_cnt*h_change_group_cnt,
        CV_LINE_APPLIED_CNT  = h_line_cnt*h_change_group_cnt,
        CV_TIME_QTY   = h_cv_line_time_qty,
        UPDATE_DATE   = sysdate
       WHERE SIM_INDEX = h_sim_index
         AND YEAR_DATE = substr(h_plan_start_week,0,4)
         AND SECT = h_sect_code
         AND SHOP_CODE = h_line
         AND PROD_GROUP = h_prod_group
         AND PLAN_WEEK = substr(h_plan_start_week,5,2)
        ;
      EXCEPTION
      WHEN OTHERS THEN
       outmessage := sqlerrm ;
       ROLLBACK ;
       RETURN ;
      END ;

      IF sql%rowcount = 0 THEN
       BEGIN
        INSERT INTO CAP_SOP_PROD_LINE_INFO
         (SIM_INDEX,YEAR_DATE,PLAN_WEEK,SECT,SHOP_CODE,PROD_GROUP,PROD_QTY, CHANGE_GROUP_CNT,CV_LINE_CNT,CV_RUN_LINE_CNT, CV_TIME_QTY,CV_LINE_APPLIED_CNT,  INSERT_DATE)   
        VALUES (h_sim_index,substr(h_plan_start_week,0,4),substr(h_plan_start_week,5,2),h_sect_code,h_line,h_prod_group,h_prod_qty,h_change_group_cnt,h_line_cnt,h_line_cnt*h_change_group_cnt,h_cv_line_time_qty,h_line_cnt*h_change_group_cnt,
          sysdate)
        ;
       EXCEPTION
       WHEN OTHERS THEN
        outmessage := sqlerrm ;
        ROLLBACK ;
        RETURN ;
       END ;
      END IF ;
     END IF ;
    END ;
  END LOOP;
  CLOSE cur_cap_sop_prod_line_info;

  h_plan_start_week := h_plan_start_week + 1;
  
   IF  h_term_flag ='M'  THEN
    IF substr(h_plan_start_week,5,2) = 13  THEN
     h_plan_start_week := (substr(h_plan_start_week,0,4) + 1) || '01';
     END IF;
  ELSE
    IF substr(h_plan_start_week,5,2) > h_max_week  THEN
     h_plan_start_week := (substr(h_plan_start_week,0,4) + 1) || '01';
     END IF;
  
  END IF;
  --  dbms_output.put_line('<<||YYYYYYYYYYYY========'||h_plan_start_week);
   IF h_plan_start_week > h_plan_end_week THEN
   EXIT;
   END IF;

  END LOOP;
  END IF;
  COMMIT WORK;

  OPEN cur_cap_sop_simulate ;
  LOOP 
   FETCH cur_cap_sop_simulate
   INTO h_year_date, h_plan_week, h_prod_group;
   EXIT WHEN cur_cap_sop_simulate%NOTFOUND;

    IF (s_analysis_flag = '') OR (s_analysis_flag IS NULL) THEN
     RETURN;
    ELSE
     h_analysis_flag := s_analysis_flag ;
    END IF;

   BEGIN   
    INSERT INTO CAP_SOP_SIMULATE
     (SIM_INDEX,YEAR_DATE,PLAN_WEEK,PROD_GROUP, INSERT_DATE)   
    VALUES (h_sim_index,h_year_date,h_plan_week,h_prod_group, sysdate)
    ;

    EXCEPTION
    WHEN OTHERS THEN
     outmessage := sqlerrm ;
     ROLLBACK ;
     RETURN ;
   END ;

   BEGIN
    SELECT  sum( CV_LINE_CNT), sum(CV_RUN_LINE_CNT),sum(CELL_LINE_CNT), sum( CELL_RUN_LINE_CNT)
    INTO  h_cv_line_cnt2,h_cv_run_line_cnt,h_cell_line_cnt2,h_cell_run_line_cnt
     FROM (SELECT   distinct shop_code,  CV_LINE_CNT, CV_RUN_LINE_CNT, CELL_LINE_CNT,CELL_RUN_LINE_CNT
    FROM CAP_SOP_PROD_LINE_INFO
    WHERE SIM_INDEX = h_sim_index
      AND YEAR_DATE = h_year_date
      AND PROD_GROUP = h_prod_group
    )
    ;
   EXCEPTION
   WHEN OTHERS THEN
    outmessage := sqlerrm ;
    RETURN ;
   END ;

 --   dbms_output.put_line(h_plan_week||'PROD_GROUP>>'||h_time_prod_group||'<<||h_cell_run_line_cnt========'||h_cell_run_line_cnt);
   BEGIN
    UPDATE CAP_SOP_SIMULATE
    SET CELL_RUN_LINE_CNT = h_cell_run_line_cnt,
     CELL_LINE_CNT  = h_cell_line_cnt2,
     CV_RUN_LINE_CNT  = h_cv_run_line_cnt,
     CV_LINE_CNT   = h_cv_line_cnt2,
     UPDATE_DATE   = sysdate
    WHERE SIM_INDEX = h_sim_index
      AND YEAR_DATE = h_year_date
      AND PROD_GROUP = h_prod_group
     ;
   EXCEPTION
   WHEN OTHERS THEN
    outmessage := sqlerrm ;
    ROLLBACK ;
    RETURN ;
   END ;

    /*=G@{,@/=G,@[>w=C0#18GT*/
    OPEN cur_line_time_qty;
    LOOP
     FETCH cur_line_time_qty
     INTO    h_line_type, h_time_prod_group, h_time_prod_qty, h_loss_time, h_work_time;
     EXIT WHEN cur_line_time_qty%NOTFOUND;

   
    IF h_line_type ='C' THEN 
     IF h_analysis_flag ='A' THEN 

      IF (h_work_time - h_loss_time) <= 0 or h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN
       h_cell_time_qty := 0;
      ELSE
       h_cell_time_qty := round(h_time_prod_qty *60 /(h_work_time - h_loss_time) ,0);
      END IF;

      IF h_cell_time_qty  <  0 THEN      
       h_cell_time_qty := 0;
      END IF;

     ELSE
      IF h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN
       h_cell_time_qty := 0;
      ELSE
       h_cell_time_qty := round((h_time_prod_qty*60)/h_work_time,0) ;
      END IF;
     END IF;

    -- dbms_output.put_line(h_plan_week||'PROD_GROUP>>'||h_time_prod_group||'<<||h_cv_time_qty========'||h_cell_time_qty);
     BEGIN
      UPDATE CAP_SOP_SIMULATE
      SET CELL_TIME_QTY  = h_cell_time_qty,
       UPDATE_DATE   = sysdate
      WHERE SIM_INDEX = h_sim_index
        AND YEAR_DATE = h_year_date
        AND PLAN_WEEK = h_plan_week
        AND PROD_GROUP = h_time_prod_group
       ;

     EXCEPTION
     WHEN OTHERS THEN
      outmessage := 'ERROR' ;
      ROLLBACK ;
      RETURN ;
     END ;
  

    ELSE
     IF h_analysis_flag ='A' THEN 

      IF (h_work_time - h_loss_time) <= 0 or h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN
       h_cv_time_qty := 0;
      ELSE
       h_cv_time_qty := round(h_time_prod_qty *60 /(h_work_time - h_loss_time) ,0);
      END IF;

      IF h_cv_time_qty  <  0 THEN
       h_cv_time_qty := 0;
      END IF;

     ELSE
      IF h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN  
       h_cv_time_qty := 0;
      ELSE
       h_cv_time_qty := round((h_time_prod_qty*60)/h_work_time,0) ;
      END IF;

     END IF; 

     BEGIN
      UPDATE CAP_SOP_SIMULATE
      SET CV_TIME_QTY  = h_cv_time_qty,
       UPDATE_DATE   = sysdate
      WHERE SIM_INDEX = h_sim_index
        AND YEAR_DATE = h_year_date
        AND PLAN_WEEK = h_plan_week
        AND PROD_GROUP = h_time_prod_group
       ;

     EXCEPTION
     WHEN OTHERS THEN
      outmessage := 'ERROR' ;
      ROLLBACK ;
      RETURN ;
     END ;
   END IF;

   END LOOP; 
   CLOSE cur_line_time_qty;

  END LOOP;
  CLOSE cur_cap_sop_simulate;
  COMMIT WORK;

 ELSE  
  
  BEGIN
   SELECT TERM_FLAG
   INTO h_term_flag
   FROM CAP_SOP_SIMULATE_INDEX
   WHERE SIM_INDEX =h_sim_index
   ;
  EXCEPTION
  WHEN OTHERS THEN
   h_term_flag := 'M' ;
   RETURN ;
  END;

  IF h_term_flag ='W' THEN

   BEGIN
    SELECT PLAN_START_WEEK , PLAN_END_WEEK
    INTO h_plan_start_week, h_plan_end_week
    FROM CAP_SOP_SIMULATE_INDEX
    WHERE SIM_INDEX =h_sim_index
    ;
   EXCEPTION
   WHEN OTHERS THEN
    h_plan_start_week := 0 ;
    h_plan_end_week := 0 ;
    RETURN ;
   END;
  ELSE
   BEGIN
    SELECT MIN(A.YEAR_MONTH), MAX(A.YEAR_MONTH)
    INTO h_plan_start_week, h_plan_end_week
    FROM BSC_WEEK_INFO A, CAP_SOP_SIMULATE_INDEX B
    WHERE A.YEAR||A.WEEK_CODE  BETWEEN  B.PLAN_START_WEEK AND  B.PLAN_END_WEEK
    AND B.SIM_INDEX =h_sim_index
    ;
   EXCEPTION
   WHEN OTHERS THEN
    h_plan_start_week := 0 ;
    h_plan_end_week := 0 ;
    RETURN ;
   END;
  END IF;

  
  IF h_plan_start_week < h_plan_end_week THEN
  LOOP
   OPEN cur_line_rate_pcb ;
   LOOP
    FETCH cur_line_rate_pcb
    INTO h_year_date,h_sect_code,h_line,h_prod_group,h_prod_qty,h_tot_prod_qty,h_line_cnt,h_change_group_cnt,h_cv_line_time_qty;
    EXIT WHEN cur_line_rate_pcb%NOTFOUND;

    -- dbms_output.put_line('<<||h_prod_group======='||h_prod_group||'<<||h_line_cnt======='||h_line_cnt);
    BEGIN

     BEGIN
      UPDATE CAP_SOP_PROD_LINE_INFO
      SET PROD_QTY   = h_prod_qty,
       CV_LINE_CNT   = h_line_cnt,
       CHANGE_GROUP_CNT = h_change_group_cnt,
       CV_RUN_LINE_CNT  = h_line_cnt*h_change_group_cnt,
       CV_LINE_APPLIED_CNT  = h_line_cnt*h_change_group_cnt,
       CV_TIME_QTY   = h_cv_line_time_qty,
       UPDATE_DATE   = sysdate
      WHERE SIM_INDEX  = h_sim_index
        AND YEAR_DATE = substr(h_plan_start_week,0,4)
        AND SECT = h_sect_code
        AND SHOP_CODE = h_line
        AND PROD_GROUP = h_prod_group
        AND PLAN_WEEK = substr(h_plan_start_week,5,2)
       ;
     EXCEPTION
     WHEN OTHERS THEN
      outmessage := sqlerrm ;
      ROLLBACK ;
      RETURN ;
     END ;

     IF sql%rowcount = 0 THEN
      BEGIN
       INSERT INTO CAP_SOP_PROD_LINE_INFO
        (SIM_INDEX,YEAR_DATE,PLAN_WEEK, SECT,SHOP_CODE,PROD_GROUP,PROD_QTY, CV_LINE_CNT,CHANGE_GROUP_CNT, CV_RUN_LINE_CNT,CV_TIME_QTY,CV_LINE_APPLIED_CNT, INSERT_DATE)   
       VALUES (h_sim_index,substr(h_plan_start_week,0,4),substr(h_plan_start_week,5,2),h_sect_code,h_line,h_prod_group,h_prod_qty,h_line_cnt,h_change_group_cnt,h_line_cnt*h_change_group_cnt,h_cv_line_time_qty,h_line_cnt*h_change_group_cnt,
         sysdate)
       ;
      EXCEPTION
      WHEN OTHERS THEN
       outmessage := sqlerrm ;
       ROLLBACK ;
       RETURN ;
      END ;
     END IF ;
    END ;

   END LOOP;
   CLOSE cur_line_rate_pcb;
  
   h_plan_start_week := h_plan_start_week + 1;
   
    IF  h_term_flag ='M'  THEN
     IF substr(h_plan_start_week,5,2) = 13  THEN
      h_plan_start_week := (substr(h_plan_start_week,0,4) + 1) || '01';
      END IF;     
   ELSE
     IF substr(h_plan_start_week,5,2) > h_max_week  THEN
      h_plan_start_week := (substr(h_plan_start_week,0,4) + 1) || '01';
      END IF;
   
   END IF;
    -- dbms_output.put_line('<<||PCBPCB======='||h_plan_start_week);

   IF h_plan_start_week > h_plan_end_week THEN
   EXIT;
   END IF;

  END LOOP;
  END IF;
  COMMIT WORK;

  --   dbms_output.put_line('<<||eroereorere');
  OPEN cur_cap_sop_simulate ;
  LOOP 
   FETCH cur_cap_sop_simulate
   INTO h_year_date,h_plan_week,h_prod_group;
   EXIT WHEN cur_cap_sop_simulate%NOTFOUND;
   
   BEGIN   
    INSERT INTO CAP_SOP_SIMULATE
     (SIM_INDEX,YEAR_DATE,PLAN_WEEK,PROD_GROUP, INSERT_DATE)   
    VALUES (h_sim_index,h_year_date,h_plan_week,h_prod_group, sysdate)
    ;

    EXCEPTION
    WHEN OTHERS THEN
     outmessage := sqlerrm ;
     ROLLBACK ;
     RETURN ;
   END ;

   BEGIN
    BEGIN
     SELECT  sum( CV_LINE_CNT), sum( CV_RUN_LINE_CNT)
     INTO  h_cv_line_cnt2,h_cv_run_line_cnt
     FROM (SELECT  SHOP_CODE,  CV_LINE_CNT, CV_RUN_LINE_CNT
     FROM CAP_SOP_PROD_LINE_INFO
     WHERE SIM_INDEX = h_sim_index
       AND YEAR_DATE = h_year_date
       AND PROD_GROUP = h_prod_group)
    -- GROUP BY PROD_GROUP
     ;
    EXCEPTION
    WHEN OTHERS THEN
     outmessage := sqlerrm ;
     RETURN ;
    END ;

    UPDATE CAP_SOP_SIMULATE
    SET 
     CV_RUN_LINE_CNT  = h_cv_run_line_cnt,
     CV_LINE_CNT   = h_cv_line_cnt2,
     UPDATE_DATE   = sysdate
    WHERE SIM_INDEX = h_sim_index
      AND YEAR_DATE = h_year_date
      AND PROD_GROUP = h_prod_group
     ;

   EXCEPTION
   WHEN OTHERS THEN
    outmessage := sqlerrm ;
    ROLLBACK ;
    RETURN ;
   END ;

   IF (s_analysis_flag = '') OR (s_analysis_flag IS NULL) THEN
    RETURN;
   ELSE
    h_analysis_flag := s_analysis_flag ;
   END IF;

   /*=G@{,@/=G,@[>w=C0#18GT*/
   BEGIN
    SELECT pdm.line_category, pdm.prod_group,     
      nvl(sum(pdm.prod_qty),0) prod_qty,
      nvl(sum(pdm.loss_time),0) loss_time,
      nvl(sum(pdm.work_time),0) work_time
    INTO  h_line_type, h_time_prod_group, h_time_prod_qty, h_loss_time, h_work_time
    FROM (
     SELECT  decode(w.line_category,'C','C','V') line_category,
       nvl(v.prod_group,'ETC') prod_group,
       nvl(sum(v.prod_qty),0) prod_qty,
       sum(nvl(v.loss_time,0)) loss_time, sum(nvl(v.access_time,0)) work_time
     FROM pac_day_mdl_perfmc v,bsc_depart d,bsc_sect p,bsc_line w,bsc_route r
     WHERE v.sect = p.sect 
     AND  p.depart_code = d.depart_code
     AND  v.sect = w.sect 
     AND  v.shop_code = w.shop_code 
     AND  v.sect = r.sect
     AND  v.shop_code = r.shop_code 
     AND  v.route_code = r.route_code
     AND  v.sect  in (select sect from bsc_sect
         where plant_code = s_plant)
     AND  p.outgoing = 'N'  
     AND  w.outgoing = 'Y'
     AND  r.outgoing = 'Y' 
     AND  v.work_date between s_from_date and s_to_date
     AND  nvl(v.prod_group,'ETC') = h_prod_group
     AND  v.analysis_flag like 'Y'
     AND  0 < ( SELECT decode('%','%',1,count(*))
         FROM bsc_line_type_hist lt
         WHERE lt.sect = v.sect
         AND  lt.shop_code = v.shop_code
         AND  lt.line_category like '%'
         AND  v.work_date between start_date  and end_date)
     GROUP BY decode(w.line_category,'C','C','V'), nvl(v.prod_group,'ETC')
    )PDM
    GROUP BY pdm.line_category, pdm.prod_group;
   EXCEPTION
   WHEN OTHERS THEN
    outmessage := sqlerrm ;
    RETURN ;
   END;

   IF h_analysis_flag ='A' THEN 

    IF (h_work_time - h_loss_time) <= 0 or h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN
     h_cv_time_qty := 0;
    ELSE
     h_cv_time_qty := round(h_time_prod_qty *60 /(h_work_time - h_loss_time) ,0);
    END IF;

    IF h_cv_time_qty  <  0 THEN
     h_cv_time_qty := 0;
    END IF;

   ELSE
    IF h_time_prod_qty = 0 or h_work_time = 0 or h_time_prod_qty is null or h_work_time is null THEN  
     h_cv_time_qty := 0;
    ELSE
     h_cv_time_qty := round((h_time_prod_qty*60)/h_work_time,0) ;
    END IF;

   END IF; 

   BEGIN
    UPDATE CAP_SOP_SIMULATE
    SET CV_TIME_QTY  = h_cv_time_qty,
     UPDATE_DATE   = sysdate
    WHERE SIM_INDEX = h_sim_index
      AND YEAR_DATE = h_year_date
      AND PLAN_WEEK = h_plan_week
      AND PROD_GROUP = h_time_prod_group
     ;

   EXCEPTION
   WHEN OTHERS THEN
    outmessage := 'ERROR' ;
    ROLLBACK ;
    RETURN ;
   END ;

  END LOOP;
  CLOSE cur_cap_sop_simulate;
  COMMIT WORK;

 END IF;

END s_cap_sop_simulate;
/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!