線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1253
推到 Plurk!
推到 Facebook!

日期比對查詢

答題得分者是:Justmade
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-24 12:07:01 IP:61.59.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-24 13:13:26 IP:218.16.xxx.xxx 未訂閱
試試轉用 Locate 取代findkey 罷,因 locate 可用 loPartialKey 找出最接近的,所以Qdate 是 2003/06 便會找到 2003/06 之後最小的值    若有 /01 便是 /01 若是最小的是 /06 也一樣成功找到。    If Table3.Locate(Field1Name,Qdate,[loPartialKey]) then ....
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-24 16:08:44 IP:61.59.xxx.xxx 未訂閱
引言: 試試轉用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-24 16:21:22 IP:218.16.xxx.xxx 未訂閱
說明是 fieldname 甚會給個 AsString 的 value 給他 而且看來你那個
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-24 16:48:52 IP:61.59.xxx.xxx 未訂閱
引言: 說明是 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-24 17:00:01 IP:218.16.xxx.xxx 未訂閱
對不起沒留意你 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-24 17:25:36 IP:61.59.xxx.xxx 未訂閱
引言: if Locate('ID;Date', VarArrayOf([Table1.FieldByname('ID').Value,Qdate]) ,[loPartialKey]) then .... 留意是 QDate 不是 QDate1
謝謝大大.....
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-24 22:47:07 IP:211.74.xxx.xxx 未訂閱
引言: 對不起沒留意你 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
感謝大大,我也有用Tquery來做,是做得出來的。只是之前用Table用習慣了(哈剛學沒多久用的都是Table),想用Table.findnearest來做.....大大可否直接回到我信箱呢?因為以經結案了,
系統時間:2024-06-29 5:55:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!