关于一个dbcombobox和edit之间数据记录的联系 (100分)

  • 主题发起人 主题发起人 ddw
  • 开始时间 开始时间
D

ddw

Unregistered / Unconfirmed
GUEST, unregistred user!
想在dblookupcombo种选择一个字段值,同时显示在edit中这个表中与之对应记录的另一个字段值
例如
表A (sql server2000)
序号 物品
1 a1
2 b4
:
序号是int,物品是nvarchar数据格式
dblookupcombox种选择物品,在edit中显示物品对应的序号

程序如下
procedure TForm1.DBLookupCombo1Change(Sender: TObject);
VAR
i:string;
begin
I:=form1.DBLookupCombo1.Text;
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('select * from 表A');
form1.ADOQuery1.SQL.Add(format('where 物品 =%s',));
form1.ADOQuery1.Open;
form1.Edit1.Text:=form1.ADOQuery1.fieldbyname('序号').AsString;
end;

程序执行后,当在rxdblookupcombobox种选择一个物品的时候,马上弹出如下错误显示
“列名'b4'无效”
 
你的sql语句不对,估计他把b4当成字段名了。
你跟一下你的sql语句是什么?
 
我就用上面的sql语句了,别的语句,也不是用在这里的啊
 
是不是dblookupcombox中设的字段名错了!
 
没有啊,它里面的内容是物品啊。如果要是设置错,不应该显示出来内容吧。
 
对不起,刚才没有仔细看!
>>
...
I:=form1.DBLookupCombo1.Text;------------------------------------ 1
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('select * from 表A');
form1.ADOQuery1.SQL.Add(format('where 物品 =%s',));----------- 2
form1.ADOQuery1.Open;
form1.Edit1.Text:=form1.ADOQuery1.fieldbyname('序号').AsString;
...
这段程序中,sql.text = 'select * from 表A where 物品 = b4',
因为format()不会为参数加一个引号上去!
可在1或2处修改程序,最终使WHERE语句变成 :where 物品 = 'b4'
 
to dlnew:
如果如你所说,那我下面的句子也应该不正确,但是在程序中却没问题。
var
i:string;
begin
I:=form2.Edit1.Text;


ADOQUERY1.SQL.Add('FROM 各地车总数量 C ,车型代码 A');
//实现form2上的edit数字,变成查询中的月份
Adoquery1.SQL.Add(format('Where C.月份<=%s',)); --------------注意这句
Adoquery1.SQL.Add('AND A.车型代码 *= C.车型代码');
Adoquery1.SQL.Add('GROUP BY a.车型代码');
adoquery1.SQL.Add('order by a.车型代码 ');
Adoquery1.ExecSQL;

另外可能我的话没说明白,当在combobox里面选择了一种商品的时候,弹出对应的错误
即“列名'对应物品'无效”

这上面的句子可是能运行阿。
Adoquery1.SQL.Add(format('Where C.月份<=%s',));

这和我写的句子有什么差距呢。
 
另外我还想用另一种方法,来实现获得序号的方法,
用dblookupcombobox和dbedit,当选择好combobox里面的内容后,debedit 也会随着变化,但是
有一个关键性的问题:当鼠标打开combobox里面的时候,鼠标在滚动条上移动的时候,dbedit
的数值也随着变,这是你把鼠标移开,会发现combobox现实的内容还是原值,但是dbedit现实内容已经
变成了你鼠标离开时的序号了。
如果能解决combobox.text的内容和dbedit.text的内容同步,那这种解决方法也行。
 
差别在于字段的数据类型。
前面提到的“物品”字段是个string,string就有string的规范,也就是必须用引号引起来。
而后面的月分是个INTEGER字段。
这个和在DELPHI编程是一样的,当你定义一个STRING变量 A 时,要对它进行赋值,如果写成
A := A DEMO STRING;编译时一定出错,而对于:
var
a : integer;
begin
a := 123;
end;
是不会错的!
 
改成如下格式:

adoquery1.SQL.Add(format('select * from 表a where 物品="%s"',));
但是还是那个提示[:(]
在表中
序号是int,物品是nvarchar数据格式,是不是如果delphi用string,那表物品的数据格式应该
换成别的?????

 
解决了。谢谢dlnew.
 
在ADO中不能用双引号来表示STRING,只能用单引号表示,如
adoquery1.SQL.Add(format('select * from 表a where 物品=''%s''',));
 
后退
顶部