日期比對查詢 |
答題得分者是:Justmade
|
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
begin
Qdate:=FormatDate('yyyy/mm',DateTimePicker.date);
Qdate1:=Qdate+'/01';
Table1.First;
Table3.SetKey;
Table3.First;
while not (Table1.Eof) do
begin
N1:=0;
If Table3.FindKey([Table1.Fields[1],Qdate1]) then
while (Table3.Fields[0].AsString=Table1.Fields[1].asstring) and (FormatDateTime('yyyy/mm',Table3.Fields[1].AsDateTime)=Qdate) and not (Table3.Eof) do
begin
N1:=N1+Table3.Fields[2].AsInteger;
table3.Next;
end;
Table1.Next;
end;
end;
這樣用兩個迴圈可以把另一個資料表中每一家的每個月(1號到月底)的數字欄位做加總。但是若是沒有每個月的1號(如2003/06/01)的話就不能加總。但是我有些記錄是從2003/06/05開始的,請問要怎麼修改呢??想了兩天了,頭大內~~~ 發表人 -
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
引言: 試試轉用 Locate 取代findkey 罷,因 locate 可用 loPartialKey 找出最接近的,所以Qdate 是 2003/06 便會找到 2003/06 之後最小的值 若有 /01 便是 /01 若是最小的是 /06 也一樣成功找到。 If Table3.Locate(Field1Name,Qdate,[loPartialKey]) then ....不好意思,因為沒有看過Locate的用法。所以我有試著用大大的語法 寫成 If Table3.Locate(Table1.fields[1].asstring,Qdate,[loPartialkey]) then 但是執行時會變成Table3:Field '004' not found 004是Table1.fields[1].asstring的第一筆資料。不好意思能否請大大再詳細說明一下......... |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
引言: 說明是 fieldname 甚會給個 AsString 的 value 給他 而且看來你那個 >>< face="Verdana, Arial, Helvetica"> 拍謝拍謝!!我有一個資料表(裡頭有三個欄位,依序是id(字串)、date(日期)'m1(數值n)。主索引是id date。因為一個id一天只能有一筆記錄。 今天我要統計每個id每月的總額。但是因為有時id沒有在每個月的第一天傳回資料。我所寫的程式碼如下 begin Qdate:=FormatDate('yyyy/mm',DateTimePicker.date); Qdate1:=Qdate '/01'; Table1.First; Table3.SetKey; Table3.First; while not (Table1.Eof) do begin N1:=0; If Table3.FindKey([Table1.Fields[1],Qdate1]) then while (Table3.Fields[0].AsString=Table1.Fields[1].asstring) and (FormatDateTime('yyyy/mm',Table3.Fields[1].AsDateTime)=Qdate) and not (Table3.Eof) do begin N1:=N1 Table3.Fields[2].AsInteger; table3.Next; end; Table1.Next; end; end; 可是這樣,萬一有人是從2號開始寫入資料,那當月他的總合就會為0。請問大大要怎麼修改呢?? 我用locate試了滿多次的 =.=" 還是動不了 拍謝~~天資愚鈍~~有勞大大了。 |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
對不起沒留意你 Date 是 日期欄位不是字串 若是日期欄位的話不能用 loPartialKey 來達到目的,最好用 Query 罷 : uses dateutils
begin while not (Table1.Eof) do begin N1:=0; Query1.Active := false; Query1.SQL.Text := 'select * from TableName T where ID = :ID and T."Date" >= :Start and T."Date" <= :End'; Query1.ParamByName('ID').Value := Table1.FieldBYName('ID').Value; Query1.ParamByName('Start').AsDateTime := StartOfTheMonth(DateTimePicker.date); Query1.ParamByName('End').AsDateTime := EndOfTheMonth(DateTimePicker.date); Query1.Active := true; while not Query1.Eof do begin N1:=N1 Query1.Fields[2].AsInteger; Query1.Next; end; ShowMessage(IntToStr(N1)); // 或儲存在別處 Table1.Next; end; end TableName換成你的 Table Name發表人 - Justmade 於 2003/06/24 17:37:43 |
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
|
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
引言: 對不起沒留意你 Date 是 日期欄位不是字串 若是日期欄位的話不能用 loPartialKey 來達到目的,最好用 Query 罷 : uses dateutils感謝大大,我也有用Tquery來做,是做得出來的。只是之前用Table用習慣了(哈剛學沒多久用的都是Table),想用Table.findnearest來做.....大大可否直接回到我信箱呢?因為以經結案了,begin while not (Table1.Eof) do begin N1:=0; Query1.Active := false; Query1.SQL.Text := 'select * from TableName T where ID = :ID and T."Date" >= :Start and T."Date" <= :End'; Query1.ParamByName('ID').Value := Table1.FieldBYName('ID').Value; Query1.ParamByName('Start').AsDateTime := StartOfTheMonth(DateTimePicker.date); Query1.ParamByName('End').AsDateTime := EndOfTheMonth(DateTimePicker.date); Query1.Active := true; while not Query1.Eof do begin N1:=N1 Query1.Fields[2].AsInteger; Query1.Next; end; ShowMessage(IntToStr(N1)); // 或儲存在別處 Table1.Next; end; end TableName換成你的 Table Name發表人 - Justmade 於 2003/06/24 17:37:43 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |