主从表结构,主从表不设置关联,用代码实现,在mastertableAFTERSCROLL事件中打开从表,发现打开主表时事件会反复执行,主表有多少记录,就执行多少遍,(主表有10条,就执行10遍这个事件,有10000条就执行10000遍,。晕死了!怎么受得了)怎么只让它执行一遍呢,或者怎么让主表打开时不遍历记录呢。代码如下:procedure TWareInfo.ADODSMasterAfterScroll(DataSet: TDataSet);
var  i:INTEGER;
begin    sqlstr:='select * from bs_ware_class where wareid='''+ adodsmaster.fieldvalues['wareid']+'''';
    opendataset(adodetail,sqlstr);end;

解决方案 »

  1.   

    加个变量标识一下。在onshow事件过后再执行
      

  2.   

    在sql server 的northwide 中建立主表:       create table sell_main( sell_id char(10),cust_name char(10) Primary key(sell_id) )       go    建立从表:       create table sell_item( sell_id char(10),inv char(10) ,amt float,qty float Primary key(sell_id,inv) )       go
        首先,要注意以下设置        1.要注意报从表qrydetail设置,批保存开式: 即:locktype= batchoptimistic ,cursor=keyset,cursorlocation =cluseclient        2.代码:           procedure TForm1.FormCreate(Sender: TObject);
               begin
                  qrymain.Close;
                  qrydetail.Close;
                  qrymain.SQL.Add(' select *   from   sell_main)   ;
                  qrydetail.SQL.add('select * from sell_item where sell_id = :sell_id')  ;
                  qrymain.Open;
                  qrydetail.Open;  
               end;       3.代码:          procedure TForm1.qrymainAfterScroll(DataSet: TDataSet);
              begin
                 qrydetail.Close;
                 qrydetail.Parameters.ParamByName('sell_ID').Value := qrymain.fieldbyname('sell_id').value;
                 qrydetail.Open;          end;
        以上就是主要的设置。还有注意主从表的保存问题:    主表不要用批处理,直接保存。把ltBatchOptimistic去掉。明细表用批处理。     保存时先保存明细表,再保存主表即可。
      

  3.   

    感谢kye_jufei,说的很详细,不过我的问题还存在,难道你没有这样的问题吗
    我在ADODSMasterAfterScroll中加了一句showmessage(inttostr(adodsmaster.recno)); 
    会看到一条记录显示一个对话框,不停地显示带记录号的消息框,直到adodsmaster的最后一条记录,也就是此事件执行了adodsmaster.recordcount遍
      

  4.   

    首先你要明白AfterScroll在什么情况下会执行,
        简单说就是记录移动之后,触发的事件 
    当记录First, Last, MoveBy, Next, Prior, FindKey, FindFirst, FindNext, FindLast, FindPrior,Locate等操作完成后触发的事件,
    所以你刚才说的会执行多遍是很正常的情况,对照操作完成后会触发的事件一看便知。 //具体解决方案也很简单,在ADOMasterTable.Open之前,将数据集滚动事件置为nil
     ADOMasterTable.AfterScroll := nil;   
     ADOMasterTable.Open;
     //将ADOMasterTable的AfterScroll事件指向ADOMasterTableAfterScroll
     ADOMasterTable.AfterScroll := ADOMasterTableAfterScroll; 
     //简单触发一下ADOMasterTableAfterScroll事件
     ADOMasterTable.First; 
     //也可以直接写ADOMasterTableAfterScroll(ADOMasterTable);
     //具体视情况而定。
      

  5.   

    不管怎么样,你用用代码实现主从关联,效率都太低了点,你是在三层应用中吧,dataset主从关联建立后,PacketRecords的值自动变成了0,你要手动改为-1,你改完看看效果
      

  6.   

    楼主不应放在Adoquery1的afterscroll事件事执行,应放在主表的adoquery afteropen中执行这句。