OA电子表单设计-年假申请单-数据验证

     OA从年初上线到现在已经过去半年了,时光飞逝。

     上月底,行政文员找到我,说最近有新来的部门文员填《年假申请单》时,有乱填的情况,让我想办法处理。

     我一查还真是,这文员是个男的,同一天给同一个人居然填了7张单据。被主管×回了4张,还√了3张。

     于是,我给行政文员出主意,要不流程第一关设置成你审批,单据填写正常,才到各自主管审批,否则你就×回去重填,行政文员当时同意了,反正纸质也是她审批。

     第二天,情况发生了变化,行政经理不同意第一关由文员审批这样的做法,啥原因也没说,好吧,听官大的,只能从程序的角度想办法去避免这样的错误发生了。

     于是,有了下面的SQL代码:

declare @date char(8), -- 入职日期
        @today char(8),-- 服务器当天日期
        @year_yn int,  -- 初始年限(不判断是否满年)
        @year int,     -- 实际年假年限
        @start_date char(8), -- 年假起始日期
        @end_date char(8),   -- 年假终止日期
        @day int             -- 年假天数
set @date='20111212'
set @today =  convert(char(8),getdate(),112)
set @year_yn = convert(int,left (@today,4)) - convert(int,left(@date,4))
set @year = (select  case when right (@today,4) >= right(@date,4) then @year_yn else @year_yn-1 end)
set @start_date = convert(char(4),(convert(int, left(@date,4)) + @year -1))  + right(@date,4) 
set @end_date =  convert(char(4),(convert(int, left(@date,4)) + @year))  + right(@date,4)
--年假说明,5年以下5天,5-9年 7天,10年以上10天
set @day = (select case when @year<=4 then 5 when @year >4 and @year <10 then 7 when @year >=10 then 10 end )
print @date 
print @year
print @start_date
print @end_date
print @day

--result
20111212   → 入职日期
2          → 初始年限
20121212   → 年假起始日期
20131212   → 年假结束日期
5          → 年假天数

      由于OA开窗取数据MIMJ程序不支持以上的T-SQL语句,于是第一反应是写个SQL表值函数,于是有了下面的函数代码:

CREATE function InTime (@workTime Varchar(20),@serverToday char(8))     
returns @temptable table(date1 char(8),date2 char(8),dayCount int)       
as      
begin      
    
declare @date Varchar(20), -- 入职日期  
        @today char(8),-- 服务器当天日期  
        @year_yn int,  -- 初始年限(不判断是否满年)  
        @year int,     -- 实际年假年限  
        @start_date char(8), -- 年假起始日期  
        @end_date char(8),   -- 年假终止日期  
        @day int             -- 年假天数  
set @date=@workTime  
set @today = @serverToday  
set @year_yn = convert(int,left (@today,4)) - convert(int,left(@date,4))  
set @year = (select  case when right (@today,4) >= right(@date,4) then @year_yn else @year_yn-1 end)  
set @start_date = convert(char(4),(convert(int, left(@date,4)) + @year))  + right(@date,4)  
set @end_date = convert(char(4),(convert(int, left(@date,4)) + @year -1))  + right(@date,4)  
--年假说明,5年以下5天,5-9年 7天,10年以上10天  
set @day = (select case when @year<=4 then 5 when @year >4 and @year <10 then 7 when @year >=10 then 10 end )  
insert into @temptable  select  @start_date,@end_date,@day  
return      
end

     注:为什么函数要加2个参数,一个【入职日期】参数不就可以了么,因为SQL表值函数不支持动态数据。

      觉得这个函数有2个参数还是不好使,算了,还是换存储过程吧,于是有了下面的存储过程代码:

create proc worktime    
@workTime Varchar(20)  
as  
declare @date Varchar(20), -- 入职日期  
        @today char(8),-- 服务器当天日期  
        @year_yn int,  -- 初始年限(不判断是否满年)  
        @year int,     -- 实际年假年限  
        @start_date char(8), -- 年假起始日期  
        @end_date char(8),   -- 年假终止日期  
        @day int             -- 年假天数  
set @date=@workTime  
set @today = convert(char(8),getdate(),112)  
set @year_yn = convert(int,left (@today,4)) - convert(int,left(@date,4))  
set @year = (select  case when right (@today,4) >= right(@date,4) then @year_yn else @year_yn-1 end)  
set @start_date = convert(char(4),(convert(int, left(@date,4)) + @year))  + right(@date,4)  
set @end_date = convert(char(4),(convert(int, left(@date,4)) + @year -1))  + right(@date,4)  
--年假说明,5年以下5天,5-9年 7天,10年以上10天  
set @day = (select case when @year<=4 then 5 when @year >4 and @year <10 then 7 when @year >=10 then 10 end )  
select  @start_date 起始日期,@end_date 终止日期,@day 年假天数

     想了想存储过程也不好使,如果领导要看所有人的年假明细表,那么岂不是又要折腾,于是,有了下面视图代码:

create view userworktime
as 
select 工号 a,姓名 b,入职日 c,起始日 d,结束日 e,case when 实际年限>0 then 年假天数 else 0 end  f,
isnull(天数汇总,0) g,case when 实际年限>0 then 年假天数 else 0 end -isnull(天数汇总,0) h
from
(
select * ,convert(char(4),(convert(int, left(入职日,4)) + 实际年限 -1))  + right(入职日,4) 起始日,
          convert(char(4),(convert(int, left(入职日,4)) + 实际年限))  + right(入职日,4) 结束日,
          case when 实际年限<=4 then 5 when 实际年限 >4 and 实际年限 <10 then 7 when 实际年限 >=10 then 10 end 年假天数
from
(
select *,case when right (系统日,4) >= right(入职日,4) then 初始年限 else 初始年限-1 end 实际年限
from
(
select *,convert(int,left (系统日,4)) - convert(int,left(入职日,4)) 初始年限
from
(
select EmpNO 工号,EmpName 姓名,convert(char(8),WorkTime,112) 入职日,convert(char(8),getdate(),112) 系统日
from DoorSV.IMSDB.dbo.Employee
WHERE WorkTime <>'' 
) aaa
) bbb
) ccc

) ddd
left join (
select 编号,年假起始日期,年假终止日期,sum(本次天数) 天数汇总
from
(
select newopenquery1 编号,newopenquery1C 姓名,datetime1 入职日期,text4 年假天数,text1 已请天数,datetime5 请假起,datetime6 请假止,text6 本次天数,datetime2 年假起始日期,
datetime3 年假终止日期,CASE WHEN resda021='1' THEN '未完成' WHEN resda021='2' THEN '同意' WHEN resda021='3' THEN '不同意' WHEN resda021='4' THEN '已抽单'  END 签核结果 
from hr07
join resda on resda002=hr07002 and resda001='HR07'
where resda021='2' and text6<>0
) xxx
group by 编号,年假起始日期,年假终止日期
) yyy on  编号=工号  COLLATE Chinese_PRC_CI_AS and 起始日 = 年假起始日期  COLLATE Chinese_PRC_CI_AS and  结束日 = 年假终止日期  COLLATE Chinese_PRC_CI_AS
 

     最终结果:

    

        SQL代码确认好之后,修改MIMJ开窗和HR07_MIMJ.aspx 取值关联,再加入JavaScript验证代码,大功告成。

       

   

 

    总结:设计电子表单原则——数据管控(只读,数值范围)和历史数据交互是非常重要的,应遵循ERP流程和程序设计思路,“严谨、规范、科学、效率”。

转载于:https://www.cnblogs.com/cyg17173/p/3951377.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值