我做的程序是单机程序,不用连接远程数据库.  
有三个表,  分别用三个ClientDataset对应,取名依次为cds1,  cds2,  cds3.  其字段定义是:  
表1  :  ClassType(表示几年级),  ClassName(表示年级名称),  例如:  6,  6年级1班;    
表2  :  ClassType,  TeacherName,  例如:  6,  张老师;  
表3  :  ClassName,  TeacherName,  例如:  张老师,  6年级1班;  
 
问题:  表1与表2形成主细关系,  
即cds2.MasterSource  :=  DataSource1;  cds2.MasterFields  :=  'ClassType';  
但我怎样设置表3的主细关系,让表1和表2数据确定后,表3的数据也确定.  
即:  当我在表1选择某具体年级后,  在表2出现该年级的所有任课老师,  但我在表2选择具体老师后,能够在表3出现老师所代的班级?

解决方案 »

  1.   

    cd3.MasterSource := ds2;
    cds3.MasterFields  :=  'TeacherName';
      

  2.   

    你那样设置,仅仅是将cds3与cds2建立了明细关系, 但还没有将cds3与cds1对应.
      

  3.   

    根据你的表,一个老师所带的班其实是由年级和老师共同决定,因此我会把表调整如下:表1:老师归属表
    -----------------
    id 年级 老师
    1  6    张
    2  6    李
    3  5    张
    4  5    王表2:老师带班表
    -----------------
    id pid 班级
    1  3   5年级1班
    2  1   6年级2班
    3  4   5年级2班
    4  2   6年级1班dataset1为"select distinct 年级 from 表1"
    dataset2为"select * from 表1"
    dataset3为"select * from 表2"dataset2的年级关联dataset1的年级,dataset3的pid关联dataset2的id。你看能满足你的要求吗?
      

  4.   

    定义 cds1.AfterScroll 事件
    if cds1.RecordCount > 0 then
    begin
      cds2.Filtered := False;
      cds2.Filter := 'ClassType='+cds1.FieldValues['ClassType'] + ' ';
      cds2.Filtered := True;
    end; 定义 cds2.AfterScroll 事件
    if Cds2.RecordCount > 0 then
    begin
      cds3.Filtered := False;
      cds3.Filter := 'ClassType='+cds1.FieldValues['ClassType'] + ' And TeacherName = ''' + cds2.FieldValues['TeacherName'] + ''' ';
      cds3.Filtered := True;end;应该可以大概满足lz的想法, 但也有一些特殊情况要考虑。 比如重查数据的时候,要控制事件的执行,否则可能会报错。