万份紧急啊,各位救救我吧(0分)

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

topdelphi

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

procedure TForm1.List1Click(Sender: TObject); //这是读入CHEAKLIST的数据
var
i,J:integer;
begin
list2.Clear;
for i:=0 to list1.Items.Count -1 do
BEGIN
case i of
0: begin
if list1.Checked=false then
begin
dbgrid1.Columns[0].Visible :=false;
end

else
begin
list1.Checked:=true;

QUERY1.First;
while not query1.Eof do begin
list2.Items.Add(QUERY1.FieldS[0].ASSTRING);
QUERY1.Next;
DBGRID1.Columns[0].Visible :=TRUE;
end;
end;
end;

1: begin
if list1.Checked =false then
begin
dbgrid1.Columns[1].Visible :=false;
end
else
if list1.Checked then
begin

QUERY1.First;
while not query1.Eof do begin
list2.Items.Add(query1.Fields[1].asstring);
query1.Next;
dbgrid1.Columns[1].Visible :=true;
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;
end;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码

VAR
i,j,k:INTEGER;
s:tstringlist;
sql:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;

sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS ';
query2.SQL.Text :=sql;
query2.Active :=true;

stringgrid1.ColCount :=query2.RecordCount ;
stringgrid1.RowCount :=1;
j:=0;
k:=0;

while not query1.Eof do
begin
if list2.Checked[j] then
begin
for i:=0 to query2.FieldCount -1 do
stringgrid1.Cells[i,k]:=query1.Fields.AsString;
k:=k+1;
stringgrid1.RowCount:=stringgrid1.RowCount +1
end;
j:=j+1;
query2.Next;
end;
query2.Active :=false;
s.Free;
end;

end.
 
是出的什么错?
 
>>sql:='select'+SQL+' from JOBS ';
改成sql:='select '+SQL+' from JOBS ';

 
tornado_cs,你这条语句不是改得和我一样的吗,请再指教一下。
 
他的select后面比你多一个空格
 
那如果显示在DBGRID里,又如何修改啊,谢谢
 
DBGRID就简单多了,
放一个DataSource,设其名字为DataSource1,它的DataSet属性设为Query1
DBGRID的DataSource设为DataSource1
那你在Query1打开后,DBGRID中的数据就会自动更新了
 
但我这行代码查询出来之后,如何修改显示在DBGRID里啊,谢谢

procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码

VAR
i,j,k:INTEGER;
s:tstringlist;
sql:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;

sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS ';
query2.SQL.Text :=sql;
query2.Active :=true;

stringgrid1.ColCount :=query2.RecordCount ;
stringgrid1.RowCount :=1;
j:=0;
k:=0;

while not query1.Eof do
begin
if list2.Checked[j] then
begin
for i:=0 to query2.FieldCount -1 do
stringgrid1.Cells[i,k]:=query1.Fields.AsString;
k:=k+1;
stringgrid1.RowCount:=stringgrid1.RowCount +1
end;
j:=j+1;
query2.Next;
end;
query2.Active :=false;
s.Free;
end;

end.
 
假设已有DBGrid1和DataSource1这两个控件
procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码
VAR
i,j,k:INTEGER;
s:tstringlist;
sql:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=Query2;
sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS ';
query2.SQL.Text :=sql;
query2.Active :=true;
s.Free;
end;
end.

 
先生虽然可以显示在DBGRID里,但是查询的时候,显示出全部记录,没有我选择
查询的记录啊,请问如何再修改啊,谢谢。
 
这样试试
procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码
VAR
i,j,k:INTEGER;
s:tstringlist;
sql,t:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=Query2;
sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS';
t:=s[0];
for i:=0 to list2.Items.Count -1 do
if list2.Checked then
s.Add(list2.Items);
s.clear;
if s.Count>0 then
begin
sql:=sql+' while '+t+' in ("'+s[0]+'"';
for i:=1 to s.Count -1 do
sql:=sql+',"'+s+'"';
sql:=sql+')';
end;
query2.SQL.Text :=sql;
query2.Active :=true;
s.Free;
end;
end.

 
先生老问题依旧啊,仍然是查询的时候,显示出全部记录,没有我选择
查询的记录啊,请问如何再修改啊,
 
