这个功能如何查询啊.谢谢大家,急啊.(0分)

  • 主题发起人 主题发起人 topdelphi
  • 开始时间 开始时间
T

topdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的窗体有两个CHEAKLISTBOX,改成例如将数据库的字段读入到CHEAKLISTBOX1里
,当选择CHEAKLISTBOX1里面的某个或多个字段之后,将数据库的记录读入到CHEAKLISTBOX2里
,如果用户在CHEAKLISTBOX1选择多个字段,或在CHEAKLISTBOX2选择多个记录的时候,
都能查询出来将数据显示在DBGRID里,但是我的查询语句出了错,请问如何修改才可以实现
啊这个功能啊, 谢谢大家

procedure TForm1.List1Click(Sender: TObject);
var
i,j,k:integer;
s,sql:string;
begin
list2.Clear;
for i:=0 to list1.Items.Count -1 do
begin
case i of
0:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[0].AsString);
query1.Next;
end;
end;
end;

1:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[1].AsString );
query1.Next;
end;
end;
end;

2:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[2].AsString ) ;
query1.Next;
end;
end;
end;

3:begin
if list1.Checked[3] then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[3].AsString );
query1.Next;
end;
end;
end;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from jobs');
query1.Open;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
j,k,l:integer;
begin

for j:=0 to list1.Items.Count -1 do
begin
for k:=0 to list2.Items.Count -1 do
begin
if (list1.Checked[j]) and (list2.Checked[k]) then
begin
query1.Close;
query1.SQL.Clear;

query1.SQL.Add('select * from jobs where '+list1.Items.Strings[j]+''+list2.Items.Strings[k]);
query1.Open;
end;
end;
end;
end;

 
在Button1Click的过程中,在query1.open之前显示一下query1.sql.text,从状况来看是
你在where条件中拼接的字符串出错,按我的经验应该是这样:

我的窗体有两个CHEAKLISTBOX,改成例如将数据库的字段读入到CHEAKLISTBOX1里
,当选择CHEAKLISTBOX1里面的某个或多个字段之后,将数据库的记录读入到CHEAKLISTBOX2里
,如果用户在CHEAKLISTBOX1选择多个字段,或在CHEAKLISTBOX2选择多个记录的时候,
都能查询出来将数据显示在DBGRID里,但是我的查询语句出了错,请问如何修改才可以实现
啊这个功能啊, 谢谢大家

procedure TForm1.List1Click(Sender: TObject);
var
i,j,k:integer;
s,sql:string;
begin
list2.Clear;
for i:=0 to list1.Items.Count -1 do
begin
case i of
0:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[0].AsString);
query1.Next;
end;
end;
end;

1:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[1].AsString );
query1.Next;
end;
end;
end;

2:begin
if list1.Checked then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[2].AsString ) ;
query1.Next;
end;
end;
end;

