主从表的问题.
效果图大概如下图所示,它能体现出主表里每一条记录的入仓记录,左边的加减号可以展示与隐藏从表.
结构设计如上图右下角所示,做两个level,和两个DB table,从结构上可以很晰的看到,TV报废池是主表,TV查询是从表.
我们需要做两组数据集,SQL内容按业务自己看着写.
然后是主从表的关联设置,这方面网上资料有很多,但都没有配图,所以我打算细讲这部分内容.
主表设置: 选中TV报废池,在左边属性面板里按如下设置.这里只要设置keyFieldNames这个属性就可以了.需要注意的是,这里要设置成主表里具有唯一性的字段,否则IDE可能会崩溃,比如我的10.3.3
然后是从表设置.选中TV查询,按下图设置:,这里有一点要注意,主表与从表的关联字段要一致,意思是从表会以主表关联的这个字段值,作为筛选条件返回数据.从表如果没有具有唯一特性的字段,keyFieldNames可以留空.
最后一步,也很关键,很多人按上面的内容设置好后,结果发现只返回了一条数据,或者根本没有数据展现出来.
先说后面一种吧,建议先看一下数据库里有没有符合条件的数据吧,我TMD当时就做了一回SB..
如果数据库里明明有好多条记录,结果只返回了一条,说明你SQL写得不对.解决的方案是在从表的SQL语句后面加个order by 关联字段.我们上面设置的关联字段是"物料代码",所以下图就是按这个字段排序的.
这样就算是设置好一个主从表了.
然后我们来看看怎么取从表里的数据,还有从表的RecordCount
看看下面这一句:
DetailRecCount:=cxGrid1DBTableView1.ViewData.Rows[i].AsMasterDataRow.ActiveDetailGridView.DataController.RecordCount;
没错,这TMD就是用来获取从表记录数的,谁能想到它隐藏得这么深!我当时在网上找了半天资料没找到,在群里问也没人回,总算是知道原因了--实在是老司机也不一定知道啊!
然后是取从表的数据:
V:= TcxGridDBTableView(cxGrid1DBTableView1.ViewData.Rows[i].AsMasterDataRow.ActiveDetailGridView).ViewData.Rows[j].Values[k];
吖吖个呸!
下面是效果图和完整代码
procedure TForm1.Button1Click(Sender: TObject); var i,j,k,DetailRecCount:integer; s:string; v:Variant; begin memo1.Clear; for i:=0 to cxGrid1DBTableView1.DataController.RowCount-1 do begin DetailRecCount:=cxGrid1DBTableView1.ViewData.Rows[i].AsMasterDataRow.ActiveDetailGridView.DataController.RecordCount; memo1.Lines.Append(''); s:=''; for k:=0 to 2 do begin v:=cxGrid1DBTableView1.ViewData.Rows[i].Values[k]; if VarIsNull(v) then s:=s+'; ' else s:=s+string(v)+'; '; end; memo1.Lines.Append(s); for j:=0 to DetailRecCount-1 do begin s:=' '; for k:=0 to 3 do begin if k=1 then continue; with TcxGridDBTableView(cxGrid1DBTableView1.ViewData.Rows[i].AsMasterDataRow.ActiveDetailGridView) do v:=ViewData.Rows[j].Values[k]; if VarIsNull(v) then s:=s+'; ' else s:=s+string(v)+'; '; end; memo1.Lines.Append(s); end; memo1.Lines.Append(' 从表共 '+inttostr(DetailRecCount)+' 笔记录.'); end; end; end.
标签:从表,Rows,end,记录,delphi,cxgrid,ViewData,设置,cxGrid1DBTableView1 From: https://www.cnblogs.com/yoooos/p/17059880.html