turnrule.pas
来自「pasa人力资源考勤管理系统」· PAS 代码 · 共 1,474 行 · 第 1/4 页
PAS
1,474 行
procedure DsturnruleDataChange(Sender: TObject; Field: TField);
procedure DateTimePicker2CloseUp(Sender: TObject);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBCheckBox2Click(Sender: TObject);
procedure DBCheckBox1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure CheckBox2Click(Sender: TObject);
procedure tbnprintClick(Sender: TObject);
procedure ppReport1PreviewFormCreate(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure DBEdit7Change(Sender: TObject);
procedure DBGrid2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure firstclassdown(Lt,ki:integer);//产生以月中和月底为轮班
private
{ Private declarations }
f:string ;
//procedure BanSort(x:integer ;var banAz,ban: array [1..8] of string) ;
procedure FirstclassDay(Lt,ki:integer) ; // 第一次产生班表
procedure FirstclassMonth(Lt,ki:integer) ; // 非第一次产生班表
procedure FirstclassMonth15(Lt,ki:integer) ; // 非第一次产生班表
public
{ Public declarations }
function bydate:string;
end;
var
Formturnrule: TFormturnrule;
implementation
uses main,cvcode, datamol,publicfunction, changebc;
{$R *.DFM}
procedure TFormturnrule.FormCreate(Sender: TObject);
var i:integer ;
begin
if DateSeparator='/' then
begin
maskedit1.EditMask:='9999/99/99;1;_';
maskedit2.EditMask:='9999/99/99;1;_';
end
else
if dateseparator='-' then
begin
maskedit1.EditMask:='9999-99-99;1;_';
maskedit2.EditMask:='9999-99-99;1;_';
end;
f:='ASC' ;
datamod.ADObc.Close ;
datamod.ADObc.open ;
datamod.ADObc.First ;
for i :=1 to 16 do
Tdbcombobox(findcomponent('dbcombobox'+inttostr(18+i))).items.Clear ;
while not datamod.ADObc.eof do
begin
for i :=1 to 16 do
Tdbcombobox(findcomponent('dbcombobox'+inttostr(18+i))).items.Add (datamod.ADObc.fieldbyname('scheno').asstring );
datamod.ADObc.next ;
end ;
combobox1.Items.Clear ;
datamod.ADOQuery2.Close ;
datamod.ADOQuery2.SQL.text :='select distinct(comcode) from pub06010';
datamod.ADOQuery2.open;
while not datamod.ADOQuery2.eof do
begin
combobox1.Items.Add (datamod.ADOQuery2.Fields[0].AsString) ;
datamod.ADOQuery2.next ;
end;
datamod.ADOQuery2.close ;
//不用关闭共用班次档
Datetimepicker2.date:=date ;
Datetimepicker5.date:=date ;
Datetimepicker6.date:=date ;
Adoturnrule.close;
Adoturnrule.open;
Adoturnrule1.close ;
Adoturnrule1.open ;
Adoturn.close;
ADoturn.open;
GetDBGridLength(self.name,DBGrid1);
GetDBGridLength(self.name,DBGrid2);
end;
procedure TFormturnrule.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
SetDBGridLength(self.name,DBGrid1,ADOturnrule);
SetDBGridLength(self.name,DBGrid2,ADOturn);
datamod.ADObc.Close ;
Adoturnrule.Close;
Adoturn.Close ;
Adoturnrule1.close ;
action :=cafree ;
Formturnrule:=nil;
end;
procedure TFormturnrule.FormKeyPress(Sender: TObject; var Key: Char);
begin
if activecontrol.classtype=TDBGrid then exit;
if key=#13 then
begin
key:=#0;
selectnext(activecontrol,true,true);
end;
end;
function TFormturnrule.bydate:string;
var i,n,dd:integer ;
d1,d2 :real ;
year,month,day :word ;
yr,mh,dy:string;
begin
n :=strtoint(dbedit6.text) ;
if dbcombobox18.Text ='日' then
begin
d1:=strtodate(maskedit1.text); d2:=strtodate(maskedit2.text);
i:=(trunc(d2-d1)+1) mod n;
result:=datetostr(d2+n-i); //轮到什么时候为止
end
else if dbcombobox18.Text ='月' then
begin
dd:=strtoint(copy(dbedit9.text,9,2)); //起轮日期
decodedate(strtodate(maskedit2.text),year,month,day) ;
if dd=1 then
begin
day :=getdays(inttostr(month),inttostr(year)) ;
Result :=copy(Maskedit2.text,1,8)+inttostr(day) ;
end
else begin
if strtoint(copy(maskedit2.text,9,2))<dd then
Result :=copy(Maskedit2.text,1,8)+inttostr(dd-1)
else begin
if (strtoint(copy(maskedit2.text,6,2))+1)>12 then
yr := inttostr(strtoint(copy(maskedit2.text,1,4))+1)
else
yr :=copy(maskedit2.text,1,4) ;
mh := inttostr((strtoint(copy(maskedit2.text,6,2))+1)) ;
case length(mh) of
1:begin
mh :='/0' ;
case length(inttostr(dd-1)) of
1 :dy :='/0' ;
2 :dy :='/' ;
//1: Enddate :=yr+'/0'+mh+'/0'+inttostr(dd-1) ;
//2: Enddate :=yr+'/0'+mh+'/'+inttostr(dd-1) ;
end;
end;
2:begin
mh:='/' ;
case length(inttostr(dd-1)) of
1:dy :='/0' ;
2:dy :='/';
end;
end;
end;
result :=yr+mh+inttostr((strtoint(copy(maskedit2.text,6,2))+1))+dy+inttostr(dd-1) ;
end;
end;
end;
end;
{procedure Tformturnrule.BanSort(x:integer ;var banAZ,ban :array [1..8] of string) ;
var i:integer ;
begin
for i:=1 to kind do
begin
if i>x then
banAZ[i]:=ban[x]
else
begin
ban[i] :=banAz[i] ;
banAZ[i] :=ban[x] ;
end;
x:=x+1 ;
if x>kind then
x:=1 ;
end;
end;}
procedure TFormturnrule.SpeedButton3Click(Sender: TObject);
begin
panel2.Visible :=false ;
end;
procedure TFormturnrule.DateTimePicker5CloseUp(Sender: TObject);
begin
maskedit1.Text :=datetostr(datetimepicker5.date) ;
end;
procedure TFormturnrule.DateTimePicker6CloseUp(Sender: TObject);
begin
maskedit2.Text :=datetostr(datetimepicker6.date) ;
end;
procedure TFormturnrule.DBComboBox34Exit(Sender: TObject);
begin
if trim((sender as Tdbcombobox).text)<>'' then
if not datamod.ADObc.Locate('scheno',(sender as Tdbcombobox).text,[]) then
showmessage('对不起,没有这个班次') ;
end;
procedure TFormturnrule.DBGrid2TitleClick(Column: TColumn);
var db:Tdbgridsort;
begin
db:=Tdbgridsort.create; //调用排序
db.sort(column,ADOturn,f);
db.free;
end;
procedure TFormturnrule.Firstclassdown(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 ;
year3,month3,day3,day4,month4: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) ;
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
day4:=formatdatetime('dd',date1);
decodedate(sd,year,month,day) ;
decodedate(date1,year1,month1,day1);
year3:=formatdatetime('yyyy',date1);
month3:=formatdatetime('mm',date1);
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
day4:=formatdatetime('dd',date1);
day3:=formatdatetime('dd',date1+1);
month4:=formatdatetime('mm',date1+1);
decodedate(date1+1,year2,month2,day2) ;
if (day4='01')and(formatdatetime('yyyy/mm',date1-1)<>formatdatetime('yyyy/mm',date1)) then
begin
t:=Lt ;
k :=(k+1) mod kind ;
if (k=0)and (date1<>strtodate(maskedit1.text)) then k :=kind
else
k:=i;
// if date1<>strtodate(maskedit1.text) then
whichclass :=ban[k];
end;
t :=t+1 ;
if (t mod turn =0) and (jban[k]<>'')and((t=turn)or(day4=inttostr(31))) then
whichclass :=Jban[k]
else
if ((t=1)and (day4=inttostr(31)))or(month3<>month4)or(t=turn)then
whichclass:=jban[k]
else
begin
if ((t-1) mod turn=0) and (t<>1)and (t<>31) then //往下面轮
begin
k :=(k+1) mod kind ;
if k=0 then k :=kind ;
whichclass :=ban[k];
end
else
//if date1<>strtodate(maskedit1.text) then
whichclass :=ban[k];
end;
end;
Ary2.SQL.Text :='insert turn01010 select '''+ADoturnrule.fieldbyname('ruleno').asstring+''','''+datetostr(date1)+''','''+ban[i]+''', '+
's1,gotime1,outtime1,e1,add1,decrease1,daytime1,unout1,kuan1,night1,s2,gotime2,outtime2,e2,add2,decrease2,daytime2,unout2,kuan2,night2,'+
's3,gotime3,outtime3,e3,add3,decrease3,daytime3,unout3,kuan3,night3,s4,gotime4,outtime4,e4,add4,decrease4,daytime4,unout4,kuan4,night4,'+
's5,gotime5,outtime5,e5,add5,decrease5,daytime5,unout5,kuan5,night5,dayhours,unatd,ot,notgive,otkind,''0'',''0'','''+pubworkname+''','''+formatdatetime('yyyy/mm/dd',now)+''',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='''+copy(ary1.fieldbyname('comdate').asstring,1,4)+fmat+copy(ary1.fieldbyname('comdate').asstring,6,2)+fmat+copy(ary1.fieldbyname('comdate').asstring,9,2)+'''';
//ary2.SQL.SaveToFile('e:\readcard.sql');
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?