3:begin
if list1.Checked[3] then
begin
query1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[3].AsString );
query1.Next;
end;
end;
end;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from jobs');
query1.Open;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
j,k,l:integer;
wherecount, wherecount1 : integer;
begin
wherecount := 0;
query1.close;
query1.SQL.Clear;
query1.SQL.Text := 'select * from jobs where ';
for j:=0 to list1.Items.Count -1 do
begin
if list1.checked[j] then
if wherecount <> 0 then
begin
query1.sql.add(' and ');
wherecount := 1;
end;
query1.sql.add( list1.Items.Strings[j] + ' in ( ');
end;
wherecount1 := 0;
for k:=0 to list2.Items.Count -1 do
begin
if (list2.Checked[k]) then
begin
if wherecount1 <> 0 then
begin
query1.sql.add(' , ');
wherecount1 := 1;
end;
query1.SQL.Add(''''+list2.Items.Strings[k] + '''');
end;
end;
query1.sql.add(' ) ');
end;
end;


 
先生我把你所说的,查询写成这样,但是还是出错了,请问我这条语句那里出错呢,谢谢
你了.

procedure TForm1.Button1Click(Sender: TObject);
var
j,k,l:integer;
wherecount,wherecount1:integer;
begin
wherecount:=0;
query1.Close;
query1.SQL.Clear;
query1.SQL.Text :='select * from jobs where';
for j:=0 to list1.Items.Count -1 do
begin
if list1.Checked[j] then
if wherecount <>0 then
begin
query1.SQL.Add ('and');
wherecount:=1;
end;
query1.SQL.Add(list1.Items.Strings[j] +'in(');
end;

wherecount1:=0 ;
for k:=0 to list2.Items.Count -1 do
begin
if list2.Checked[k] then
begin
if wherecount1 <> 0 then
begin
query1.SQL.Add(',');
wherecount1:=1;
end;

query1.SQL.Add(''''+list2.Items.Strings[k]+'''');
end;
end;
query1.SQL.Add(')');
query1.Open;
end;
end.
 
两个解决问题的步骤:
1 将query1.open放到j循环的外面
2 在open之前显示一下query1.sql.text,分析有无出错,或者将内容复制到数据库操作
环境,试运行,看结果如何
 
先生,请示是这样的,我试了把QUERY1.SQL.TEXT去掉那个WHERE,就没有出错,但是最后那个
SQL.ADD(')'),这里出错了,下面注释的地方,是我修改后同出错的地方,请问如何修改呀,先生

procedure TForm1.Button1Click(Sender: TObject);
var
j,k,l:integer;
wherecount,wherecount1:integer;
begin
wherecount:=0;
query1.Close;
query1.SQL.Clear;
query1.SQL.Text :='select * from jobs '; //我在这里去掉了WHERE
//QUERY1.OPEN 这个OPEN,是之前测试的上面的TEXT语句.

for j:=0 to list1.Items.Count -1 do
begin
if list1.Checked[j] then

if wherecount <> 0 then
begin
query1.SQL.Add (' and ');
wherecount:=1;
end;
query1.SQL.Add(list1.Items.Strings[j] +'in(');
end;

wherecount1:=0 ;
for k:=0 to list2.Items.Count -1 do
begin
if (list2.Checked[k]) then
begin
if wherecount1 <> 0 then
begin
query1.SQL.Add(',');
wherecount1:=1;
end;

query1.SQL.Add(''''+list2.Items.Strings[k]+'''');
end;
end;
query1.SQL.Add('('); //程序提示这里的(出错了.
query1.Open;
end;



 
注意,我用到的函数in在oracle中是支持的,你所用的数据库也要能支持才行。
还有,我写的是')',为什么你在程序里要将它改写为'('?
在最后做open动作之前不能将sql.text显示出来吗?最好能将内容贴出来!
因为程序没有缩进格式,无法匹配begin...end,感觉应该没有加错位置。
 
先生我的数据库是SQL,现我把代码改成这样,注释的地方是出错的,而且好像也查询不出
我在CHEAKLIST1多选择的字段和在CHEAKLIST2里多选择的记录,好像默认只是一条记录.
请问先生应该再修改啊,谢谢你了.

procedure TForm1.Button1Click(Sender: TObject);
var
j,k,l:integer;
wherecount,wherecount1:integer;
begin
wherecount:=0;
query1.Close;
query1.SQL.Clear;
query1.SQL.Text:='select * from jobs ';
//query1.Open;这里我测试过,如果去掉了WHERE,就能显示记录出来的.

for j:=0 to list1.Items.Count -1 do
begin
if list1.Checked[j] then

if wherecount <> 0 then
begin
query1.SQL.Add ('and');
wherecount:=1;
end;
query1.SQL.Add(list1.Items.Strings[j]+'in(');//程序说来到这里说第三条SQL语句
的('这个符号出错了.
end;

wherecount1:=0 ;
for k:=0 to list2.Items.Count -1 do
begin
if (list2.Checked[k]) then
begin
if wherecount1 <> 0 then
begin
query1.SQL.Add(',');
wherecount1:=1;
end;

query1.SQL.Add(''''+list2.Items.Strings[k]+'''');
end;
end;
query1.SQL.Add(')');
query1.Open;
end;
 
你的字段也可以多选?我都不清楚你这样的情况在SQL里怎么能做到!
 
其实这个功能查询是对同一个表查询的,只是一个CHEAKBOX1显示字段.而CHEAKLIST2显示
记录数据,做个无论选择多个字段或不同字段数据,都能在DBGRID里显示出来,但问如何做到
啊.
 
我不太明白:如果字段和字段数据都可以多选,你该如何确定数据所对应的字段值?
 
我也曾经试过,单选的话,是可以显示在DBGRID里面的,选择进行多选或数据是字符串的,但
出错了,但是用户现在的需要同时对字段和记录多选,上面的是一个热心的人士比我例子,
但是在我的SQL查询记录时出错了,上面注释的地方是报批出错的地方,请问先生应该如何
编写呢.
 
后退
顶部