帮我看看这段代码错在哪里 ( 积分: 100 )

  • 主题发起人 主题发起人 jimmy_che
  • 开始时间 开始时间
J

jimmy_che

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下代码,我的意图是把FC1前两位为‘12’的显示在一个dbgrid上,但我这样写只显示一个,各位大虾帮我分析一下问题出在哪里,谢谢了
with query1 do
begin
close;
sql.Clear;
sql.Add('select FC41 from A_DBDA');
open;
while not eof do
begin
ss:=fieldbyname('fc41').AsString;
if leftstr(ss,2)='12' then tt:=ss else next;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select fc41,fc42 from A_DBDA where fc41=:fc41');
query2.ParamByName('fc41').AsString:=tt;
query2.ExecSQL;
next;
end;
query2.Open;
end;
 
query2.ExecSQL;//是不是 这句的 问题
应写成query2.open;
 
写的有点乱!

分开写吧!

with query1 do
begin
close;
sql.Clear;
sql.Add('select FC41 from A_DBDA');
open;
end;

for i:=0 to query1.RecordCount-1 do
begin
ss:=fieldbyname('fc41').AsString;

if leftstr(ss,2)='12' then
tt:=ss
else
next;

with query2 do
begin
Close;
SQL.Clear;
SQL.Add('select fc41,fc42 from A_DBDA where fc41=:fc41');
ParamByName('fc41').AsString:=tt;
ExecSQL;
end;

query1.next;
end;
 
按你的要求,语句这么写就行了:
query2.sql.text:='select FC41 from A_DBDA where FC41='''+'12'+'''';
 
greenwo的方法不行
 
with query2 do
begin
Close;
SQL.Clear;
SQL.Add('select fc41,fc42 from A_DBDA where fc41=:fc41');
ParamByName('fc41').AsString:=tt;
ExecSQL;
end;
这是干什么呀。
有以个错误:
(1)用Select查询语句,应该用Open,而不是ExecSQL.
(2)你在循环里去查询数据,最后显示的肯定是最后一条查询的数据。
 
透过程序看到楼主的意途,是想利用一个循环将fc41前两位为“12”的找出来,构造一个SQL语句,然后执行SQL显示结果。
思想是明确的,只是用法不对,每执行一次循环体就像将当前的值赋给Query2的参数fc41,所以你只能得到一笔记录,且是Query1中最后一笔记录fc41的值。现就楼主的程序作出调整,代码如下:
tt := EmptyStr;
with query1 do
begin
close;
sql.Clear;
sql.Add('select FC41 from A_DBDA');
open;
while not eof do
begin
ss:=fieldbyname('fc41').AsString;
if leftstr(ss,2)='12' then begin
if SameText(tt, EmptyStr)
then tt:= QuotedStr(ss)
else tt := Format('%s, %s', [tt, QuotedStr(ss)]);
end;
next;
end;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add(Format('select fc41,fc42 from A_DBDA where fc41 in (%s)', [tt]));
query2.Open;
end;

当然了,还有更为简洁的写法:
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select fc41,fc42 from A_DBDA where substring(fc41) = ''12''');
query2.Open;
 
谢谢happycyp,你说的确实是问题所在,能不能再说详细点,应该怎么实现我的想法阿
 
更正一下,上面的substring少写了两个参数:
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select fc41,fc42 from A_DBDA where substring(fc41, 1, 2) = ''12''');
query2.Open;
 
谢谢ChrisMao,你太有才了
 
后退
顶部