近段将以前用BDE写的系统改ADO.主从表是用ADOQuery,在form上,主表用
TDBEdit控件作为输入控件,从表用TDBGrid作输入控件。
现问题是:
当新增时一笔主表后新增从表时:DBGrid中只能显示当前输入之明细资
料,即输入第二笔时,第一笔不见了,增第二笔时,前二笔不见了,但保
存后显示正常。请教各位:怎样才能显示全部资料?

解决方案 »

  1.   

    保存后數據集(Refresh)刷新一次﹐試試。
      

  2.   

    to SayForever(恒) :
    保存後顯示正常,不正常是在從表新增時...to neilwq(啄木鸟) :
    現用環境是w2k+sp2及D6+sp2,D6好像還沒而額外的補丁吧?難道是MADC?
      

  3.   

    有专门ado的补丁
    borland网站有下载
      

  4.   

    to  neilwq(啄木鸟) :
    for d6?
      

  5.   

    建议你再用一个ADOQUERY或者ADOTABLE连DBGRID,然后添记录的时候刷新.
      

  6.   

    Delphi好像一直有这个问题,不信你用delphi的sql explore添加数据试试看?
      

  7.   

    有關聯,具體做法:
    DataSource1-->ADOQuery1主表(select * from master)
    DataSource2-->ADOQuery2從表(select * from detial where formno=:formno,其中formno為關聯單號)
    ADOQeury2的DataSource=DataSource1to hailiang111(任你行) :
    能具體點嗎?
      

  8.   

    dmMMD.tbComOrderdetail.MasterSource:=dmMMD.dsComOrder;
      dmMMD.tbComOrderdetail.MasterFields:='cOrderNo';
      dmMMD.tbComOrderdetail.IndexFieldNames:='cOrderNo_F';
    应用delphi自带的关联!!!
      

  9.   

    你有没有装ado的补丁?
    你的问题我碰到过,如果不愿意装补丁可以在新增和修改时
    adoquery2.datasource:=nil;
    在保存或放弃后
    adoquery2.datasource:=datasource1;
    这样太繁,不好维护,还是装补丁好
      

  10.   

    to  neilwq(啄木鸟) :
       能否給一補丁下載連接?是什麼版本?for d6嗎?d6我裝了sp2...
    若方便,也可發到我的信箱:[email protected]...謝謝!!
      

  11.   

    不要设置ADOQuery2的关联DataSource=DataSource1,自己写代码控制,还有,关联的字段最好不要用自动增列,否则容易出问题。
    在ADOQuery1的OnAfterScroll中写代码:
    ADOQuery2.Close;
    ADOQuery2.Open;
    在ADOQuery2的OnNewRecord中写代码:
    ADOQuery2.FieldbyName('formno').value:=ADOQuery1.FieldbyName('formno').Value;
      

  12.   

    Delphi 6 中的Ado 怎么样啊!
    是否也有相关的问题呢...
      

  13.   

    详细检察一下你的程序:
        当记录插入后是否把 ADOQUERY.CLOSE 
        当插入第二条时再把 ADOQUERY.OPEN
      解决:
       当插入后不要对它进行CLOSE操作(或类似的操做)
      

  14.   

    如果用sql语句插入的话,会有这个问题。
    改用:
    withd adodataset do
     begin
      Append;
      Fieldbyname('').Vaule:=...
      post;
     end;
      

  15.   

    TO:wushenjian(Maverick) 楼主已经说用ADO,所以方法不适用。
     不妨试试forgot(让一切随风)的方法。
      

  16.   

    这个我也是遇到过,好象很多的人都不明的一样。一个说你要提交(UpdateBatch),一个说你要用TADOTable的MasterSource来关联等等。
    其实这些结果都是一样。他的情况是主表新增,还没Post之前,新增从表数据,从表Post后记录就不见了(这时主表没有Post,更不用说是UpdateBatch了),直到主表Post之后,从表才能见到数据(如有LockType为ltBatchOptimistic的话,则要UpdateBatch后才能看到新增的数据。而做主从表理论上都是用ltBatchOptimistic为好,正象BDE的缓冲的效果一样)。说用TADOTable的人全是没有经事实测试的,在这瞎蒙。不过我不知这是不是ADO的BUG,我也要去找找补丁来试试。
    我的解决方案笨了些,我用了ltBatchOptimistic,如果主表是新增时,在从表新增第一笔时我将主表Post,这时请表的STATE为dsEdit再新增从表就没事了。这样就是取消时一定要CancelUpdates了,不然仅Cancel主表的记录都已经Post了。
      

  17.   

    謝謝各位支持!用forgot(让一切随风) 的方法基本正常,但在cancel時出錯:
    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.
      

  18.   

    在ADO中最好不要用Cancel或者Refresh等事件。
    这样写
    ADOQuery1.Close;
    ADOQuery1.Open;
    或者
    Adotable.active:=false;
    Adotable.active:=true;
    重新打开ADO数据集的同时,也把Cache清空了。
      

  19.   

    </font><font size=10>刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!</font><<font>