turnrule.pas
来自「pasa人力资源考勤管理系统」· PAS 代码 · 共 1,474 行 · 第 1/4 页
PAS
1,474 行
end;
procedure TFormturnrule.Button1Click(Sender: TObject);
Var adoqry,Adoqry1:Tadoquery ;
Lt:integer ;
begin
try
if (strtodate(maskedit1.text))>(strtodate(maskedit2.text)) then
begin
showmessage('对不起,您输入的日期有误!');
exit;
end;
except
showmessage('对不起,您输入的日期有误!');
exit;
end;
Adoqry :=Tadoquery.Create (self);
Adoqry1 :=Tadoquery.Create (self);
try
datamod.ADOQuery2.close ;
datamod.ADOQuery2.SQL.Text :='select * from pub06010 where comcode='''+trim(combobox1.text)+''' ';
datamod.ADOQuery2.open ;
if datamod.ADOQuery2.Eof then
begin
showmessage('对不起,该行事历编码不存在!') ;
exit ;
end ;
Screen.Cursor := crHourglass ;
datamod.ADOQuery2.close ;
Adoqry.Connection :=Datamod.Database1 ;
Adoqry1.Connection :=Datamod.Database1 ;
Adoqry.Close ;
Adoqry.SQL.Text :='select * from turn02010 where ruleno='''+dbedit5.Text+''' ' ;
Adoqry.Open ;
if adoqry.Eof then
begin
showmessage('对不起,这个轮班规则没有存入资料库,请存档再产生') ;
exit ;
end
else begin
if adoqry.FieldByName('flag').asstring='0' then //第一次产生轮班班表
begin
if adoturnrule.fieldbyname('dayormonth').asstring='月中' then firstclassdown(0,1);
if adoturnrule.FieldByName('dayormonth').asstring='日' then Firstclassday(0,1) ;
if adoturnrule.FieldByName('dayormonth').asstring='月' then FirstclassMonth(0,1) ;
if (adoturnrule.FieldByName('dayormonth').asstring='半月') and (adoturnrule.FieldByName('month15').asinteger>=1) and (adoturnrule.FieldByName('month15').asinteger<=31) then FirstclassMonth15(0,1) ;
end
else if adoqry.FieldByName('flag').asstring='1' then //非第一次产生轮班班表
begin
if (strtodate(maskedit1.Text)-strtodate((adoqry.FieldByName('Edate').asstring)))<0 then
begin
showmessage('对不起,开始日期不能在上一次输班结束日期之前') ;
Screen.Cursor := crdefault ;
exit ;
end
else begin
maskedit1.Text :=datetostr(adoqry.FieldByName('Edate').asdatetime+1) ;
lt:=adoqry.FieldByName('lastday').asinteger ;
if adoturnrule.FieldByName('dayormonth').asstring='日' then Firstclassday(Lt,trunc(adoqry.FieldByName('Ldate').asdatetime-adoqry.FieldByName('Edate').asdatetime)) ;
if adoturnrule.FieldByName('dayormonth').asstring='月' then FirstclassMonth(Lt,trunc(adoqry.FieldByName('Ldate').asdatetime-adoqry.FieldByName('Edate').asdatetime)) ;
if (adoturnrule.FieldByName('dayormonth').asstring='半月') and (adoturnrule.FieldByName('month15').asinteger>=1) and (adoturnrule.FieldByName('month15').asinteger<=31) then FirstclassMonth15(Lt,trunc(adoqry.FieldByName('Ldate').asdatetime-adoqry.FieldByName('Edate').asdatetime)) ;
end;
end;
adoqry.Close ;
end;
Screen.Cursor := crdefault ;
showmessage('亲爱的用户,您成功的产生了轮班班表!') ;
adoturn.close;
adoturn.open;
except
Screen.Cursor := crdefault ;
adoqry.Free ;
adoqry1.Free ;
showmessage('对不起,产生轮班表时出错') ;
end;
end;
procedure TFormturnrule.FirstclassDay(Lt,ki:integer) ; //第一次产生轮班班表(日轮)
var Turn,kind:integer ; //Turn是周期,kind是几种班次参与轮
ary1,ary2 :Tadoquery ;
i,k,t:integer ;
date1 :Tdate ;
ban :array [1..8] of string ; //原班次编号
Tban:Array [1..8] of string ; //存放的班次应轮的班次编号
Jban:Array [1..8] of string ; //交接班次
whichclass :string ;
begin
ary1 :=Tadoquery.Create (self) ;
ary1.Connection :=Datamod.Database1 ;
ary2 :=Tadoquery.Create (self) ;
ary2.Connection :=Datamod.Database1 ;
try
Turn:=Adoturnrule.fieldbyname('circle').asinteger ;
Kind:=Adoturnrule.fieldbyname('schenum').asinteger ;
k:=0;
if (Turn=0) or (Kind=0) then
begin
showmessage('轮班规则和轮班周期不能为0') ;
exit;
end;
ary2.SQL.Text :='select * from turn02010 where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+'''' ;
ary2.Open ;
if not ary2.Eof then
begin
ban[1] :=ary2.fieldbyname('classno1').asstring ;
ban[2] :=ary2.fieldbyname('classno2').asstring ;
ban[3] :=ary2.fieldbyname('classno3').asstring ;
ban[4] :=ary2.fieldbyname('classno4').asstring ;
ban[5] :=ary2.fieldbyname('classno5').asstring ;
ban[6] :=ary2.fieldbyname('classno6').asstring ;
ban[7] :=ary2.fieldbyname('classno7').asstring ;
ban[8] :=ary2.fieldbyname('classno8').asstring ;
Tban[1] :='' ;
Tban[2] :='' ;
Tban[3] :='' ;
Tban[4] :='' ;
Tban[5] :='' ;
Tban[6] :='' ;
Tban[7] :='' ;
Tban[8] :='' ;
Jban[1] :=Adoturnrule.fieldbyname('sche11').asstring ;
Jban[2] :=ADoturnrule.fieldbyname('sche12').asstring ;
Jban[3] :=ADoturnrule.fieldbyname('sche13').asstring ;
Jban[4] :=ADoturnrule.fieldbyname('sche14').asstring ;
Jban[5] :=ADoturnrule.fieldbyname('sche15').asstring ;
Jban[6] :=ADoturnrule.fieldbyname('sche16').asstring ;
Jban[7] :=ADoturnrule.fieldbyname('sche17').asstring ;
Jban[8] :=ADoturnrule.fieldbyname('sche18').asstring ;
end
else begin
ary1.free ;
ary2.Close ;
ary2.Free ;
end;
ary2.Close ;
for i:=1 to kind do //多少个班次
begin
date1:=strtodate(maskedit1.text) ;
whichclass :=ban[i] ;
t :=Lt ;
if i=1 then
k :=ki
else
k:=i ;
while date1<=strtodate(maskedit2.text) do
begin
ary1.Close ;
ary1.SQL.Text :='select * from pub06010 where comcode='''+combobox1.text+''' and comdate='''+datetostr(date1)+''' ' ;
ary1.open ;
if ADoturnrule.FieldByName('rest').asboolean or ary1.Eof or (not ADoturnrule.FieldByName('Norestbu').asboolean and not ADoturnrule.FieldByName('rest').asboolean) then //节假日是否参与轮休
begin
t :=t+1 ;
if (t mod turn =0) and (jban[k]<>'') then
whichclass :=Jban[k] ; //有交接班次
if ((t-1) mod turn=0) and (t<>1) then //往下面轮
begin
k :=(k+1) mod kind ;
if k=0 then k :=kind ;
whichclass :=ban[k];
end;
end;
Ary2.SQL.Text :='insert turn01010 select '''+ADoturnrule.fieldbyname('ruleno').asstring+''','''+datetostr(date1)+''','''+ban[i]+''', '+
'gotime1,outtime1,add1,continue1 ,decrease1,daytime1,ot1,gotime2,outtime2 ,add2 ,continue2,decrease2 ,daytime2,ot2,gotime3,outtime3,add3,continue3,'+
'decrease3,daytime3,ot3,gotime4,outtime4,add4,continue4,decrease4,daytime4,ot4,gotime5,outtime5,add5,continue5,decrease5,daytime5,ot5,''0'',''0'','''+pubworkname+''','''+formatdatetime('yyyy/mm/dd',now)+''',otkind '+
',night1,night2,night3,night4,night5,unknow1,unknow2,unknow3,unknow4,unknow5,unatdxia '+
' from atd01010 where scheno='''+whichclass+''' ' ;
ary2.ExecSQL ;
date1 :=date1+1 ;
end;
Tban[i] :=whichclass ;
// i :=i+1 ;
end;
if not ADoturnrule.FieldByName('rest').asboolean then //轮班人员节假日不上班
begin
ary1.Close ;
ary1.SQL.Text :='select comdate from pub06010 where comcode='''+combobox1.Text+'''' ;
ary1.Open ;
while not ary1.Eof do
begin
ary2.SQL.Text :='update turn01010 set flag1=''X'' where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+''' and rdate='''+ary1.fieldbyname('comdate').asstring+''' ';
ary2.ExecSQL ;
ary1.Next ;
end;
end;
ary1.Close ;
ary1.SQL.Text :='update turn02010 set flag=''1'',Tclassno1='''+Tban[1]+''',Tclassno2='''+Tban[2]+''',Tclassno3='''+Tban[3]+''',Tclassno4='''+Tban[4]+''','+
' Tclassno5='''+Tban[5]+''',Tclassno6='''+Tban[6]+''',Tclassno7='''+Tban[7]+''',Tclassno8='''+Tban[8]+''',Sdate='''+maskedit1.text+''',Edate='''+maskedit2.text+''','+
' Ldate='''+datetostr(strtodate(maskedit2.text)+kind-k)+''',Lastday='''+inttostr(kind-k)+''' where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+''' ' ;
ary1.ExecSQL ;
ary1.Free ;
ary2.Free ;
except
ary1.Free ;
ary2.free ;
showmessage('对不起,产生轮班表时出错') ;
end;
end;
procedure TFormturnrule.FirstclassMonth(Lt,ki:integer) ; //第一次产生轮班班表(整月)
var Turn,kind:integer ; //Turn是周期,kind是几种班次参与轮
ary1,ary2 :Tadoquery ;
i,k,t:integer ;
date1 ,sd:Tdate ;
ban :array [1..8] of string ; //原班次编号
Tban:Array [1..8] of string ; //存放的班次应轮的班次编号
Jban:Array [1..8] of string ; //交接班次
whichclass :string ;
year,month,day :word ;
year1,month1,day1 :word ;
year2,month2,day2 :word ;
begin
ary1 :=Tadoquery.Create (self) ;
ary1.Connection :=Datamod.Database1 ;
ary2 :=Tadoquery.Create (self) ;
ary2.Connection :=Datamod.Database1 ;
try
Turn:=Adoturnrule.fieldbyname('circle').asinteger ;
Kind:=Adoturnrule.fieldbyname('schenum').asinteger ;
k:=0;
if (Turn=0) or (Kind=0) then
begin
showmessage('轮班规则和轮班周期不能为0') ;
exit;
end;
ary2.SQL.Text :='select * from turn02010 where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+'''' ;
ary2.Open ;
if not ary2.Eof then
begin
ban[1] :=ary2.fieldbyname('classno1').asstring ;
ban[2] :=ary2.fieldbyname('classno2').asstring ;
ban[3] :=ary2.fieldbyname('classno3').asstring ;
ban[4] :=ary2.fieldbyname('classno4').asstring ;
ban[5] :=ary2.fieldbyname('classno5').asstring ;
ban[6] :=ary2.fieldbyname('classno6').asstring ;
ban[7] :=ary2.fieldbyname('classno7').asstring ;
ban[8] :=ary2.fieldbyname('classno8').asstring ;
Tban[1] :='' ;
Tban[2] :='' ;
Tban[3] :='' ;
Tban[4] :='' ;
Tban[5] :='' ;
Tban[6] :='' ;
Tban[7] :='' ;
Tban[8] :='' ;
Jban[1] :=Adoturnrule.fieldbyname('sche11').asstring ;
Jban[2] :=ADoturnrule.fieldbyname('sche12').asstring ;
Jban[3] :=ADoturnrule.fieldbyname('sche13').asstring ;
Jban[4] :=ADoturnrule.fieldbyname('sche14').asstring ;
Jban[5] :=ADoturnrule.fieldbyname('sche15').asstring ;
Jban[6] :=ADoturnrule.fieldbyname('sche16').asstring ;
Jban[7] :=ADoturnrule.fieldbyname('sche17').asstring ;
Jban[8] :=ADoturnrule.fieldbyname('sche18').asstring ;
end
else begin
ary1.free ;
ary2.Close ;
ary2.Free ;
end;
ary2.Close ;
for i:=1 to kind do //多少个班次
begin
date1:=strtodate(maskedit1.text) ;
sd :=strtodate(maskedit1.text) ;
whichclass :=ban[i] ;
t :=Lt ;
if i=1 then
k :=Ki
else
k :=i ;
while (date1<=strtodate(maskedit2.text)) do
begin
decodedate(sd,year,month,day) ;
decodedate(date1,year1,month1,day1) ;
ary1.Close ;
ary1.SQL.Text :='select * from pub06010 where comcode='''+combobox1.text+''' and comdate='''+datetostr(date1)+''' ' ;
ary1.open ;
if ADoturnrule.FieldByName('rest').asboolean or ary1.Eof or (not ADoturnrule.FieldByName('Norestbu').asboolean and not ADoturnrule.FieldByName('rest').asboolean) then //节假日是否参与轮休
begin
decodedate(date1+1,year2,month2,day2) ;
if adoturnrule.FieldByName('monthkind').asstring='1' then //整月
if (month2-month<>0 ) and (jban[i]<>'') and (whichclass<>Jban[i]) then //交接班次的日期
whichclass :=Jban[i]
else if month1-month<>0 then //跨到下一个班次
begin
sd :=date1 ;
t :=t+1 ;
if t mod turn=0 then //往下面轮
begin
k :=(k+1) mod kind ;
if k=0 then k :=kind ;
whichclass :=ban[k];
end else whichclass :=ban[k] ;
end
else if month1-month=0 then whichclass :=ban[k] ;
if adoturnrule.FieldByName('monthkind').asstring='2' then
if (month2-month<>0 ) and (day-day2=0) and (jban[k]<>'') then //交接班次的日期
whichclass :=Jban[k]
else if (month1-month<>0) and (day-day1=0) then //跨到下一个班次
begin
sd :=date1 ;
t :=t+1 ;
if t mod turn=0 then //往下面轮
begin
k :=(k+1) mod kind ;
if k=0 then k :=kind ;
whichclass :=ban[k];
end else whichclass :=ban[k] ;
end
else whichclass :=ban[k] ;
end;
Ary2.SQL.Text :='insert turn01010 select '''+ADoturnrule.fieldbyname('ruleno').asstring+''','''+datetostr(date1)+''','''+ban[i]+''', '+
'gotime1,outtime1,add1,continue1 ,decrease1,daytime1,ot1,gotime2,outtime2 ,add2 ,continue2,decrease2 ,daytime2,ot2,gotime3,outtime3,add3,continue3,'+
'decrease3,daytime3,ot3,gotime4,outtime4,add4,continue4,decrease4,daytime4,ot4,gotime5,outtime5,add5,continue5,decrease5,daytime5,ot5,''0'',''0'','''+pubworkname+''','+
''''+formatdatetime('yyyy/mm/dd',now)+''',otkind '+
',night1,night2,night3,night4,night5,unknow1,unknow2,unknow3,unknow4,unknow5 ,unatdxia'+
'from atd01010 where scheno='''+whichclass+''' ' ;
ary2.ExecSQL ;
date1 :=date1+1 ;
end;
Tban[i] :=whichclass ;
// i :=i+1 ;
end;
if not ADoturnrule.FieldByName('rest').asboolean then //轮班人员节假日不上班
begin
ary1.Close ;
ary1.SQL.Text :='select comdate from pub06010 where comcode='''+combobox1.Text+'''' ;
ary1.Open ;
while not ary1.Eof do
begin
ary2.SQL.Text :='update turn01010 set flag1=''X'' where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+''' and rdate='''+ary1.fieldbyname('comdate').asstring+''' ';
ary2.ExecSQL ;
ary1.Next ;
end;
end;
ary1.Close ;
ary1.SQL.Text :='update turn02010 set flag=''1'',Tclassno1='''+Tban[1]+''',Tclassno2='''+Tban[2]+''',Tclassno3='''+Tban[3]+''',Tclassno4='''+Tban[4]+''','+
' Tclassno5='''+Tban[5]+''',Tclassno6='''+Tban[6]+''',Tclassno7='''+Tban[7]+''',Tclassno8='''+Tban[8]+''',Sdate='''+maskedit1.text+''',Edate='''+maskedit2.text+''','+
' Ldate='''+datetostr(strtodate(maskedit2.text)+kind-k)+''',Lastday='''+inttostr(kind-k)+''' where ruleno='''+ADoturnrule.fieldbyname('ruleno').asstring+''' ' ;
ary1.ExecSQL ;
ary1.Free ;
ary2.Free ;
except
ary1.Free ;
ary2.free ;
showmessage('对不起,产生轮班表时出错') ;
end;
end;
procedure TFormturnrule.FirstclassMonth15(Lt,ki:integer) ; //第一次产生轮班班表(半月)
var Turn,kind:integer ; //Turn是周期,kind是几种班次参与轮
ary1,ary2 :Tadoquery ;
i,k,t:integer ;
date1 ,sd:Tdate ;
ban :array [1..8] of string ; //原班次编号
Tban:Array [1..8] of string ; //存放的班次应轮的班次编号
Jban:Array [1..8] of string ; //交接班次
whichclass :string ;
year,month,day :word ;
year1,month1,day1 :word ;
year2,month2,day2 :word ;
begin
ary1 :=Tadoquery.Create (self) ;
ary1.Connection :=Datamod.Database1 ;
ary2 :=Tadoquery.Create (self) ;
ary2.Connection :=Datamod.Database1 ;
try
Turn:=Adoturnrule.fieldbyname('circle').asinteger ;
Kind:=Adoturnrule.fieldbyname('schenum').asinteger ;
k:=0; t:=0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?