六條記錄合並為一第記錄 |
尚未結案
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
有兩個table, table_a和table_b 用途:考勤時間從考勤機抓回來存入資料庫中,一天刷六次卡.table_a一天就有 6筆刷卡記錄,我想把這六筆記錄合並到table_b中為一筆記錄,也就是一天的刷卡時間.
table_a 有欄位 姓名, 卡號, 日期, 時間, id卡號碼
1 test 1001 08/04 080000 6666666
2 test 1001 08/04 120000 6666666
3 test 1001 08/04 130000 6666666
4 test 1001 08/04 170000 6666666 table_b 有欄位 姓名,卡號,日期,時間1,時間2,時間3,時間4.時間5,時間六,
id卡號碼
1 test 1001 08/04 080000 120000 130000 170000 6666666 發表人 - shine5188 於 2005/08/04 09:41:46
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
procedure TForm1.MoveData(Today: String); var SQLStr: TString; i: integer; flag: boolean; Str: string; begin SQLStr := TStringList.Create; try ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from table_a where dat=''' Today '''');//dat為日期, Today 根據數據庫不同可能要作變換。 ADOQuery1.Open; while not ADOQuery1.eof do begin flag := False; for i := 0 to SQLStr.Count - 1 do if ADOQuery1.FieldByName('id') = Copy(SQLStr.Strings[i], 66, 7) then begin SQLStr.Strings[i] := SQLStr.Strings[i] '''' ADOQuery1.FeildByName('tim').AsString ''','; flag := True; break; end; if not flag then SQLStr.Add('insert into table_b(id, name, dat, t1, t2, t3, t4, t5, t6) values(''' ADOQuery1.FieldByName('id').AsString ''', ''' ADOQuery1.FieldByName('name').AsString ''',''' ADOQuery1.FieldByName('dat').AsString ''', ''' ADOQuery1.FieldByName('tim').AsString ''', '); end; for i := 0 to SQLStr.Count - 1 do begin Str := SQLStr.Strings[i]; Str[Length(Str)] := ')'; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(SQLStr.Strings[i]); ADOQuery1.ExecSQL; end; finally SQLStr.Free; end; end;---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 感謝 h@visli 兄 先試試看這种遷移操作方法很多,關鍵是要能方便快捷,減少到數據庫的存取次數。我提供的代碼并不是最佳的,而且許多地方要根據你的實際情況做出相應修改。 另外,這种合並操作如果使用數據庫本身的觸發器來完成也許更好! ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
感謝你簡答
我是初學者..在測試中有點小問題,請指教
看看下面代碼有沒有問題?
procedure TKQDemo.sBitBtn1Click(Sender: TObject);
var
SQLStr: TStringList;
i: integer;
flag: boolean;
Str: string;
begin
SQLStr := TStringList.Create;
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from check_in where in_date=''' '2005/07/26' ''' order by in_time');//dat為日期, Today 根據數據庫不同可能要作變換。
ADOQuery1.Open;
while not ADOQuery1.eof do
begin
flag := False;
for i := 0 to SQLStr.Count - 1 do
if ADOQuery1.FieldByName('idno').AsString = Copy(SQLStr.Strings[i], 66, 7) then
begin
SQLStr.Strings[i] := SQLStr.Strings[i] '''' ADOQuery1.FieldByName('in_time').AsString ''',';
flag := True;
break;
end;
if not flag then
SQLStr.Add('insert into in_out_record_1(idno, in_date, time_1, time_2, time_3, time_4, time_5, time_6) values(''' ADOQuery1.FieldByName('idno').AsString ''', ''' ADOQuery1.FieldByName('in_date').AsString ''',''' ADOQuery1.FieldByName('in_time').AsString ''', ');
end;
for i := 0 to SQLStr.Count - 1 do
begin
Str := SQLStr.Strings[i];
Str[Length(Str)] := ')';
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SQLStr.Strings[i]);
ADOQuery1.ExecSQL;
end;
finally
SQLStr.Free;
end; end; 1.SQLStr.Count的用意不太明白
2.Copy(SQLStr.Strings[i], 66, 7)不明白從66位取7位
3.Str[Length(Str)] := ')'不知用意 上面的代碼可以順利執行,但是沒有出現我要的結果..
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
思路大意: 查詢出Table_a中指定日期的全部打卡記錄,迴圈處理每一條記錄。
如果當前記錄的id能在SQLStr中某一行找到,則把打卡時間加到該行,
如果找不到則新建一行(這一行包括了id與日期以及時間), 迴圈處理完畢業,SQLStr中已保存了所有要合併寫入Table_b的SQL語句,逐條執行就是了。
SQLStr中的保存行樣式:
......
insert into table_b(id, name, dat, t1, t2, t3, t4, t5, t6) values(....
insert into table_b(id, name, dat, t1, t2, t3, t4, t5, t6) values(....
insert into table_b(id, name, dat, t1, t2, t3, t4, t5, t6) values(....
...... 而Copy(SQLStr.Strings[i], 66, 7)用於確定上面的行中values('後的id值
procedure TForm1.MoveData(Today: String); var SQLStr: TString; i: integer; flag: boolean; Str: string; begin //SQLStr用來組織與保存SQL語句 SQLStr := TStringList.Create; try ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from table_a where dat=''' Today '''');//dat為日期, Today 根據數據庫不同可能要作變換。 ADOQuery1.Open; while not ADOQuery1.eof do begin //flag用於標記是否在SQLStr中已有id flag := False; //搜尋是否在SQLStr中有id行 for i := 0 to SQLStr.Count - 1 do if ADOQuery1.FieldByName('id') = Copy(SQLStr.Strings[i], 66, 7) then //如果有 begin SQLStr.Strings[i] := SQLStr.Strings[i] '''' ADOQuery1.FeildByName('tim').AsString ''','; flag := True; break; end; if not flag then SQLStr.Add('insert into table_b(id, name, dat, t1, t2, t3, t4, t5, t6) values(''' ADOQuery1.FieldByName('id').AsString ''', ''' ADOQuery1.FieldByName('name').AsString ''',''' ADOQuery1.FieldByName('dat').AsString ''', ''' ADOQuery1.FieldByName('tim').AsString ''', '); end; for i := 0 to SQLStr.Count - 1 do begin Str := SQLStr.Strings[i]; Str[Length(Str)] := ')'; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(SQLStr.Strings[i]); ADOQuery1.ExecSQL; end; finally SQLStr.Free; end; end;以上代碼是我大致寫的,沒有試過。如果您 還不能理解的話,請把你的資料庫發一個給我,我寫一個示例程式給您 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 非常感謝你.打擾你了 資料庫已傳到你的h_visli@hotmail.com郵箱,請幫忙編寫一個範例. 有勞你.你好,示例已經發到你的郵箱中去了。 由於我現在手頭沒有Access,所以我參照你的SQL語句,在SQL Server中創建一個數據庫,為了簡單明了我簡化了字段內容。 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
|
shine5188
一般會員 發表:2 回覆:15 積分:8 註冊:2005-05-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |