高分求解
我给大家详细的说说吧,希望大家能够帮我解决这个问题。
大家可以没有我的意思,我把大体意思说一下:我想实现的功能是一个主表为invitem存储商品的基础数据,字段有品种、规格、形
式,另一表gybom存储商品的生产定额,我做了一个查询程序,
在一个表单上有上下两个DBGrideh,分别设置好各自的datasource(主表为datasource1)和数据集(上面的DBGrideh即主表对应的为
qy1,子表为qy2,),设置qy2的datasource为datasource1,formshow的代码为
qy1.Close;
qy1.SQL.Clear;
qy1.SQL.Add('select top 1000 pz,gg,xs from invitem order by mdid');
qy1.open;
qy2.Close;
qy2.SQL.Clear;
qy2.SQL.Add('select * from gybom where pz=:pz and gg=:gg and xs=:xs');
qy2.open;
功能为移动上面DBGRIDeh中的记录,下面的DBGridEH的记录自动跟着对应改变,但这样只能查询对应主表当前记录的数据,不能实现
查询gybom表中大批量数据的需要,在表单上加了两个按钮,
点击第一个按钮的代码
qy2.DataSource:=nil;
qy2.Close;
qy2.SQL.Clear;
qy2.SQL.Add('select * from gybom where '+gstj+'');
qy2.Open;
这样就可以查大量的数据了
在子表的DBGridEH上右键上有筛选按钮,代码为
procedure Tzdsx.Button1Click(Sender: TObject);
begin
with application.FindComponent(dqform) as tform do
begin
with tdbgrideh(FindComponent(dqkj)) do
begin
with DataSource.DataSet do
begin
Filtered:=false;
if pos('like',ComboBox1.Text)>0 then
filter:=SelectedField.FieldName+' '+combobox1.text+' '+''''+'%'+edit1.Text+'%'+''''
else
** filter:=SelectedField.FieldName+' '+combobox1.text+' '+''''+edit1.Text+'''';
Filtered:=true;
end;
end;
end;
zdsx.Release;
end;
当执行到有**的代码时,提示'qy2' filter property cannot be used for details tables,
但如果开始的时候不把子表qy2的datasource设置为datasource1,子表右键的筛选是不会出问题的,也就是说执行了qy2.datasource:=nil后,再点击右键筛选的时候才出现上面提示的错误,有知道是怎么回事的吗?
[解决办法]
提示已经很清楚了,就是filter属性不能应用于从表,参考方案:在主列表移动时把从表filter作为SQL where条件的一部分
[解决办法]
qy1,qy2都是ADOQUERY组件对吧?
那就不要通过qy2的datasoure属性去设置主从关系了,把那属性清除掉,你通过qy1的afterscroll事件里写qy2的查询不就行了,犯不着还得自己通过一个按钮去刷,并且这样你也可以对qy2的结果集想怎么过滤就怎么过滤
[解决办法]
对于这种主从表的查询建议字表查询不要直接放在afterscroll事件里面,可以放一个Timer控件,触发时间可以设置为500ms,在Timer触发的事件里面放字表查询语句,查询之前记得把Timer.Enabled设置为False,主表的afterscroll事件里面把Timer.Enabled设置为True。这样可以避免连续发生afterscroll事件时候会连续触发字表查询。
[解决办法]
filter属性不能应用于从表,把主表的參數去掉。。。
[解决办法]