我是位初学者,现在在做一个小程序,碰到一个复合查询方面的问题,请各位大虾不吝赐教。
我做的这个程序,后台是SQL SERVER2000,表的字段名字均是英文,为了直观,将ADOQuery各字段的DisplayLabel属性设置为相关的中文并读到DBGRID中。现在我想将这些字段读到LISTBOX中,然后再设置一个COMBOBOX,里面的值设置为“等于”、“大于”、“小于”、“大于等于”、“小于等于”、“包含”、“未包含”,还有一个EDIT存放从键盘输入的值,
还有“与”、“或”单选按纽,“加”、“减”BUTTON,当选“加”的时候,就把前面选定的条件形成字符串写在MEMO控件中,如“模块地址=131”、“交换局名 包含 高洋电信局”等等,然后根据这些条件形成相应的SQL,将集合集显示在DBGRID。
注意,表中的各字段有数值型的,也有字符型的,还有一个是备注型的!!!
最好能提供源程序和编程思路,如果程序较大直接发到我信箱:redangler@163.com,
编程思路严密、清晰的可以考虑再加分!!
这是我第一次提问,谢谢各位大虾支持一下!!!
考虑放几个容器铸件,比如groupbox,通过控制visible属性来实现复合,
参考代码:
with donglishebeidiandongji.ADOQuery1 do
if groupbox1.Visible=true then
begin
close;
sql.Clear;
sql.add(select * from donglishebeidiandongji) ;
sql.add( where +combobox1.Text+combobox2.Text++edit1.text++combobox4.Text++combobox3.Text++combobox5.Text++edit2.text+);
prepared;
open;
end
else
begin
close;
sql.Clear;
sql.add(select * from donglishebeidiandongji );
sql.add( where +combobox1.Text+combobox2.Text++edit1.text+);
prepared;
open;
end;
end;
你提前不知道字段名吗? 我已经发给你一个例子了, 字段名都是提前设好的.
你要是不知道字段名, 也没关系, 用Query.Fields.GetFieldNames(ListBox.Items)就可以了, 可要翻译成中文, 那就是另外一回事了, 那就要另外编一个翻译软件, 带一个巨大的英文字典数据库...
我越来越胡涂了, 你到底是什么问题?
procedure search; //自定义过程search(在数据库中搜寻指定条件的数据)
var
i,j,c:integer; //c是用来统计查到的记录数
SearchField: string; //要查找的字段名
SearchValue: string; //要查找的字段值
serchgx:string; //查询关系符
begin
// SearchField := Trim(comboBox1.Text); //将ComboBox的值赋给SearchField
SearchValue :=Trim(edit1.Text); //将Edit的值赋给SearchField
i:=combobox1.ItemIndex;
case i of
0: searchfield:=name;
1: searchfield:=sex;
2: searchfield:=csny;
3: searchfield:=jg;
4: searchfield:=class;
5: searchfield:=xh;
end;
j:=combobox2.ItemIndex;
case j of
0:serchgx:==;
1:serchgx:=>;
2:serchgx:=<;
3:serchgx:=<=;
4:serchgx:=>=;
5:serchgx:=like;
end;
// showmessage(inttostr(j));
try
with adoquery1 do
begin
close; //先关闭数据模块中的ADOQuery
sql.Clear; //清空ADOQuery中的SQL值
sql.Add(select * from 表名 where + SearchField+serchgx++SearchValue+); //进行数据查询的SQL语句(SearchFidel和SearchValue
// 分别赋到SQL语句中
end;
finally
adoquery1.Open; //打开数据模块中的student
if adoquery1.RecordCount=0 then
messagedlg(找不到此记录!,mtwarning,[mbok],0)
else
begin
c:=adoquery1.RecordCount;
messagedlg(找到+inttostr(c)+记录,mtwarning,[mbok],0);
end;
end;
end;