CREATE DEFINER=`root`@`%` PROCEDURE `sp_GetWangingsCount`(IN `PCode` VARCHAR(50), IN `FromDay` DATE, IN `Cycle` INT, IN `DayCount` INT, OUT `Rlt` INT, OUT `DayStr` VARCHAR(520))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
if Date_Add(FromDay, interval DayCount-1 day) < date(now()) then
set Rlt = 0;
else
set @n = floor((datediff(date(now()), FromDay) + 1) / Cycle);
set Rlt = 0;
set DayStr = '';
set @i=1;
while @i <= @n do
set @_FromDay = Date_Add(FromDay, interval DayCount/Cycle*(@i-1) - 1 day) ;
if @_FromDay <= date(now()) then
if @i < @n then
set @_ToDay = Date_add(date(FromDay), interval DayCount/Cycle*@i day);
else
set @_ToDay = Date_add(date(Fromday), interval DayCount-1 day);
end if;
if datediff(@_ToDay, now()) > 0 then
set @_ToDay = date(now());
end if;
select @k:=if(sum(sa_money)/datediff(@_ToDay, @_FromDay) < 1000, 1 ,0)
from `t_sale`
where sa_code = PCode and sa_date between @_FromDay and @_ToDay;
set Rlt = Rlt + @k;
select @i, @_FromDay, @_ToDay, @k, Rlt;
if @k = 1 then
if DayStr = '' then
set DayStr = concat(DayStr, @_FromDay, '-', @_ToDay);
else
set DayStr = concat(DayStr, ',', @_FromDay, '-', @_ToDay);
end if;
end if;
end if;
set @i = @i + 1;
end while;
end if;
END
CREATE DEFINER=`root`@`%` PROCEDURE `showWarnings`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'ShowWarnigsDay'
BEGIN
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
declare a_code varchar(50);
declare cur cursor for select * from `t_temp`;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
create table t_tmp
select
b.ps_name ps_name,
a.p_code p_code,
a.p_name p_name,
a.p_scale p_scale,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code) as sa_money,
p_scale-(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code) as sa_left,
datediff(p_EndDate,p_BeginDate) as dayLeft,
floor(datediff(a.p_EndDate, a.p_BeginDate)/7) as LeftWeek,
a.p_period p_period,
a.p_BeginDate p_eginDate,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code)/a.p_scale*100 As Percent,
1 as`预警次数` ,
1 as`破线次数` ,
'2014-08-10' as`破线日期` ,
(select w_color from t_warning d where d.w_code=a.p_code) as W_color,
1 as `当日破线`
from t_product a
left join t_product_sort b on a.p_sort=b.ps_id and a.p_sort in ('1','2');
-- 打开游标
OPEN cur;
-- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO a_code;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
call `spGetWangingsCount`(a_code, '', '', '');
update t_temp set `预警次数`=@;
END LOOP;
-- 关闭游标
CLOSE cur;
END
****************
CREATE DEFINER=`root`@`%` PROCEDURE `sp_showWarnings`(IN `sBeginDate` VARCHAR(50), IN `sEndDate` VARCHAR(50), IN `sProductSort` VARCHAR(200), IN `sOrderby` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '显示产品预警报表'
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a_code varchar(50);
DECLARE cur cursor for select `p_code` from `t_tmp`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
if (sBeginDate = '') and (sEndDate = '') then
set sBeginDate = '2000-01-31 00:00:00';
set sEndDate = '2099-12-31 00:00:00';
end if;
drop table if exists `t_tmp`;
if sProductSort = '' then
create table `t_tmp`
select
b.ps_name ps_name,
a.p_code p_code,
a.p_name p_name,
(select sum(aa.pu_money) from t_publish aa where aa.pu_code=a.p_code) p_scale,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate ) as sa_money,
p_scale-(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate ) as sa_left,
datediff(p_EndDate,p_BeginDate) as dayLeft,
floor(datediff(a.p_EndDate, a.p_BeginDate)/7) as LeftWeek,
a.p_period p_period,
a.p_BeginDate p_eginDate,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate )/a.p_scale*100 as Percent,
0 as`warningnum`,
0 as`outlinenum`,
' ' as`outlinedate`,
(select w_color from t_warning d where d.w_code=a.p_code) as W_color,
0 as `curdateoutline`
from t_product a left join t_product_sort b
on a.p_sort=b.ps_id and a.p_enddate>=curdate();
else
-- set sProductSort = concat('\'', sProductSort, '\'');
-- set sProductSort = replace(sProductSort, ',', '\',\'');
create table `t_tmp`
select
b.ps_name ps_name,
a.p_code p_code,
a.p_name p_name,
(select sum(aa.pu_money) from t_publish aa where aa.pu_code=a.p_code) p_scale,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate ) as sa_money,
p_scale-(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate ) as sa_left,
datediff(p_EndDate,p_BeginDate) as dayLeft,
floor(datediff(a.p_EndDate, a.p_BeginDate)/7) as LeftWeek,
a.p_period p_period,
a.p_BeginDate p_eginDate,
(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code and c.sa_time between sBeginDate and sEndDate )/a.p_scale*100 as Percent,
0 as`warningnum`,
0 as`outlinenum`,
'' as`outlinedate`,
(select w_color from t_warning d where d.w_code=a.p_code) as W_color,
0 as `curdateoutline`
-- from t_product a , t_product_sort b
-- where a.p_sort=b.ps_id and a.p_enddate>=curdate();
from t_product a left join t_product_sort b
on a.p_sort=b.ps_id and a.p_enddate>=curdate()
and LOCATE(a.`p_sort`, sProductSort)>0;
end if;
ALTER TABLE `t_tmp`
CHANGE COLUMN `outlinedate` `outlinedate` VARCHAR(300) NOT NULL DEFAULT '' AFTER `outlinenum`;
OPEN cur;
read_loop: LOOP
FETCH cur INTO a_code;
IF done THEN
LEAVE read_loop;
END IF;
set @rlt=0;
set @days='';
select @wnum:=w_num from t_warning where `w_code`= a_Code;
select @cycle:=p_Cycle from t_product where `p_code`=a_code;
CALL `sp_GetWangingsCount`(a_Code, sBeginDate, @wnum, @cycle, @rlt, @days);
/*select @rlt;
--select @days;
*/
update `t_tmp` set `warningnum`= @rlt, `outlinedate`= @days where `p_code`= a_Code;
END LOOP;
CLOSE cur;
select * from t_tmp;
end