全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1012
推到 Plurk!
推到 Facebook!

六條記錄合並為一第記錄

尚未結案
shine5188
一般會員


發表:2
回覆:15
積分:8
註冊:2005-05-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-03 17:01:14 IP:211.20.xxx.xxx 未訂閱
六條記錄合並為一第記錄 請問怎樣把一個表的六條記錄 合並為(另一個表中建立)一條記錄 依姓名.日期.時間合並為一條記錄 請高手告知..謝謝!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-03 18:21:47 IP:202.62.xxx.xxx 未訂閱
您好﹗    不是很明白您的意思﹐您所提的合并六條記錄是指將每條記錄皆取出一個欄位值合并呢﹖還是將六條記錄的每個欄位值都合并﹖    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-03 19:48:03 IP:222.248.xxx.xxx 未訂閱
請把您兩個表的結構及示例數據寫出來。 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
shine5188
一般會員


發表:2
回覆:15
積分:8
註冊:2005-05-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-04 09:31:24 IP:219.137.xxx.xxx 未訂閱
有兩個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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-04 12:35:52 IP:222.248.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-05 16:49:33 IP:219.137.xxx.xxx 未訂閱
感謝 h@visli 兄 先試試看
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-05 17:26:03 IP:222.248.xxx.xxx 未訂閱
引言: 感謝 h@visli 兄 先試試看
這种遷移操作方法很多,關鍵是要能方便快捷,減少到數據庫的存取次數。我提供的代碼并不是最佳的,而且許多地方要根據你的實際情況做出相應修改。 另外,這种合並操作如果使用數據庫本身的觸發器來完成也許更好! ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
shine5188
一般會員


發表:2
回覆:15
積分:8
註冊:2005-05-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-05 18:50:53 IP:219.137.xxx.xxx 未訂閱
感謝你簡答 我是初學者..在測試中有點小問題,請指教 看看下面代碼有沒有問題? 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-05 19:36:58 IP:222.248.xxx.xxx 未訂閱
思路大意:    查詢出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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-06 19:40:48 IP:219.137.xxx.xxx 未訂閱
非常感謝你.打擾你了 資料庫已傳到你的h_visli@hotmail.com郵箱,請幫忙編寫一個範例. 有勞你.
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-06 21:42:33 IP:222.248.xxx.xxx 未訂閱
引言: 非常感謝你.打擾你了 資料庫已傳到你的h_visli@hotmail.com郵箱,請幫忙編寫一個範例. 有勞你.
你好,示例已經發到你的郵箱中去了。 由於我現在手頭沒有Access,所以我參照你的SQL語句,在SQL Server中創建一個數據庫,為了簡單明了我簡化了字段內容。 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
shine5188
一般會員


發表:2
回覆:15
積分:8
註冊:2005-05-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-08 08:56:30 IP:219.137.xxx.xxx 未訂閱
感謝中. . .demo已看到了
shine5188
一般會員


發表:2
回覆:15
積分:8
註冊:2005-05-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-13 10:07:16 IP:211.20.xxx.xxx 未訂閱
h@visli 兄 有一個問題 當check_in表的刷卡時間小於六筆的時候. 轉入in_out_record_1表就會出錯. 請問有沒有辦法 當in_out_record_1時段不足六段的時候..check_in再 轉入資料的時候,追到在in_record_1不足六段的最后空白處..
系統時間:2024-06-24 20:42:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!