首页 > 其他分享 >delphi cxgrid记录一些网上都不一定能找到的资料

delphi cxgrid记录一些网上都不一定能找到的资料

时间:2023-01-18 15:23:17浏览次数:56  
标签:从表 Rows end 记录 delphi cxgrid ViewData 设置 cxGrid1DBTableView1

主从表的问题.

效果图大概如下图所示,它能体现出主表里每一条记录的入仓记录,左边的加减号可以展示与隐藏从表.

 

 结构设计如上图右下角所示,做两个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

相关文章