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