主从关系表的显示:
主表数据来源是一个有固定列数的查询,
从表数据来源的查询,列数是不固定的(ACCESS,交叉表查询)
通过:
for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
dxDBGrid3.CreateColumn(TdxDBGridColumn);
dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields[i].FieldName;
end;
动态创建的列。
问题:刚刚执行查询,主从表数据都可以正常显示,当主表的选择当前行外的其它记录时,
系统提示错误:
在对应所需名称或序数的集合中,未找到项目。
在主表的 OnDataChange 的事件中添加这添加这部分创建列代码,也是还有同样的错误。
这个该怎么解决 ?
主表数据来源是一个有固定列数的查询,
从表数据来源的查询,列数是不固定的(ACCESS,交叉表查询)
通过:
for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
dxDBGrid3.CreateColumn(TdxDBGridColumn);
dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields[i].FieldName;
end;
动态创建的列。
问题:刚刚执行查询,主从表数据都可以正常显示,当主表的选择当前行外的其它记录时,
系统提示错误:
在对应所需名称或序数的集合中,未找到项目。
在主表的 OnDataChange 的事件中添加这添加这部分创建列代码,也是还有同样的错误。
这个该怎么解决 ?
是当主表换行时,从表的列数发生变化时出现的错误。
FrmTotal.dxDBGrid3.Columns[0].Destroy; 然后再根据从表的数据源重新创建列: for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
dxDBGrid3.CreateColumn(TdxDBGridColumn);
dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields[i].FieldName;
end;
还是一样会有错误。应该在什么事件中进行这步操作,试了很多事件都没什么用。
FrmTotal.dxDBGrid3.Columns[0].Destroy;改成
dxDBGrid3.Columns.Clear;
这样不行吗?既然是主从表,你可以在主表的AfterOpen事件中来实现你的代码,OnDataChange事件是不合适的
主表的数据集,也只有点击“查询”的时候Open一次。
然后在出现的数据中,更换选择主表的不同记录时,就没有重新打开数据集了。
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
dxDBGrid3.Columns.Clear;
with doquery2 do
begin
。
end;
//实现dxDBGrid3列生成,
end;
var
i: Integer;
begin
// 从表查询参数赋值
DM.ADOQProQry2.Parameters.ParamByName('ID00').Value := DM.ADOQProQry1.FieldByName('ID00').AsString;
if DM.ADOQProQry2.Active = True then DM.ADOQProQry2.Close;
DM.ADOQProQry2.Active := True;
if FindComponent('FrmTotal.dxDBGrid3') <> nil then
begin
while FrmTotal.dxDBGrid3.ColumnCount > 0 do
FrmTotal.dxDBGrid3.Columns[0].Free; // 没有 clear,用 Free 和 Destory一样。 for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
FrmTotal.dxDBGrid3.CreateColumn(TdxDBGridColumn);
FrmTotal.dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields[i].FieldName; end;
end;
end;在主表的AfterScroll事件中刷新(上面代码),也是和前面同样的错误。
FrmTotal.dxDBGrid3.Columns[FrmTotal.dxDBGrid3.ColumnCount-1].Destroy;
FrmTotal.dxDBGrid3.Columns[0].Free; // 没有 clear,用 Free 和 Destory一样。
for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
FrmTotal.dxDBGrid3.CreateColumn(TdxDBGridColumn);
FrmTotal.dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields [i].FieldName;
end;
处理显示这段代码我测试过,应该是没问题的
下断点自己跟踪下,
把procedure ADOQProQry1AfterScroll(DataSet: TDataSet);的代码贴全出来看看,
var
i: Integer;
begin
DM.ADOQProQry2.Parameters.ParamByName('ID00').Value := DM.ADOQProQry1.FieldByName('ID00').AsString;
if DM.ADOQProQry2.Active = True then DM.ADOQProQry2.Close;
DM.ADOQProQry2.Active := True;
if FindComponent('FrmTotal.dxDBGrid3') <> nil then
begin
while FrmTotal.dxDBGrid3.ColumnCount > 0 do
FrmTotal.dxDBGrid3.Columns[0].Destroy; for i := 0 to DM.ADOQProQry2.FieldCount - 1 do
begin
FrmTotal.dxDBGrid3.CreateColumn(TdxDBGridColumn);
FrmTotal.dxDBGrid3.Columns[i].FieldName := DM.ADOQProQry2.Fields.Fields[i].FieldName; if DM.ADOQProQry2.Fields.Fields[i].FieldName = 'ID00' then
begin
FrmTotal.dxDBGrid3.Columns[i].Visible := False;
end; if DM.ADOQProQry2.Fields.Fields[i].FieldName = '时间' then
begin
FrmTotal.dxDBGrid3.Columns[i].Width := 70;
FrmTotal.dxDBGrid3.Columns[i].Alignment := taCenter;
FrmTotal.dxDBGrid3.KeyField := DM.ADOQProQry2.Fields.Fields[i].FieldName;
end;
end;
end;
end;
就会先出现:
在对应所需名称或序数的集合中,未找到项目。
这个错误了。
cxGrid1.BeginUpdate;
cxGrid1DBTableView1.BeginUpdate;
cxGrid1DBTableView1.ClearItems;
for iLoop:=0 to i-1 do
begin
FColumn:=cxGrid1DBTableView1.CreateColumn;
FColumn.DataBinding.FieldName:=qry_kyesb.Fields[iLoop].FieldName;
FColumn.HeaderAlignmentHorz:=taCenter;
FColumn.Name:='cxGrid1DBTableView1Column'+ IntToStr(iLoop+1);
FColumn.Width:=95;
FColumn.OnGetDisplayText:=nil;
end;
cxGrid1DBTableView1.DataController.Refresh;
cxGrid1DBTableView1.EndUpdate;
cxGrid1.EndUpdate;
finally
Screen.Cursor:=crDefault;
FreeAndNil(RES_LOADING_F);
end;
DM.ADOQProQry2.close;
DM.ADOQProQry2.sql.clear;
DM.ADOQProQry2.sql.add('');
DM.ADOQProQry2.open;
在procedure TDM.ADOQProQry1AfterScroll(DataSet: TDataSet);中下断点跟踪到哪一句出的错?如果你DM.ADOQProQry2结果集的字段是不变的话就没必要在TDM.ADOQProQry1AfterScroll事件中做字段显示处理,在AfterOpen事件中处理一次就够了,如果是有变化的就得像现在这样处理,
begin
AColumn.AssignNodeValues(ANode);
end;这个的 end 语句。
SELECT Left(RQ0000,8)&PLANID&PFID00&BANCI AS ID00,
PRODUCTRecord.[PCNUM] AS 批次号, PRODUCTRecord.[BEGINT] as 时间, PRODUCTRecord.[TOTWEIGHT]
FROM PRODUCTRecord
WHERE Left(RQ0000,8)&PLANID&PFID00&BANCI = :ID00
GROUP BY PRODUCTRecord.[PCNUM], PRODUCTRecord.[BEGINT], PRODUCTRecord.[TOTWEIGHT],
Left(RQ0000,8)&PLANID&PFID00&BANCI
PIVOT PRODUCTRecord.[YPCODE]把主从表单独,不设置关联,在查询的时候再给从表参数赋值,
这样真的是可以了。
谢谢 goodhj,也谢谢各位回帖的关注!