0
点赞
收藏
分享

微信扫一扫

SQL Server存储过程实列


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- 存储过程 函数开始
ALTER procedure [dbo].[sp_generate_billing_eod] (
 @biller varchar(10), 输入
 @EODDate varchar(10), 输入
 @result char(200) OUT 输出
) as 存储过程开始
declare @job varchar(20) 定义变量
declare @billingID char(20)
declare @sumpremium decimal(18,2)
declare @cnt int
declare @lastsettledate datetime
declare @effectiveDate datetime
declare @expireDate datetime
declare @effectiveHour int
declare @expireHour int
declare @effectiveDateTemp varchar(20)
declare @expireDateTemp varchar(20)
 
declare @contractID char(10)
declare @masterPolnum char(10)
declare @nextsettledate datetime
declare @payupperiod int
declare @valid_group_policys int
declare @settleUnit char(2)

set @result = 'EOD failed.' 赋值
set @job = 'EOD BILLING';

--EOD已运行,则不再运行, 查询并赋值
select @cnt = count(1) from t_eod_log where eodtime = @EODDate and jobname = @job;

if @cnt > 0 判断
begin
 set @result = @EODDate + ' EOD has runned.'
 return
end

set xact_abort on

--事物开始
begin transaction

--记录日志: 开始时间
insert into t_eod_log (eodtime, jobname, starttime, operator) values (@EODDate, @job, getdate(), @biller);

--待处理的团单, 定义一个Cursor for 后面的是为这个Corsor赋值
declare CURSOR_TG_POLICY cursor for
 select t.contractid, t.polnum, c.lastsettledate
 from t_tg_policy t, t_contract c
 where t.contractid = c.contractid
  and t.flag in ('A', 'S')
  and datediff(day, c.nextsettledate, @EODDate) >= 0
  and c.contracttype = 'EBS';
--循环处理每一授权机构 打开一个Cursor
open CURSOR_TG_POLICY

--获取Cursor中的数据到定义的变量中,获取状态会保存在@@FETCH_STATUS中
fetch next from CURSOR_TG_POLICY into @contractID, @masterPolnum, @lastsettledate


--循环开始, do{}while 循环
while @@FETCH_STATUS = 0
begin
 --有效分单数大于等于团单要求人数方可结账
 select @cnt = count(1)
 from t_policy t
 where t.status in ('08', '09', '10', '43')
  and gtamasterpolnum = @masterPolnum;

--取出团单最小要求人数,缺省为5
 select @valid_group_policys = value
 from t_sys_parameter
 where lower(name) = lower('SizeOfMemberforBatchBilling');
 if @valid_group_policys is null
  set @valid_group_policys = 5;

if @cnt >= @valid_group_policys
 begin
  --计算billingID:billType + yyyymmdd + 5位当日顺序号
  select @cnt = max(cast(substring(billingID,11,5) as int)) + 1
  from t_billing
  where billingdate = @EODDate;

 if @cnt is NULL
   set @cnt = 1
  set @billingID = 'EB' + replace(@EODDate, '-','') + substring(ltrim(100000 + @cnt), 2, 5)

 --计算保单数和保费
  SELECT @cnt = count(1), @sumpremium = sum(t.premium)
  FROM t_policy t
  where not exists (select 1 from t_billing_policy p where p.polnum = t.polnum)
   and t.status = '08'
   and t.gtamasterpolnum = @masterPolnum;

 --出账单后催款缓冲期
  select @payupperiod = payupperiod
  from t_billingtime;

 --生成账单
  --账单开始日为上一结算日 + 1
  --如果上一结算日为null,则为合约客户生效日
  if (@lastsettledate is null) or (@lastsettledate = '')
   select @lastsettledate = effectivedate
   from t_contract
   where contractid = @contractID;
  else
   set @lastsettledate = dateadd(day, 1, @lastsettledate)

 --可结算分单数量为0不生成账单
  if (@cnt <> 0)
  begin
   insert into t_Billing(billingID, billingDate, status, contractID, masterpolnum, policycount, sumPremium, payupdate, billingfrom, billingto, biller)
   values (@billingID, @EODDate, '10', @contractID, @masterPolnum, @cnt, @sumPremium, dateadd(day, @payupperiod, @EODDate), @lastsettledate, @EODDate, @biller);

  --记录已生成账单的分单号码
   insert into t_billing_policy (billingID, polnum)
   select @billingID, p.polnum
   from t_policy p
   where not exists (select 1 from t_billing_policy b where p.polnum = b.polnum)
    and p.status = '08' --已审核
    and p.gtamasterpolnum = @masterPolnum;
  end;

 --更新最后结账日期
  update t_contract
   set lastsettledate = @EODDate, lastmodifier = @biller
  where contractID = @contractID;

 --更新最后结账日期,标记老团单为Batch过,不再使用
  update t_tg_policy
   set lastsettledate = @EODDate,
    flag = 'B',
    lastupduser = @biller,
    lastupddate = getdate()
  where polnum = @masterPolnum;

 --计算团单生效日期、满期日期
  select @effectiveDate = min(effectivedate),
    @expireDate = max(dateadd(day, period, effectivedate))
  from t_policy
  where status in ('08', '09', '10', '43')
   and gtamasterpolnum = @masterPolnum;
 

