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 + -
显示快捷键?