不好意思s.clear加错地方了,你再试试
procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码
VAR
i,j,k:INTEGER;
s:tstringlist;
sql,t:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=Query2;
sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS';
t:=s[0];
s.clear;
for i:=0 to list2.Items.Count -1 do
if list2.Checked then
s.Add(list2.Items);
if s.Count>0 then
begin
sql:=sql+' while '+t+' in ("'+s[0]+'"';
for i:=1 to s.Count -1 do
sql:=sql+',"'+s+'"';
sql:=sql+')';
end;
query2.SQL.Text :=sql;
query2.Active :=true;
s.Free;
end;
end.
 
先生谢谢你的指教,真的不好意思再麻烦,但是紧急,日后有分再相送,
你的语句在程序执行时说"第一行')'附近有语法错误,请问如何修改啊。真的谢谢你了。
 
因为我没法调试这个程序,所以有些地方可能会有错误
你的数据库是采用的什么?
表中的几个字段的类型是什么?
然后在这一句 query2.SQL.Text :=sql;
加一个断点,把sql的内容告诉我,我看看是怎么错了
 
我的数据库是SQL,表里有VARCHAR,CHAR,DATATIME,NUMERIC这几个类型,窗体里有两个
QUERY,一个将数据读入CHEAKLIST2里,一个就是用作查询,下面是我单击CHEAKLIST1之后,
将数据读入CHEAKLIST2里,是否我这条语句影响了查询啊。谢谢
procedure TFRMITEMFINDS.List1Click(Sender: TObject);
VAR
I,J:INTEGER;
begin
LIST2.Clear;
FOR I:=0 TO LIST1.Items.Count -1 DO
BEGIN
CASE I OF
0: BEGIN
IF LIST1.Checked THEN
BEGIN
QUERY1.Active :=FALSE;
QUERY1.Active:=TRUE;
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.Active :=FALSE;
QUERY1.Active :=TRUE;
QUERY1.First;
WHILE NOT QUERY1.Eof DO BEGIN
LIST2.Items.Add(QUERY1.Fields[1].AsString);
QUERY1.Next;
END;
END;
END;
。。。。。
。。。。。。
 
procedure TForm1.BitBtn1Click(Sender: TObject);//这是查询代码
VAR
i,j,k:INTEGER;
s:tstringlist;
sql,t:string;
begin
s:=tstringlist.Create ;
for i:=0 to list1.Items.Count -1 do
if list1.Checked then
s.Add(list1.Items);
if s.Count =0 then
begin
s.Free;
exit;
end;
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=Query2;
sql:=s[0];
for i:=1 to s.Count -1 do
sql:=sql+','+s;
sql:='select'+SQL+' from JOBS';
t:=s[0];
s.clear;
for i:=0 to list2.Items.Count -1 do
if list2.Checked then
s.Add(list2.Items);
if s.Count>0 then
begin
sql:=sql+' where cast('+t+'as CHAR(30)) in ('''+s[0]+'''';
for i:=1 to s.Count -1 do
sql:=sql+','''+s+'''';
sql:=sql+')';
end;
query2.SQL.Text :=sql;
query2.Active :=true;
s.Free;
end;
end.
 
先生真的感激你了,但是这一行
sql:=sql+' where cast('+t+'as CHAR(30)) in ('''+s[0]+'''';
程序说CHAR附近有错误了,而且好像这个IN我以前也用过,好像不支持这个函数啊。
 
应该不会呀,你用的是SQL Server吗?
像下面这一句,我在Sql Server中执行试了的,没问题
select * from table1 where cast(a as CHAR(30)) in ('aaa','bbb');

你把最后sql中的内容告诉我吧
 
我设置了这条query2.SQL.Text :=sql;这断点,
显示query2.SQL.Text ='SELECT * FROM JOBS;'#$D#$A一些乱字符啊。

而最后的赋值SQL显示为SQL=SELECT 字段名 FROM JOBS WHERE CASE(代号AS CHAR(30))
IN('01','4545','565')//这是我所选择的记录,
请先生如何修改啊。
 
顶部