-- add day2  添加修改HOUR字段(主单小时字段)  20130122 nsnp398 start
       
        set @effectiveDateTemp=substring(convert(varchar(20), @effectiveDate, 120),12,8);
         if(@effectiveDateTemp is null or @effectiveDateTemp='' or @effectiveDateTemp='23:59:59')
         set @effectiveHour='24';
         else
          set @effectiveHour=datepart(hh, @effectiveDate);
        
        set @expireDateTemp=substring(convert(varchar(20), @expireDate, 120),12,8);
        if(@expireDateTemp is null or @expireDateTemp='' or @expireDateTemp='23:59:59' or (datediff(ss ,'23:00:00',@expireDateTemp)>0 and datediff(ss ,'23:59:59',@expireDateTemp)<=0))
         set @expireHour='24'
         else
            set @expireHour=datepart(hh, @expireDate);
        
 --add  添加修改HOUR字段(主单小时字段 ) day2   

 --生效日期为空时,更新团单生效日期;
  --满期日期为空时,更新团单满期日期
  update t_tg_policy
   set effectivedate = convert(varchar(10), @effectiveDate, 120),
    expiredate = convert(varchar(10), @expireDate, 120),
    period  = datediff(day, @effectiveDate, @expireDate),
    lastupduser = @biller,
-- add day2  添加修改HOUR字段(主单小时字段)  20130122 nsnp398 start
effectiveHour=@effectiveHour,
 expireHour=@expireHour,            
-- add day2  添加修改HOUR字段(主单小时字段)  20130122 nsnp398 end
    lastupddate = getdate()
  where (expiredate is null or effectivedate is null or expiredate ='' or effectivedate ='')
   and polnum = @masterPolnum;

 --生成新团单
  insert into t_tg_policy (polnum,contractID,company,city,corpName,flag,status,period,effectivedate, expiredate,effectiveHour,expireHour
   ,serviceAgent,sscCode,linkman,telephone,zip,address,email,fax,bankCode,bankName,bankAccount
   ,memberConstitute,memberCount,discountRate,allowaddmember, signDate, createDate,createUser,lastUpdDate,lastUpdUser)
  select (select 'TG' + cast((max(cast(substring(polnum,3,8) as bigint)) + 1) as char(8))
    from t_tg_policy
    where company = (select company from t_contract where contractid = @contractID))
   , t.contractID, t.company, t.city, t.corpName, 'A','00', 0, '', '', 24, 24
   , t.serviceagent, a.ssccode, t.linkman, t.telephone, t.zip, t.address, t.email, t.fax, t.bankcode, t.bankname, t.bankaccount, 0, 0
   , t.discountrate, 1, dateadd(day, 1, @EODDate), getdate(), @biller, getdate(), @biller
  from t_contract t, t_agent a
  where t.serviceagent = a.code
   and t.company = a.company
   and t.contractid = @contractID;
 end

--更新下一次结算日
 --结算周期单位为天,则为下一结算日 + 结算周期
 select @effectivedate = effectivedate,
   @settleUnit = settleunit,
   @nextsettledate = case settleunit
         when '天' then dateadd(day, settleperiod, @EODDate)
         when '月' then dateadd(day, -1, dateadd(month, settleperiod + datediff(month, dateadd(day, -1, effectivedate), nextsettledate), effectivedate))
        end
 from t_contract
 where contractid = @contractID;

 update t_contract
  set nextsettledate = @nextsettledate, lastmodifier = @biller
 from t_contract
 where contractID = @contractID;

--处理下一个授权机构,再次从Cursor里面获取一个数据到定义的变量中 获取状态会保存在@@FETCH_STATUS中
 fetch next from CURSOR_TG_POLICY into @contractID, @masterPolnum, @lastsettledate
end


--回收Cursor空间
close CURSOR_TG_POLICY
deallocate CURSOR_TG_POLICY

--记录日志 - 任务结束

update t_eod_log set endtime = getdate() where seqno = (select max(seqno) from t_eod_log where jobname = @job and eodtime = @EODDate);

set @result = 'EOD of ' + @EODDate + ' success.'

--提交事物
commit transaction


举报

相关推荐

0 条评论