關于DBGrid的菜鳥級問題(50分)

  • 主题发起人 主题发起人 fengwxp
  • 开始时间 开始时间
F

fengwxp

Unregistered / Unconfirmed
GUEST, unregistred user!
請教各位大蝦:
在一個DBGrid中直接錄入數據,然后保存至Table中.如何實現:
1.當按下一'新增'Button時(設Table1.append),DBGrid中不顯示記錄,就像與其關聯的Table
是個無記錄的空表一樣(因為當Table中有記錄時,令Table1.Active:=true;時,DBGrid中會
出現Table中已有之全部記錄).
2.當在DBGrid中輸入多條後,按'OK'按鈕才將其真正存入數據庫中,而此時如果按下'Cancel'
按鈕後,數據不寫入數據庫中(放棄).好像在Table的方法中,無論Append,insert,edit,即
使不在數據錄入後不寫Post,而離開當前記錄後(如錄入完第一條到第二條記錄時,第一條
自動Post了)記錄像便寫入數據庫.我如何限制其自動Post,而執行一'確認'動作呢?
 
1、断开数据绑定不就没得了?
2、a:可以用一个临时表,Tclientdataset可以实现,
b:可以用cacheupdate技术!
 
可以将Table的CachedUpdate设为True;
当Click Ok Button : Table.ApplyUpdates;
当Click Cancel button : Table.CancelUpdates;
 
請問TomBoy,用一个临时表,Tclientdataset如何实现?
 
他所说的TClientDataSet是三层里面的东东了,你这儿不太实用.你照sundart的方法试.
 
To:tomboy
我知道TClientDataSet是三層里面用的,但三層也沒有什么好神秘的嗎?
還是想請教tomboy,用TClientDataSet控件如果實現我的問題.
請給予回答好碼?
 
fengwxp,我在前些天的项目中也碰到过这个问题。我是这么做的:因为是新增一张单据,所以
程序自动生成一个新的单据编号,然后用QUERY用新的单据编号去查,结果当然是没有。用户在
DBGRID中什么也没看到,然后在操作;如果用户按取消,就ROLLBACK(我用的是INTERBASE)。
其实用一个临时表也是一个好办法。希望对您有所启发。
 
根据我个人的实作经验,用kbmMemTable控件来实现临时表更新数据是比TClientDataSet
更好的办法,至少我个人是这么认为,并在我的几个项目中都是这样的。

当然对于你的问题,可能会有比用临时表更好的办法,但如果用临时表的话,
TkbmMemTable的CreateTableAs方法会生成一个与原数据源一模一样的表出来,包括字段
的DisplayLable等属性,还有其它好处,而且不用发布DLL文件(象Madis.dll)。怎么样?
到www.51delphi.com去下吧!
 
求救!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

我不明白為什么沒有人愿意繼續幫我.難道大富翁上已無高手嗎(但是僅是一個簡單的問題).
或是高手們太高傲了.要么就是嫌分給得太低,我可以加到100分呀.
其實我自己得覺得我的問題很簡單,只是現在的我經驗太少而已.一個Master-Detail的
問題,折騰了我這么多天.本來可以換用其它方法,但是當初的想法是仿照ERP系統的風格做
一個關于'托個加工'的程序.大家可以想想,在一個Master-Detail的程序里,當按'新增'按
鈕時,肯定不希望在在DBGrid里將明細檔(detail)部分的記錄全顯示出來吧.我也有試讓主
檔(Master)的單號先為一個空號(我是以單號為Primary Key),然后對應的明細檔因抓不到
對應Key的資料而顯示為空,但仍處在Open狀態可以輸入多條記錄,但保存時主檔同明細檔的
對應出了問題,而且若是放到網絡上多人同時使用,問題出現的頻率會更高!
現在初步的只是想先解決輸入數據的問題.有誰愿幫我!!!!!!!!!!!!!!!!!
 
1. Open another form to add, click OK then return.
2. Use CacheUpdate.
 
MasterTable 与 DetailTable 的MasterField在MasterTable中用一个自动增量字段
(不用单号),就行了!
不会出现DetailTable记录全部显示的情况。
 
To:蔣勁剛
請問如何設定字段為'自動'增量字段.
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, Grids, DBGrids;

type
TForm1 = class(TForm)
DataSource1: TDataSource; //Set Dataset to Query1;
DBGrid1: TDBGrid; //Set DataSource to dataSource1
Button1: TButton; //add
Button2: TButton; //post
Query1: TQuery; //This is a common query, Set RequestLive and CachedUpdate to True, SQL: select * from yourtable where try = 'no value equal this';
Query1Try: TStringField; //table has one field call try
Button3: TButton; //cancel
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
query1.Open;
query1.Append;
dbgrid1.Setfocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
query1.ApplyUpdates;
query1.Close;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
query1.CancelUpdates;
query1.Close;
end;

end.


 
你用的是什么数据库呀,各种数据库不同的
 
To:蒋劲刚
我用的是SQL Server7.0+繁體Win2000 Server(sp2)+Delphi5.0(sp1)
 
成批保存,成批修改,我建议你使用假三层,放一个ClientDataSet1和DataSetProvider1,
与table1结合使用,对表的各种操作全都通过ClientDataSet1来完成。
 
可以在你的数据库中建立Generator 和 tiger 来实现自动增量
 
To:ym_adam
請問具體實現代碼!
To:蒋劲刚
能說詳細一些嗎?
 
多人接受答案了。
 
后退
顶部