关于多字段的选择查询问题!请高手过来看看!(100分)

  • 主题发起人 主题发起人 yangjj
  • 开始时间 开始时间
Y

yangjj

Unregistered / Unconfirmed
GUEST, unregistred user!
用一个下拉列表,设置字段名,一个EDIT1输入查询内容,
在下拉列表中是中文字段名,但在数据库中用的是E文名,
如何实现查询呀?,哪位大侠能给指点一二?
我用下面的代码不行呀!只能查询第一个字段的内容!
if adoquery1.state<>dsinactive then
adoquery1.close;
adoquery1.sql.clear;
if ed1.text<>'' then
if Cb1.Text='计划编号' then
begin
adoquery1.sql.add('SELECT jh_zb.jh_code, jh_zb.gc_name,'+
'jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data,'+
'jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person,'+
'jh_zb.bz_data, jh_fb.sb_code, jh_fb.sb_name,'+
'jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price,'+
'jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1 '+
'FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code '+
'where jh_zb.jh_code = '''+ed1.text+''' order by jh_zb.jh_code ASC');
adoquery1.open;
end;
if Cb1.Text='编报单位' then
begin
adoquery1.sql.add('SELECT jh_zb.jh_code, jh_zb.gc_name,'+
'jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data,'+
'jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person,'+
'jh_zb.bz_data, jh_fb.sb_code, jh_fb.sb_name,'+
'jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price,'+
'jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1 '+
'FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code '+
'where jh_zb.bb_unit = '''+ed1.text+''' order by jh_zb.jh_code ASC');
adoquery1.open;
end;
 
只能查询第一个字段的内容??SQL语句有错吗?[:(]
 
两种方法:
一. 你可以在本地建一个数据字典.也就是中文名称和英文名称的一个对照表
例如
type
TFieldDic = record
CName : string;
EName : string;
end;
var
FieldDic : array of TFieldDic;

procedure CreateDic;
begin
setlength(FieldDic,2);
FieldDic[0].CName := '计划编号';
FieldDic[0].EName := 'jh_code';
.....
// 别忘了,用完设置 SetLength(FieldDic,0);
end;
写一个GetEName函数,用来根据中文字段名得到英文字段名
然后在sql中只要写
strSQL := 'select .... from .... where jh_zb.' + GetEName(Cb1.Text) +
'=' + '''' + ed1.text + '''' + 'order...'
adoquery1.sql.add(strSQL);
就可以了.

二. 利用ComboBox的AddObject.
例如
type
PMyRec = ^TMyRec;
TMyRec = record
EName: string;
end;

var
MyRecPtr: PMyRec;
begin
New(MyRecPtr);
MyRecPtr^.EName := 'jh_code';
combobox1.items.addobject('计划编号',TObject(MyRecPrt));
.....
end;

然后在sql中只要写
strSQL := 'select .... from .... where jh_zb.' +
PMyRec(combobox1.objects[combobox1.itemindex])^.EName +
'=' + '''' + ed1.text + '''' + 'order...'
adoquery1.sql.add(strSQL);
就可以了.

 
可惜,来晚了……
楼上的对。
 
试一下,行了就给分!
 
to bluerain:
我用第二种方法试了一下,怎么不行呢?我的语句如下:

procedure Tjh_search1.BitBtn1Click(Sender: TObject);
type
PMyRec = ^TMyRec;
TMyRec = record
EName: string;
end;

var
MyRecPrt: PMyRec;
StrSql:string;
begin
begin
New(MyRecPrt);
MyRecPrt^.EName := 'jh_code';
cb1.items.addobject('计划编号',TObject(MyRecPrt));
MyRecPrt^.EName := 'bb_unit';
cb1.items.addobject('编报单位',TObject(MyRecPrt));
MyRecPrt^.EName := 'gc_name';
cb1.items.addobject('工程名称',TObject(MyRecPrt));
MyRecPrt^.EName := 'zj_kind';
cb1.items.addobject('资金性质',TObject(MyRecPrt));
MyRecPrt^.EName := 'xm_code';
cb1.items.addobject('项目编号',TObject(MyRecPrt));
MyRecPrt^.EName := 'jb_person';
cb1.items.addobject('经办人',TObject(MyRecPrt));
MyRecPrt^.EName := 'pz_file';
cb1.items.addobject('批准文号',TObject(MyRecPrt));
MyRecPrt^.EName := 'dw_unit';
cb1.items.addobject('承施单位',TObject(MyRecPrt));
MyRecPrt^.EName := 'sb_name';
cb1.items.addobject('材料名称',TObject(MyRecPrt));
MyRecPrt^.EName := 'gg_type';
cb1.items.addobject('规格型号',TObject(MyRecPrt));
MyRecPrt^.EName := 'gh_unit';
cb1.items.addobject('供货单位',TObject(MyRecPrt));
MyRecPrt^.EName := 'jh_person';
cb1.items.addobject('计划员',TObject(MyRecPrt));
MyRecPrt^.EName := 'bz_memo1';
cb1.items.addobject('备注',TObject(MyRecPrt));
end;
if adoquery1.state<>dsinactive then
adoquery1.close;
adoquery1.sql.clear;
if ed1.text<>'' then
Strsql:='SELECT jh_zb.jh_code, jh_zb.gc_name,'+
'jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data,'+
'jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person,'+
'jh_zb.bz_data, jh_fb.sb_code, jh_fb.sb_name,'+
'jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price,'+
'jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1 '+
'FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code '+
'where jh_zb.'+PMyRec(cb1.itemindex)^.EName +' = '''+ed1.text+''' order by jh_zb.jh_code ASC';
adoquery1.sql.add(StrSql);
adoquery1.open;
end;
 
每次AddObject前都要New(MyRecPrt);
例如:
[/blue]New(MyRecPrt);[/blue]
MyRecPrt^.EName := 'jh_code';
cb1.items.addobject('计划编号',TObject(MyRecPrt));
[blue]New(MyRecPrt)[/blue]
MyRecPrt^.EName := 'bb_unit';
cb1.items.addobject('编报单位',TObject(MyRecPrt));

其实上面是标准用法.也可以这么用
var
s : string;
begin
s := 'jh_code';
cb1.items.addobject('计划编号',TObject(s));
s := 'bb_unit';
cb1.items.addobject('编报单位',TObject(s));
end;
取出来的时候相应改成
string(cb1.objects[cb1.itemindex]);

关于AddObject的用法,你可以参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=810431
讨论的比较详细了.
 
你ShowMessage看看你的SQL语句有没有错?或者直接运行这个SQL语句试试。。[:)]
 
需要耐心啊
 
看不懂。哎在这里赚不到钱啊 :)
 
to bluerain:
这样的语句也不行!
var
s,strSql:string ;
begin
begin
s := 'jh_code';
cb1.items.addobject('计划编号',TObject(s));
s := 'bb_unit';
cb1.items.addobject('编报单位',TObject(s));
s:= 'gc_name';
cb1.items.addobject('工程名称',TObject(s));
s:= 'zj_kind';
cb1.items.addobject('资金性质',TObject(s));
s := 'xm_code';
cb1.items.addobject('项目编号',TObject(s));
s := 'jb_person';
cb1.items.addobject('经办人',TObject(s));
s:= 'pz_file';
cb1.items.addobject('批准文号',TObject(s));
s := 'dw_unit';
cb1.items.addobject('承施单位',TObject(s));
s := 'sb_name';
cb1.items.addobject('材料名称',TObject(s));
s := 'gg_type';
cb1.items.addobject('规格型号',TObject(s));
s := 'gh_unit';
cb1.items.addobject('供货单位',TObject(s));
s := 'jh_person';
cb1.items.addobject('计划员',TObject(s));
s := 'bz_memo1';
cb1.items.addobject('备注',TObject(s));
end;
begin
if adoquery1.state<>dsinactive then
adoquery1.close;
adoquery1.sql.clear;
if ed1.text<>'' then
begin
adoquery1.sql.add('SELECT jh_zb.jh_code, jh_zb.gc_name,'+
'jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data,'+
'jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person,'+
'jh_zb.bz_data, jh_fb.sb_code, jh_fb.sb_name,'+
'jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price,'+
'jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1 '+
'FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code '+
'where jh_zb.'+Pchar(cb1.Items.objects[cb1.itemindex])+' = '''+ed1.text+''' order by jh_zb.jh_code ASC');
adoquery1.open;
end;
end;
 
我已经搞定,用的是CASE语句,虽然有些长,但是很有效!
 
多人接受答案了。
 
后退
顶部