主从表结构,主从表不设置关联,用代码实现,在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;
var i:INTEGER;
begin sqlstr:='select * from bs_ware_class where wareid='''+ adodsmaster.fieldvalues['wareid']+'''';
opendataset(adodetail,sqlstr);end;
首先,要注意以下设置 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去掉。明细表用批处理。 保存时先保存明细表,再保存主表即可。
我在ADODSMasterAfterScroll中加了一句showmessage(inttostr(adodsmaster.recno));
会看到一条记录显示一个对话框,不停地显示带记录号的消息框,直到adodsmaster的最后一条记录,也就是此事件执行了adodsmaster.recordcount遍
简单说就是记录移动之后,触发的事件
当记录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);
//具体视情况而定。