关于数据据查询的谁能帮我?(100分)

  • 主题发起人 主题发起人 kadi88
  • 开始时间 开始时间
K

kadi88

Unregistered / Unconfirmed
GUEST, unregistred user!
ACCESS 中的'客户档案'表中有'行政区' 、'公司' 两个字段

delphi中的一个form中有两个ComboBox,分别是ComboBox1和ComboBox2;
如何编写一个程序让FormCreate后,ComboBox1中下拉列表中显示全部行政区,
在ComboBox1中选择某个行政区后,ComboBox2下拉列表中则显示全部行政区中
的公司?
 
需要两个数据集(假设用TADODataSet):
行政区dtXZQ: commandtext := 'select distinct 行政区 from 客户档案';
公司dtGS: commandtext := 'select distinct 公司 from 客户档案 where 行政区=:xzq';
在 dbcombox1 的onchange 事件中:
with dtGS do begin
Close;
Parameters.ParamByName('xzq').value := dbcombox1.text;
Open;
end;
 
试过马上给分。
 
我来晚了
 
antic_ant 兄有新创意,不妨直说...
 
给你一个过程吧,我一直这样用的.
procedure TCommDm.InitComBox(ComBox: TComboBox; TbNm, FieldNm,IdxField,
sWhere: String; FirstFlag: Boolean);
var
sSql: String ;
begin
if sWhere = '' then
sSql := 'select '+FieldNm+' as FindVal from '+ TbNm + ' order by '+ IdxField
else
sSql := 'select '+FieldNm+' as FindVal from '+ TbNm + ' where '+ sWhere+ ' order by '+ IdxField ;
if CommonExecsql(CommQry,sSql) then begin
ComBox.Clear;
CommQry.First ;
while not CommQry.eof do begin
ComBox.Items.Add(CommQry.fieldbyname('FindVal').asstring);
CommQry.Next ;
end;
if FirstFlag and (ComBox.Items.Count > 0) then
ComBox.ItemIndex := 0 ;
CommQry.Close;
end;
end;

如果复杂点,几combobox中记录的不是数据表中的PK,而是可以重复的内容,那就要用一个
结构体来记录它们的相互关系了,就这样;
type
TDataRecd = Record
Index : Integer;
Value : String;
end;
DataRecd = array of TDataRecd;
procedure TCommDm.InitComBox(ComBox: TComboBox; Var LinkArr: DataLink; Const TbNm,
FieldNm,FieldID:String;sWhileSort:String=''; FirstFlag: Boolean=True);
var
sSql: String ;
iLoop: Word;
begin
if sWhileSort = '' then
sSql := 'select '+FieldNm+' As FindNm, '+FieldID+ ' as FindID from '+ TbNm + ' order by '+ FieldID
else
sSql := 'select '+FieldNm+' As FindNm, '+FieldID+ ' as FindID from '+ TbNm + ' where '+ sWhileSort + ' order by '+ FieldID ;
if CommonExecsql(CommQry,sSql) then begin
ComBox.Clear;
CommQry.First ;
SetLengTh(LinkArr,CommQry.RecordCount);
for iLoop:= 0 to CommQry.RecordCount -1 do begin
sSql := CommQry.fieldbyname('FindNm').AsString ;
ComBox.Items.Add(sSql);
LinkArr[iLoop]:= CommQry.Fieldbyname('FindID').AsInteger ;
CommQry.Next;
end;
if FirstFlag and (ComBox.Items.Count > 0) then
ComBox.ItemIndex := 0 ;
end;
end;
 
我建议你用treeview好一点。两个数据集,第一个数据集选出行政区,第二个数据集
选出行政区拥有的公司,循还第一个数据集,里面嵌套循环第二个数据集
不过要看你的界面设计,如果你的界面还有大块空地,把treeview放在左边或者右边,会
比较好,是不是?
 
谢过LuJuhe我参考了你的思路解决问题了,其他朋友的也不错,不过总体来说
lujuhe的最适合我,也易用分就大部份给他了。
thank you
 
多人接受答案了。
 
后退
顶部