近段将以前用BDE写的系统改ADO.主从表是用ADOQuery,在form上,主表用
TDBEdit控件作为输入控件,从表用TDBGrid作输入控件。
现问题是:
当新增时一笔主表后新增从表时:DBGrid中只能显示当前输入之明细资
料,即输入第二笔时,第一笔不见了,增第二笔时,前二笔不见了,但保
存后显示正常。请教各位:怎样才能显示全部资料?
TDBEdit控件作为输入控件,从表用TDBGrid作输入控件。
现问题是:
当新增时一笔主表后新增从表时:DBGrid中只能显示当前输入之明细资
料,即输入第二笔时,第一笔不见了,增第二笔时,前二笔不见了,但保
存后显示正常。请教各位:怎样才能显示全部资料?
保存後顯示正常,不正常是在從表新增時...to neilwq(啄木鸟) :
現用環境是w2k+sp2及D6+sp2,D6好像還沒而額外的補丁吧?難道是MADC?
borland网站有下载
for d6?
DataSource1-->ADOQuery1主表(select * from master)
DataSource2-->ADOQuery2從表(select * from detial where formno=:formno,其中formno為關聯單號)
ADOQeury2的DataSource=DataSource1to hailiang111(任你行) :
能具體點嗎?
dmMMD.tbComOrderdetail.MasterFields:='cOrderNo';
dmMMD.tbComOrderdetail.IndexFieldNames:='cOrderNo_F';
应用delphi自带的关联!!!
你的问题我碰到过,如果不愿意装补丁可以在新增和修改时
adoquery2.datasource:=nil;
在保存或放弃后
adoquery2.datasource:=datasource1;
这样太繁,不好维护,还是装补丁好
能否給一補丁下載連接?是什麼版本?for d6嗎?d6我裝了sp2...
若方便,也可發到我的信箱:[email protected]...謝謝!!
在ADOQuery1的OnAfterScroll中写代码:
ADOQuery2.Close;
ADOQuery2.Open;
在ADOQuery2的OnNewRecord中写代码:
ADOQuery2.FieldbyName('formno').value:=ADOQuery1.FieldbyName('formno').Value;
是否也有相关的问题呢...
当记录插入后是否把 ADOQUERY.CLOSE
当插入第二条时再把 ADOQUERY.OPEN
解决:
当插入后不要对它进行CLOSE操作(或类似的操做)
改用:
withd adodataset do
begin
Append;
Fieldbyname('').Vaule:=...
post;
end;
不妨试试forgot(让一切随风)的方法。
其实这些结果都是一样。他的情况是主表新增,还没Post之前,新增从表数据,从表Post后记录就不见了(这时主表没有Post,更不用说是UpdateBatch了),直到主表Post之后,从表才能见到数据(如有LockType为ltBatchOptimistic的话,则要UpdateBatch后才能看到新增的数据。而做主从表理论上都是用ltBatchOptimistic为好,正象BDE的缓冲的效果一样)。说用TADOTable的人全是没有经事实测试的,在这瞎蒙。不过我不知这是不是ADO的BUG,我也要去找找补丁来试试。
我的解决方案笨了些,我用了ltBatchOptimistic,如果主表是新增时,在从表新增第一笔时我将主表Post,这时请表的STATE为dsEdit再新增从表就没事了。这样就是取消时一定要CancelUpdates了,不然仅Cancel主表的记录都已经Post了。
Project Project1.exe raised exception class EPleException with message 'Row handle referred to a deleted row or a row ed for deletion'.Process stopped. Use Step or Run to continue.請各位幫著看看,謝謝!代碼如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, Grids, DBGrids, ExtCtrls, ADODB ;type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
btnADD: TButton;
btnEdit: TButton;
btnDelete: TButton;
btnSave: TButton;
btnCancel: TButton;
dxDBGrid1: TdxDBGrid;
dxDBGrid1no: TdxDBGridMaskColumn;
dxDBGrid1StartEnd: TdxDBGridMaskColumn;
dxDBGrid1school: TdxDBGridMaskColumn;
DBNavigator1: TDBNavigator;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
procedure btnADDClick(Sender: TObject);
procedure btnEditClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure ADOQuery1AfterScroll(DataSet: TDataSet);
procedure ADOQuery2NewRecord(DataSet: TDataSet);
procedure DBGrid1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//新增代碼
procedure TForm1.btnADDClick(Sender: TObject);
begin
ADOQuery1.Append;
ADOQuery2.Edit;
end;//編輯代碼
procedure TForm1.btnEditClick(Sender: TObject);
begin
ADOQuery1.Edit;
ADOQuery2.Edit;
end;//刪除代碼
procedure TForm1.btnDeleteClick(Sender: TObject);
begin
ADOQuery1.Delete;//明細通過觸發器處理
end;//保存代碼
procedure TForm1.btnSaveClick(Sender: TObject);
begin
ADOQuery1.UpdateBatch();
ADOQuery2.UpdateBatch();
end;//取消代碼
procedure TForm1.btnCancelClick(Sender: TObject);
begin
ADOQuery1.CancelUpdates;
ADOQuery2.CancelUpdates;
end;//手工控制主從表關聯代碼
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
ADOQuery2.Parameters[0].Value := ADOQuery1.FieldbyName('no').Value;
ADOQuery2.Close;
ADOQuery2.Open;
end;//明細新增記錄時,手工為新記錄關聯字段賦值
procedure TForm1.ADOQuery2NewRecord(DataSet: TDataSet);
begin
ADOQuery2.FieldbyName('no').value := ADOQuery1.FieldbyName('no').Value;
end;procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
with ADOQuery2 do
begin
if ((UpdateStatus = usModified) or (UpdateStatus = usInserted))
and (ADOQuery2.FieldByName('no').value = null) then
FieldByName('no').value := ADOQuery1.fieldbyname('no').value;
end;
end;end.
这样写
ADOQuery1.Close;
ADOQuery1.Open;
或者
Adotable.active:=false;
Adotable.active:=true;
重新打开ADO数据集的同时,也把Cache清空了。