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

將上一筆資料給下一筆用

尚未結案
chengwenlien
一般會員


發表:11
回覆:16
積分:5
註冊:2004-01-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-05 15:46:45 IP:218.18.xxx.xxx 未訂閱
在輸入資料時,可能上一筆資料與下一筆大致相似 需要將上一筆資料給下一筆用,請教該如何寫呢? 謝謝指導
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-05 15:56:15 IP:61.218.xxx.xxx 未訂閱
可用動態Variant型態陣列存TDataSet值,並新增TDataSet. Delphi follower
------
Delphi
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-05 15:56:45 IP:61.218.xxx.xxx 未訂閱
可用動態Variant型態陣列存TDataSet值,並Append TDataSet. Delphi follower
------
Delphi
chengwenlien
一般會員


發表:11
回覆:16
積分:5
註冊:2004-01-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-05 16:04:29 IP:218.18.xxx.xxx 未訂閱
引言: 在輸入資料時,可能上一筆資料與下一筆大致相似 需要將上一筆資料給下一筆用,請教該如何寫呢? 謝謝指導
可否有實際程序呢?謝謝
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-05 16:07:44 IP:61.221.xxx.xxx 未訂閱
您好:
procedure TForm1.ADOQuery1BeforeScroll(DataSet: TDataSet);
begin
  if form1.Active then
    AA:=  ADOQuery1.fieldbyname('姓名').AsString;
end;    procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
  if form1.Active then
  begin
    ADOQuery1.Edit;
    ADOQuery1.fieldbyname('姓名').AsString:= AA;
  end;
end;
參考看看!!
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-05 16:19:15 IP:61.218.xxx.xxx 未訂閱
 
procedure cp_field_val(sour: TQuery);
var
  i: Integer;
  ds: Variant;
begin
  if not(sour.Active) then exit;
  ds := VarArrayCreate([0,sour.FieldCount -1], varVariant);
  for i := 0 to sour.FieldCount - 1 do
    if (sour.Fields[i].DataType <> ftDataSet) and
       (sour.Fields[i].FieldKind = fkData) then
      ds[i] := sour.Fields.Fields[i].Value;
  sour.Append;
  for i:= 0 to sour.FieldCount -1 do
    if (sour.Fields[i].DataType <> ftDataSet) and
       (sour.Fields[i].FieldKind = fkData) then
      sour.Fields[i].Value := ds[i];
end;
Delphi follower
------
Delphi
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-05 16:19:34 IP:218.163.xxx.xxx 未訂閱
var i:integer;
  s:string;
  v:Variant;
begin
  with DataSet do begin
//先取得所有欄位名稱, 並以;間隔
    for i := 0 to (FieldCount-1) do
      s := s   ';'   Fields[i].FieldName;
    Delete(s, 1, 1);
    v:=DataSet[s];  //取得Current Record所有欄位值,存入v
                    //會自動將v create成variant array
    append;
    DataSet[s]:=v;  //寫入所有欄位
    post;
  end;
end;
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-05 22:06:51 IP:211.76.xxx.xxx 未訂閱
參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40256
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-06 00:37:04 IP:203.204.xxx.xxx 未訂閱
引言: 在輸入資料時,可能上一筆資料與下一筆大致相似 需要將上一筆資料給下一筆用,請教該如何寫呢? 謝謝指導
以下兩段程序是我常使用的方法 除了你要的功能外,亦可把它當做記錄的暫存陣列(比陣列好用因為可用Strings.Value['FieldName']方式很明確的指定欄位值)
    // 將tDataSet目前資料錄依FldSave參數描述儲存到TStrings
// FldSave := ' Fld1;Fld2;Fld3...' ; // 要儲存的欄位
//FldSave :=  'Fld1;Fld2;Fld3...' ; // 同上功能
// FldSave := '-Fld1;Fld2;Fld3...' ; // 不要儲存的欄位
Procedure RecSave(DataSet:TDataSet;Var Strings:TStringList;FldSave:String);
Var
  i,nLen:Integer;
  FldName:String;
  nMethod : Integer ;
Begin
  If DataSet.Eof Then Exit;
  FldSave := UpperCase(FldSave);
  nMethod := 0 ;
  If Length(FldSave) > 0 Then Begin
    If Copy(FldSave,1,1)='-' Then nMethod := -1 Else nMethod := 1 ;
  End;
  Strings.Clear ;
  With DataSet Do Begin
    nLen := FieldCount ;
    For i:= 0 To nLen-1 Do Begin
      FldName := UpperCase(Fields[i].FieldName);
      Case nMethod of
       -1: If Pos(FldName,FldSave) >0 Then Continue ;
        1: If Pos(FldName,FldSave) =0 Then Continue ;
      End;
      If Strings.IndexOf(FldName) = -1 Then Begin
        Strings.Add(FldName '=' FieldByName(FldName).AsString );
      End;
    End;
  End;
End;
// 將TStrings儲存的記錄值回存到記錄
Procedure RecRestore(DataSet:TDataSet;Strings:TStringList);
Var
  i,nLen:Integer;
  FldName:String;
Begin
  If not (DataSet.State IN [dsEdit,dsInsert]) Then Exit;
  With DataSet Do Begin
    nLen := Strings.Count ;
    For i:= 0 To nLen-1 Do Begin
      FldName := Strings.Names[i];
      If FindField(FldName)<> nil Then Begin
        FieldByName(FldName).AsString := Strings.Values[FldName];
      End;
    End;
  End;
End;    // 使用方式如下
procedure TForm1.BitBtn1Click(Sender:TObject);
Var
  Strings : TStrings ;
begin
  Strings := TStringList.Create ;
  DataSet.First;
  RecSave(DataSet,Strings,'');  // '' 代表全部的欄位皆要儲存
  DataSet.Insert;
  // 將TStrings儲存的記錄值回存到記錄
  RecRestore(DataSet,Strings);
  
  //或是 如下用法
  DataSet.FieldByName('AAA').AsString := Strings.Values['AAA'] ;//AAA為欄位名稱
  DataSet.Post;
  Strings.Free;
End;    參考看看!!!!!!!!!!!!!!!!!!
 
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-06 00:43:14 IP:203.204.xxx.xxx 未訂閱
引言:
var i:integer;
  s:string;
  v:Variant;
begin
  with DataSet do begin
//先取得所有欄位名稱, 並以;間隔
    for i := 0 to (FieldCount-1) do
      s := s   ';'   Fields[i].FieldName;
    Delete(s, 1, 1);
    v:=DataSet[s];  //取得Current Record所有欄位值,存入v
                    //會自動將v create成variant array
    append;
    DataSet[s]:=v;  //寫入所有欄位
    post;
  end;
end;
這招倒沒玩過,好好學起來 !!
chengwenlien
一般會員


發表:11
回覆:16
積分:5
註冊:2004-01-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-06 08:17:42 IP:218.18.xxx.xxx 未訂閱
感謝各位大大地指導 在下又學了好幾招
系統時間:2024-05-19 7:12:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!