自由多参数组合查询!!!!!(100分)

  • 主题发起人 主题发起人 ludao
  • 开始时间 开始时间
L

ludao

Unregistered / Unconfirmed
GUEST, unregistred user!
语句:Select * from Table
where A=:V_A and B:=V_B and C:=V_C and D:=V_D
四个条件,自由组合,至少有一个条件,最多不限
要求MIDAS结构实现,客户端不能任何有SQL语句,通过参数传递,
中间层用一个数据集和提供者来实现查询
如:Client:V_A,V_D
Server:Select * from Table where A=:V_A and D:=V_D
Client:V_B,V_D
Server:Select * from Table where B=:V_B and D:=V_D
Client:V_B,V_C
Server:Select * from Table where C=:V_B and C:=C
请高手执教
 
用checkbox组合到string 变量,
之间加入必要的关系,
最后去掉最前的和最后的连接符号【一般是 and or 】
将string 与 sql 组合起来即可的
 
关注
我试了不行
用checkbox组合到string 变量,
之间加入必要的关系,
最后去掉最前的和最后的连接符号【一般是 and or 】
将string 与 sql 组合起来即可的
 
怎么会不行呢?
Select * from Table where (1=1)
后面加上你的那些条件
比如有V_A就是加上 and(C=V_A)
 
and(C=V_A)
参数传递不过去
我又试了不行
 
我说的大概就是这个意思,具体你用参数还是直接把值放入SQL中随自己了
你参数传递不过去不是这个组合的问题,也许是你其他地方的问题
 
需要解决的是两个问题
1:客户端怎么根据用户的选择动态生成查询条件
可以用TStringGrid,三个字段,第一个字段是A,B,C,D等,第2个字段是>,<,=等,第三个字段是值,如V_A,V_B..等,每条记录标识一个查询条件,再让用户选择其与或关系,用户要加多少个条件都无所谓.
最后把每条记录生成的条件合并成一个字符串传给应用服务器.
2:应用服务器端怎么把客户端传来的查询条件变为SQL语句
从客户端传来的参数(字符串)经过解码生成若干个条件,把这些条件逐一加在WHERE的后面,必要时去掉第一个条件的AND 或 OR
OK,一切就是这么简单
 
请问 参数通过 什么事件传递;
 
这是我用checkbox和combobox生成任意组合查询条件得意段代码希望能对你有所帮助,开始查询时先设置sql为select * from tablename wher 1=1;
function tfrmtjfx.sqladd(fldname,compsbl:string;obj1,obj2,obj3:tobject ):string;
var sqlstr:string;
begin
if obj1 is tcheckbox then
IF (obj1 as tcheckbox).checked then
begin
if obj2 is tcombobox then
if trim((obj2 as tcombobox).Text)= '' then
begin
messagebox(handle,'请输入查询条件','提示',mb_ok);
(obj2 as tcombobox).SetFocus;
end
else
sqlstr:= 'and '+fldname+' '+compsbl+''''+quotedeal(trim((obj2 as tcombobox).Text))+'''';

if obj2 is tedit then
if trim((obj2 as tedit).Text)= '' then
begin
messagebox(handle,'请输入查询条件','提示',mb_ok);
(obj2 as tedit).SetFocus;
end
else
sqlstr:= 'and '+fldname+' '+compsbl+''''+quotedeal(trim((obj2 as tedit).Text))+'''';
if (obj3<>nil) and (obj3 is tdatetimepicker) then
begin
if obj2 is tdatetimepicker then
sqlstr:= 'and '+fldname+' '+compsbl+''''+FormatDateTime('yyyymmdd',(obj2 as tdatetimepicker).Date)+FormatDateTime('hhnnss',(obj3 as tdatetimepicker).time)+'''';
end
else
begin
if obj2 is tdatetimepicker then
begin
case (obj2 as tdatetimepicker).Kind of
dtkdate : sqlstr:= 'and '+fldname+' '+compsbl+''''+FormatDateTime('yyyymmdd',(obj2 as tdatetimepicker).Date)+'''';
dtktime : sqlstr:= 'and '+fldname+compsbl+''''+FormatDateTime('hhnnss',(obj2 as tdatetimepicker).time)+'''';
end;
end;
end;
end
else
sqlstr:='';
sqladd:=sqlstr;
end;
 
Select * from Table
where (A=:V_A or 1=:UA) and (B=:V_B or 1=:UB)
and (C=:V_C or 1=:UC) and (D=:V_D or 1=:UD)
如果使用V_A V_C,那么 赋值V_A、V_C UA=0 UB=1 UC=0 UD=1,即赋值的U?给0,不赋值的给1就可以了。
 
你看看你最后的sqladd是什么样子的,
用showmessage这样的方式看看是不是符合你的实际查询语句
 
我是这样实现的
首先在Server端的类库管理器 中加入一方法带2个参数MyQurey(QNum:integer;SqlCondition:WideString)
QNum:业务规则编号 SqlCondition:查询条件
Procedure MyQurey(QNum:integer;SqlCondition:WideString)
begin
case QNum of
1://
begin
ADOQurey1.Close;
ADOQurey1.Sql.Clear;
ADOQurey1.Sql.Add('Select * from T1 Where ' + SqlCondition);
ADOQurey1.Open;
end;
2://
begin
ADOQurey2.Close;
ADOQurey2.Sql.Clear;
ADOQurey2.Sql.Add('Select * from T2 Where ' + SqlCondition);
ADOQurey2.Open;
end;
3://........
end;
end;

在客户端Client
生成组合条件放入SqlStr,调用服务的接口
//ClientDataSet1的提供者为相应业务规则逻辑提供者
var
SqlStr:String;
begin
SqlStr:='1=1';
SqlStr:=SqlStr+'各种条件';
if ClientDataSet1.Active then
ClientDataSet1.Active:=False;

DCOMConnect.AppServer.MyQurey(1,SqlStr);
ClientDataSet1.Open;
end;

以上方法在
MSSQLSERVER2000+ADO+Delphi6调试通过
业务规则全部在服务端实现,
客户端没有任何SQL语句,只有SQL的条件实现了真正的瘦客户
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
665
import
I
I
回复
0
查看
493
import
I
I
回复
0
查看
654
import
I
后退
顶部