有關考勤刷卡機資料轉員工出勤資料 |
尚未結案
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
小弟有個有關考勤刷卡機轉出資料與資料庫中員工班別相對應得到
上下班實際刷卡時間表. 有兩個Table,分別是存放考勤機採集回來的數據Table1,Table2 Table1是存放從考勤機採集回來的數據 Table2是存放每人每天的刷卡記錄(刷六次) Table1有欄位 in_date(日期), in_time(刷卡時間), idno(id卡號), machine_no(機器號) Table2有欄位 in_date(日期),idno(id卡號), time1(時間1), time2(時間2) ,time3(時間3), time4(時間4), time5(時間5), time6(時間6) 請問怎樣放入適當欄位
若此適當欄位已經有刷卡紀錄,則判斷前一欄位有無刷卡紀錄
若前一欄位無刷卡紀錄,則原適當欄位刷卡紀錄往前移,然後放入新紀錄
若前一欄位有刷卡紀錄,則新紀錄往後一欄位放. 請各位前輩告知怎樣實現…我是個初學者.想學習考勤人事系統
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
若此適當欄位已經有刷卡紀錄,則判斷前一欄位有無刷卡紀錄
若前一欄位無刷卡紀錄,則原適當欄位刷卡紀錄往前移,然後放入新紀錄
若前一欄位有刷卡紀錄,則新紀錄往後一欄位放. 這好像是我之前發表的.....
其作法就是用if... then... else來做判斷
我是把24小時分成7個時段,每個時段不可重複,例00:00~05:30,05:31~11:00,11:01~12:30,12:31~16:00,16:01~18:00,18:01~21:30,21:30~23:59
可以做多重迴圈判斷來解決,其中00:00~05:30作為換日緩衝時段
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
首先要SQL出日期及卡號(刷卡紀錄筆數不定)
然後放入適當位置,再EDIT或APPAND到資料庫
EditT0.Text:='';
EditT1.Text:='';
EditT2.Text:='';
EditT3.Text:='';
EditT4.Text:='';
EditT5.Text:='';
EditT6.Text:=''; if RecordCount > 0 then begin
k1:=strtoint(FormatDateTime('hhnn',StrToDatetime(FieldByName('EntranceTime').Value)));
t2:=FormatDateTime('hh:nn',StrToDatetime(FieldByName('EntranceTime').Value));
while not Eof do begin
k2:=strtoint(FormatDateTime('hhnn',StrToDatetime(FieldByName('EntranceTime').Value)));
if k2-k1=1 then t1:=t2 //相差1分鐘也算重複,整點換時例外,要另想辦法
else
t1:=FormatDateTime('hh:nn',StrToDatetime(FieldByName('EntranceTime').Value)); t2:=t1;
k1:=k2;
if (t1 > '00:00') and (t1 <= '06:00') then begin
if (EditT0.Text ='') then begin EditT0.Text:=t1;
end else begin
if CompareText(EditT0.Text,t1)<0 then begin //過濾重複刷卡記錄
EditT1.Text:=t1;
end else end;
end; if (t1 > '06:00') and (t1 <= '11:00') then begin
if (EditT1.Text ='') then begin EditT1.Text:=t1;
end else begin
if CompareText(EditT1.Text,t1)<0 then begin
if (EditT0.Text='') then begin
EditT0.Text:=EditT1.Text;
EditT1.Text:=t1;
end else
EditT2.Text:=t1;
end else end;
end;
if (t1 > '11:00') and (t1 <= '12:15') then begin
if (EditT2.Text ='') then begin EditT2.Text:=t1;
end else begin
if CompareText(EditT2.Text,t1)<0 then begin
if (EditT1.Text='') then begin
EditT1.Text:=EditT2.Text;
EditT2.Text:=t1;
end else
EditT3.Text:=t1;
end else
if CompareText(EditT2.Text,t1)>0 then begin
if (EditT3.Text='') then begin
EditT3.Text:=EditT2.Text;
EditT2.Text:=t1;
end;
end;
end;
end;
if (t1 > '12:15') and (t1 <= '16:30') then begin
if (EditT3.Text ='') then begin EditT3.Text:=t1;
end else begin
if CompareText(EditT3.Text,t1)<0 then begin
if (EditT2.Text='') then begin
EditT2.Text:=EditT3.Text;
EditT3.Text:=t1;
end else
EditT4.Text:=t1;
end else end;
end;
if (t1 > '16:30') and (t1 <= '19:00') then begin
if (EditT4.Text ='') then begin EditT4.Text:=t1;
end else begin
if CompareText(EditT4.Text,t1)<0 then begin
if (EditT3.Text='') then begin
EditT3.Text:=EditT4.Text;
EditT4.Text:=t1;
end else
EditT5.Text:=t1;
end else end;
end;
if (t1 > '19:00') and (t1 <= '22:00') then begin
if (EditT5.Text ='') then begin EditT5.Text:=t1;
end else begin
if CompareText(EditT5.Text,t1)<0 then begin
if (EditT4.Text='') then begin
EditT4.Text:=EditT5.Text;
EditT5.Text:=t1;
end else
EditT6.Text:=t1;
end else end;
end;
if (t1 > '22:00') and (t1 <= '24:00') then begin
if (EditT6.Text ='') then begin EditT6.Text:=t1;
end else begin
if CompareText(EditT6.Text,t1)<0 then begin
if (EditT5.Text='') then begin
EditT5.Text:=EditT6.Text;
EditT6.Text:=t1;
end else
if (EditT4.Text='') then begin
EditT4.Text:=EditT5.Text;
EditT5.Text:=EditT6.Text;
EditT6.Text:=t1;
end;
end else end;
end;
Next;
end; 發表人 - way888 於 2005/08/25 12:14:49
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
這是我用的方法,參考看看,我的資料庫是SQL2000 mdf,卡鐘資料庫是ACESS mdb
procedure TForm3.mdbBtnClick(Sender: TObject);//此Btn設為隱藏,FormCreat時就執行>mdbBtn.Click
var days :TDateTime;
tm,t1,t2 :string;
i,k1,k2 :integer;
begin
with memDataSet do begin//此資料表紀錄資料庫最後日期,作為程式開始就自動執行加入
close;
commandtext:='select * from setMemery';
open;
if manul=1 then days:=DateOf(DateTimePicker1.Date)//手動加入到自己的資料庫
else days:=FieldByName('entrancecardMem').Value;
end; with dutyDataSet do begin//自己的出勤資料庫
close;
commandtext:='select EntranceCardNo, DutyDate, DutyTime0, DutyTime1, DutyTime2, DutyTime3, '+
'DutyTime4, DutyTime5, DutyTime6 from DutyTime '+
' WHERE DutyDate between '''+FormatDateTime('yyyy/mm/dd',DateTimePicker1.Date)+''' '+
'AND '''+FormatDateTime('yyyy/mm/dd',DateTimePicker2.Date)+''' ';
open;
end; with empDataSet do begin //到員工資料庫取出卡號(未離職的)
close;
commandtext:='select EntranceCardNo from employee where LeaveJobCheck=0 AND EntranceCardNo<>'''' ';
open;
first;
end;
while days <= DateOf(DateTimePicker2.Date) do begin//此為日期迴圈
while not empDataSet.Eof do begin//此為卡號迴圈
with mdbDataSet do begin//到卡鐘資料庫抓資料,之前功力不夠無法自00:00~24:00排序,所以12:00還得判斷一次,請自行想辦法
Close;
commandtext:='select * from EntranceRecords where EntranceCardNo = '''+empDataSet.FieldByName('EntranceCardNo').Value+''' AND '+
'EntranceMachineNo=05 AND EntranceDate ='+'#'+DateToStr(days)+'#'+'order by EntranceTime';
Open;//會有上下午,所以排序不是很理想,改成00:00~24:00排序則12:00可以不用判斷,且整點換時可以好判斷,我是業餘自己用,所以不想改它
EditT0.Text:='';
EditT1.Text:='';
EditT2.Text:='';
EditT3.Text:='';
EditT4.Text:='';
EditT5.Text:='';
EditT6.Text:=''; if RecordCount > 0 then begin
k1:=strtoint(FormatDateTime('hhnn',StrToDatetime(FieldByName('EntranceTime').Value)));
t2:=FormatDateTime('hh:nn',StrToDatetime(FieldByName('EntranceTime').Value));
while not Eof do begin
k2:=strtoint(FormatDateTime('hhnn',StrToDatetime(FieldByName('EntranceTime').Value)));
if k2-k1=1 then t1:=t2
else
t1:=FormatDateTime('hh:nn',StrToDatetime(FieldByName('EntranceTime').Value)); t2:=t1;
k1:=k2;
if (t1 > '00:00') and (t1 <= '06:00') then begin
if (EditT0.Text ='') then begin EditT0.Text:=t1;
end else begin
if CompareText(EditT0.Text,t1)<0 then begin
EditT1.Text:=t1;
end else end;
end; if (t1 > '06:00') and (t1 <= '11:00') then begin
if (EditT1.Text ='') then begin EditT1.Text:=t1;
end else begin
if CompareText(EditT1.Text,t1)<0 then begin
if (EditT0.Text='') then begin
EditT0.Text:=EditT1.Text;
EditT1.Text:=t1;
end else
EditT2.Text:=t1;
end else end;
end;
if (t1 > '11:00') and (t1 <= '12:15') then begin
if (EditT2.Text ='') then begin EditT2.Text:=t1;
end else begin
if CompareText(EditT2.Text,t1)<0 then begin
if (EditT1.Text='') then begin
EditT1.Text:=EditT2.Text;
EditT2.Text:=t1;
end else
EditT3.Text:=t1;
end else
if CompareText(EditT2.Text,t1)>0 then begin
if (EditT3.Text='') then begin
EditT3.Text:=EditT2.Text;
EditT2.Text:=t1;
end;
end;
end;
end;
if (t1 > '12:15') and (t1 <= '16:30') then begin
if (EditT3.Text ='') then begin EditT3.Text:=t1;
end else begin
if CompareText(EditT3.Text,t1)<0 then begin
if (EditT2.Text='') then begin
EditT2.Text:=EditT3.Text;
EditT3.Text:=t1;
end else
EditT4.Text:=t1;
end else end;
end;
if (t1 > '16:30') and (t1 <= '19:00') then begin
if (EditT4.Text ='') then begin EditT4.Text:=t1;
end else begin
if CompareText(EditT4.Text,t1)<0 then begin
if (EditT3.Text='') then begin
EditT3.Text:=EditT4.Text;
EditT4.Text:=t1;
end else
EditT5.Text:=t1;
end else end;
end;
if (t1 > '19:00') and (t1 <= '22:00') then begin
if (EditT5.Text ='') then begin EditT5.Text:=t1;
end else begin
if CompareText(EditT5.Text,t1)<0 then begin
if (EditT4.Text='') then begin
EditT4.Text:=EditT5.Text;
EditT5.Text:=t1;
end else
EditT6.Text:=t1;
end else end;
end;
if (t1 > '22:00') and (t1 <= '24:00') then begin
if (EditT6.Text ='') then begin EditT6.Text:=t1;
end else begin
if CompareText(EditT6.Text,t1)<0 then begin
if (EditT5.Text='') then begin
EditT5.Text:=EditT6.Text;
EditT6.Text:=t1;
end else
if (EditT4.Text='') then begin
EditT4.Text:=EditT5.Text;
EditT5.Text:=EditT6.Text;
EditT6.Text:=t1;
end;
end else end;
end;
memEntrance.Caption:=DateToStr(days);//紀錄最後日期
Next;//個別卡號之紀錄Next
end;//個別卡號之記錄結束
if dutyDataSet.Locate('EntranceCardNo;DutyDate',
varArrayof([empDataSet.FieldByName('EntranceCardNo').Value,FormatDateTime('yyyy/mm/dd',Days)]),[]) then
begin //查查看紀錄是否存在?true>edit;false>append;
dutyDataSet.Edit;
// ShowMessage('edit');
if EditT0.Text<>'' then dutyDataSet.FieldByName('DutyTime0').Value:=EditT0.Text;
if EditT1.Text<>'' then dutyDataSet.FieldByName('DutyTime1').Value:=EditT1.Text;
if EditT2.Text<>'' then dutyDataSet.FieldByName('DutyTime2').Value:=EditT2.Text;
if EditT3.Text<>'' then dutyDataSet.FieldByName('DutyTime3').Value:=EditT3.Text;
if EditT4.Text<>'' then dutyDataSet.FieldByName('DutyTime4').Value:=EditT4.Text;
if EditT5.Text<>'' then dutyDataSet.FieldByName('DutyTime5').Value:=EditT5.Text;
if EditT6.Text<>'' then dutyDataSet.FieldByName('DutyTime6').Value:=EditT6.Text; end else begin
dutyDataSet.Append;
// ShowMessage('append');
dutyDataSet.FieldByName('EntranceCardNo').Value:=empDataSet.FieldByName('EntranceCardNo').Value;
dutyDataSet.FieldByName('DutyDate').Value:=FormatDateTime('yyyy/mm/dd',Days);
if EditT0.Text='' then dutyDataSet.FieldByName('DutyTime0').Value:=NULL
else dutyDataSet.FieldByName('DutyTime0').Value:=EditT0.Text;
if EditT1.Text='' then dutyDataSet.FieldByName('DutyTime1').Value:=NULL
else dutyDataSet.FieldByName('DutyTime1').Value:=EditT1.Text;
if EditT2.Text='' then dutyDataSet.FieldByName('DutyTime2').Value:=NULL
else dutyDataSet.FieldByName('DutyTime2').Value:=EditT2.Text;
if EditT3.Text='' then dutyDataSet.FieldByName('DutyTime3').Value:=NULL
else dutyDataSet.FieldByName('DutyTime3').Value:=EditT3.Text;
if EditT4.Text='' then dutyDataSet.FieldByName('DutyTime4').Value:=NULL
else dutyDataSet.FieldByName('DutyTime4').Value:=EditT4.Text;
if EditT5.Text='' then dutyDataSet.FieldByName('DutyTime5').Value:=NULL
else dutyDataSet.FieldByName('DutyTime5').Value:=EditT5.Text;
if EditT6.Text='' then dutyDataSet.FieldByName('DutyTime6').Value:=NULL
else dutyDataSet.FieldByName('DutyTime6').Value:=EditT6.Text;
end; try
dutyDataSet.Post;
except
dutyDataSet.Cancel;
// ShowMessage('Error');
end;
end; end;
empDataSet.Next;//卡號迴圈Next
end;
days:=days 1;//相當於日期迴圈Next
empDataSet.First;//換日需卡號從頭來過
end;
if manul=0 then begin //自動模式為manulBtn.enable:=true且設manul=0
with memDataSet do begin
Edit;
FieldByName('entrancecardMem').Value:=StrToDate(memEntrance.Caption);
Post; //將最後日期存到資料表
end;
end;
Dbgrid2.Visible:=false;
end; 發表人 - way888 於 2005/08/29 22:17:29 發表人 - way888 於 2005/08/29 22:21:18 發表人 - way888 於 2005/08/29 22:42:54
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |