首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

高分求解,该如何解决

2012-08-15 
高分求解我给大家详细的说说吧,希望大家能够帮我解决这个问题。大家可以没有我的意思,我把大体意思说一下:

高分求解
我给大家详细的说说吧,希望大家能够帮我解决这个问题。
大家可以没有我的意思,我把大体意思说一下:我想实现的功能是一个主表为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属性不能应用于从表,把主表的參數去掉。。。
[解决办法]

探讨
在qy1的afterscroll事件里
....
fieldbyname('gg').asstring+''' and xs='''+qy1.fieldbyname('xs').asstring+'''');
qy2.Open;
可以实现功能,但进入界面的时间太长了。

热点排行