200分求解简单主从表问题(200分)

  • 主题发起人 philipliu
  • 开始时间
P

philipliu

Unregistered / Unconfirmed
GUEST, unregistred user!
主表(Main):MainId, MainNa
从表(Mini):MiniId, MainId, MiniNa
主从表都用TADOQuery:
主表(Main):select * from Main
从表(Mini,DataSource为MainDS):select * from Mini where MainId = :MainId
问题:当从表按某字段排序(Mini.Sort = 'MiniNa ASC'),从表新增数据时MiniNa会自动
出现主表中MainId的值,为什么什么这样?有什么办法解决?
 
用SQL SERVER 2000,ADO,Delphi 6开发。
 
为什么什么这样?——这是什么意思?
 
>>问题:当从表按某字段排序(Mini.Sort = 'MiniNa ASC'),从表新增数据时MiniNa
>>会自动出现主表中MainId的值,为什么什么这样?有什么办法解决?
如果你不想它出现,可以在从表中把MainId字段的VISIBLE设置成FALSE。
其实这就是DELPHI知道主从表关系后,自动帮你加的字段。MainId是你表的关键字。
 
不太明白。
 
[red]的确存在这种问题,我刚刚试过,但是究竟是那个字段会自动被填充我想也是无据可寻的,除非看到源程序,但是你仍然可以用下面的方法来解决的
那就是在TADOQuery的OnNewRecord 加上如下一句话:
DataSet.FieldByName('MiniNa').AsString:='';
这样就可以了。
希望能解决你的问题。
[/red]
 
明白了,但是答案别人也给了[:(]
 
[red]qiaoda_ly的方法太麻烦了,因为不固定哪个字段排序,那不是每个从表的字
段都要先设空值?[/red]
 
wumeng的‘方法’试过了,不行啊。
 
你作的是两层的还是三层的,两层的话用巢状表肯定能行的。
从表(Mini,DataSource为MainDS):select * from Mini 用这个语句。再设置从表DATASET
的MasterFields和Datasourse为主表的相应值。

再加上我上面的方法就行了。
 
wumeng,是两层的,用‘Sort’排序后,从表一修改就全部记录消失,你可以试一下。
 
>>是两层的,用‘Sort’排序后,从表一修改就全部记录消失,你可以试一下。
我试过了,没问题的。这是代码。。。我用的是ADO控件。点DBGRID的TITLE排序。
procedure TForm1.DBGrid2TitleClick(Column: TColumn);
var aDataset:TDataset;
begin
if (Column.Grid.DataSource=nil)or(Column.Grid.DataSource.DataSet=nil) then Exit;
aDataset:=Column.Grid.DataSource.DataSet;
if aDataset is TCustomADODataSet then
with TCustomADODataSet(aDataset) do
begin
if (Pos(Column.FieldName, Sort) = 1) and (Pos('DESC', Sort) = 0) then
Sort := Column.FieldName + ' DESC'
else
Sort := Column.FieldName + ' ASC';
end;
end;
 
TO:wumeng,
是排序后操作从表,你试过了吗?设MasterField就有奇怪的情况发生,一修改从表记录
就会全部消失,如按问题中方法设‘MainId = :MainId’就会出现题目中的情况。
谁能用简单方法搞定这个问题,再加200分啦。
 
>>一修改从表记录就会全部消失
你不能修改主表的关键字段!!!这个约束可以在数据库中设置。

我这里测试是没有问题的,要不我发给你我的测试程序。给我你的EMAIL!!!
 
是任意字段的修改。
 
>>是任意字段的修改。
你不能修改主表的关键字段!!!这个约束可以在数据库中设置。
当你在数据库中设置了外部关键字后,修改主表的关键字段时,数据库会报错误,不让你
修改的。如果你有这个需求,那你要在程序中自己处理,把从表的相应关键字段也修改成
和主表一样就可以了(在主表的BeforPost中修改)。。。
 
换一种方法呢:
主表(Main):MainId, MainNa
从表(Mini):MiniId, MainId, MiniNa
主从表都用TADOQuery:
主表(Main):select * from Main
从表(Mini):select * from Mini

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
fs:string;
begin
fs:=adoquery1.fieldbyname('MainId').AsString;
adoquery2.Filter:='MainId='+#39+fs+#39;
adoquery2.Filtered:=True;
end;
 
>>:hsan,换一种方法呢:
这样你要作的动作会比较多。如:维护数据的完整性。还有从表的数据时用户删除主表记录。


 
别走题啦。
 
>>别走题啦。
按我说的
来自:wumeng, 时间:2002-9-17 8:30:00, ID:1329139 | 编辑
>>是任意字段的修改。
上面这个试试。。。
 
顶部