先具体说说现在问题。一个产品评审统计系统,采用D7+ado+Access 。现在已建立了两个表 分别为 parts  faults表 parts 字段名称   类型bujian    文本型   (用来存放产品的各部件,如  门 ,顶盖 ,包装 。)表 Faults字段名称   类型door      文本型   (用来描叙产品部件 门位置的缺陷。。)<-缺陷描叙有很多种
topPanel   文本型   (用来描叙产品部件,门位置的缺陷。。)<-缺陷描叙有很多种
                      
                         parts表里 bujin 有多少个部件,表Faults 就有多少个字段对相对应.现在的问题是:我用两个Combobox ,分别为Combobox1 Combobox2Combobox1 用来显示表Parts中字段bujian的所有记录,Combobox2用来显示表Faults里某个字段的所有记录。如何在选中combobox1一个选项时,Combobx2 出现与combobox1  相对的字段所有信息。如选中了Combobox1 中 door 时, combobox2会自动列出与combobox1 door 对应的door字段中所有的缺陷描叙?
我的表是不是设计有问题?如果有,怎么设计? 谢谢   PS:问题解决马上结帖!!!

解决方案 »

  1.   

    Combobox1 用来显示表Parts中字段bujian的所有记录,Combobox2用来显示表Faults里某个字段的所有记录。如何在选中combobox1一个选项时,Combobx2 出现与combobox1  相对的字段所有信息。如选中了Combobox1 中 door 时, combobox2会自动列出与combobox1 door 对应的door字段中所有的缺陷描叙?看的不是太明白。
      

  2.   

    你的表设计的的确有问题表 parts 和 表 Faults都没有一个相关联的字段啊
    象你的这种情况
    表 parts 和 表 Faults可以合并为一张表了:)
      

  3.   

    我大致明白是什么意思了
    那先加裁ComboBox1中的信息,这个可以写在FormShow等事件中
    procedure TForm1.FormShow(Sender: TObject);
    begin
      with  ADOQuery1 do
        begin
           Close;
           SQL.Clear;
           SQL.Add('SELECT bujian FROM Parts');
           Open;
        end;
       while not ADOQuery1.Eof do
         begin
           ComboBox1.Items.Add(ADOQuery1.Fields[0].Value);
           ADOQuery1.Next;
          end;    
    end;然后当ComboBox1中所选的值改变时得到Faults表中的字段名,并把此字段下的全部值添加到ComboBox2中,这可以在ComboBox1的OnChange事件中写
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
    tmpFiledName:string;
    begin
      ComboBox2.Style:=csDropDownList;
      tmpFiledName:=ComboBox1.Text;
      ShowMessage(tmpFiledName);
      with  ADOQuery2 do
        begin
           Close;
           SQL.Clear;
           SQL.Add('SELECT '+tmpFiledName+' FROM Faults');
           Open;
        end;
       while not ADOQuery2.Eof do
         begin
           ComboBox2.Items.Add(ADOQuery2.Fields[0].Value);
           ADOQuery2.Next;
          end;
    end;
      

  4.   

    测试时用了一个
    ShowMessage(tmpFiledName);
    应该是不要的,呵呵
      

  5.   

    简单的说,你这种问题,就是关联的问题,两个表格也好,combobox也好,他们内部的数据要可以通过某个值来关联。
      

  6.   

    是要有关联的字段啊!要有可以等介的字段关联就很好办了!觉得用  china618  兄弟用FormShow和ComboBox1Change来触发事件不是很好!改用ComboBox1DropDown和ComboBox1Select会比较好些!
      

  7.   

    只要把SQL语句写好了,事情就很简单了,那两张表最好是关联的,然后在操作两个ComboBox的时候,在第一个Combo里响应消息OnSelectChanged消息就可以了;
      

  8.   

    china618(▲▲▲▲▲差一千分) ( ) 信誉:100    “然后当ComboBox1中所选的值改变时得到Faults表中的字段名,并把此字段下的全部值添加到ComboBox2中, ”说到点子上了,就是这个意思。
      

  9.   

    andyzhou1101(〆.赱 極端(http://lovelcy.blogcn.com)) ( ) 信誉:100    Blog  2006-08-29 13:05:00  得分: 0  
     
     
       你的表设计的的确有问题表 parts 和 表 Faults都没有一个相关联的字段啊
    象你的这种情况
    表 parts 和 表 Faults可以合并为一张表了:)  
     
    谢谢指点,表Faults 各个字段的内容有时候要添加新的内容。 合并成一张,不太好更新。
      

  10.   

    china618(▲▲▲▲▲差一千分) ( ) 信誉:100    
    你的方法我试了,能实现。因为faults 表里有些字段的内容为空,所以只有为那些字段不位空的有用。看来要改表结构了,还希望你帮我提点意见。
    同时也谢谢大家!!!
      

  11.   

    表设置有问题,没有外键关联。
    表设置正确后可以写combobox1的onchange方法找出对应的描述赋给combobox2
      

  12.   

    按  china618(▲▲▲▲▲差一千分) 方法我试了,能实现。但是只对某些字段有用。因为faults 表里有些字段的内容为空。比如:
    表fault 字段 A   B    C    D     E   . . . .     1   1    1    1     1     2   2    2          2 
     
         3   3               3
         
         4       5
    对A操作可以,但是对 B   C    D    E   操作时 就出问题了,  因为有些只有几条记录。
    问题要怎么解决?
      

  13.   

    不好意思,借用china618(▲▲▲▲▲差一千分) 的方法。然后当ComboBox1中所选的值改变时得到Faults表中的字段名,并把此字段下的全部值添加到ComboBox2中,这可以在ComboBox1的OnChange事件中写
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
    tmpFiledName:string;
    begin
      ComboBox2.Style:=csDropDownList;
      tmpFiledName:=ComboBox1.Text;
      ShowMessage(tmpFiledName);
      with  ADOQuery2 do
        begin
           Close;
           SQL.Clear;
           SQL.Add('SELECT '+tmpFiledName+' FROM Faults');
    //关键是这里—>  改成这样   SQL.Add('SELECT '+tmpFiledName+'FROM  '+tmpFiledName+' ');       Open;
        end;
       while not ADOQuery2.Eof do
         begin
           ComboBox2.Items.Add(ADOQuery2.Fields[0].Value);
           ADOQuery2.Next;
          end;
    end;PS:不过重新建表,全部单独分开存储。(办法有点苯,但是可以实现,参考参考吧~~~)
      

  14.   

    问题可以解决,但是新的问题出现了。选中combobox1后,combobox2 出现了相应的字段记录,但是再次选中Combobox1 另为一个选项后后,原来Combobox 里的对应的字段记录依旧还有,并和新的字段记录叠加在一起了。如何解决:选中新的 Combobox1后原来的Combobox2的 清空,重新加如新的相应的字段记录?
      

  15.   

    ......
      ComboBox2.Items.Clear;
      while not ADOQuery2.Eof do
         begin
           ComboBox2.Items.Add(ADOQuery2.Fields[0].Value);
           ADOQuery2.Next;
          end;
     ......如果更新比较频繁,还是在DropDown里触发这一事件比较好!
    要去除相同记录,在SQL语句里要用到DISTINCT,把SQL语句改成:SQL.Add('SELECT DISTINCT '+tmpFiledName+' FROM Faults');