十万火急请教tadodataset的locate函数的问题?(60分)

  • 主题发起人 主题发起人 sunnydty
  • 开始时间 开始时间
S

sunnydty

Unregistered / Unconfirmed
GUEST, unregistred user!
我用一个窗体对一个表teacher进行插入操作,该表和lesson表关联,我用了三个查找字段。程序如下:

procedure Tinputteacher.Button1Click(Sender: TObject);
var
id1,id2,id3:integer;
begin
//DataModule2.dsinputteacher.DataSet.edit;
//DataModule2.dsinputteacher.DataSet.Post;
//DataModule2.dsinputteacher.DataSet.insert;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('teachername').value
:=edit1.Text;
datamodule2.ADODataSetlesson.Open;
datamodule2.ADODataSetlesson.Locate
('lsnname',VarArrayOf([DBLookupComboBox3.Field]),[loPartialKey]);
id1:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.Locate
('lsnname',VarArrayOf([DBLookupComboBox4.Field]),[loPartialKey]);
id2:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.Locate
('lsnname',VarArrayOf([DBLookupComboBox5.Field]),[loPartialKey]);
id3:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.close;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id1;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id2;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id3;
datamodule2.ADODataSetlklsn.ExecSQL;
end;

调试时在三个locate函数处报错
“incompatible types:'variant' and 'tfield'” 和
“incompatible types:'tlocateoption' and'integer'”

请问是什么原因,是不是locate函数有错?
小弟现在是十万火急,望各位大峡不吝赐教,不胜感激!!!!!!
 
怎么没人理我呀,高手都到哪儿去了呀!!我可急死了呀!!
 
1.DBLookupComboBox3.Field.Value
单个字段,可以不用VarArrayOf

2.改了1。后再看
 
DBLookupComboBox3.Field
//把Field改为DBLookupComboBox3.Text;
 
to ning_ning:

我按照你的作了之后,出错减少为三个“ordinal type required"
为何?!!!!
 
在前面引入 db 单元
 
db单元已经引入了呀
 
现在编译可以通过了,只是在运行时出错,出错的地方还是locate函数,是不是不能这样插入
记录呀
 
你最后是怎么改的,还有出错信息是什么?
 
DataModule2.ADODataSetlklsn.Parameters.ParamByName('teachername').value
:=edit1.Text;
datamodule2.ADODataSetlesson.Open;
datamodule2.ADODataSetlesson.Locate
('lsnname',DBLookupComboBox3.text,[loPartialKey]);
id1:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.Locate
('lsnname',DBLookupComboBox4.text,[loPartialKey]);
id2:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.Locate
('lsnname',DBLookupComboBox5.text,[loPartialKey]);
id3:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
datamodule2.ADODataSetlesson.close;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id1;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id2;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id3;
datamodule2.ADODataSetlklsn.ExecSQL;
end;

可以运行了,但插入的结果只能插入一个lessonid1字段,后面两个都为空
为什么??
 
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id1;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid2').value
:=id2;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid3').value
:=id3;
 
程序毫无问题,就看id2与id3是否找到,
一股locate语句的标准写法是
if datamodule2.ADODataSetlesson.Locate('lsnname',DBLookupComboBox4.text,[loPartialKey])
then id2:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value
else showmessage(DBLookupComboBox4.text+'不存在');

通过这种方式你可判断DBLookupComboBox4.text是否找到

试一下。
 
我在程序中加了一个判断语句,通过edit1。text 和已存在的记录的teachername比较,若
相同的话,就不插入该记录,并提示用户,可调试总是达不到预期效果(重复记录也可插入)
不知是何原因?是不是判断语句 if (edit1.text)
=(datamodule2.ADODataSetteacher.FieldByName('teachername').value) 无效呀

部分程序如下:

id3:=datamodule2.ADODataSetlesson.fieldbyname('lessonid').Value;
//datamodule2.ADODataSetlesson.close;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid1').value
:=id1;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid2').value
:=id2;
DataModule2.ADODataSetlklsn.Parameters.ParamByName('lessonid3').value
:=id3;
flag:=0;
datamodule2.ADODataSetteacher.Open;
datamodule2.ADODataSetteacher.First;
while not datamodule2.adodatasetteacher.Eof do
begin
showmessage(edit1.text);
showmessage(datamodule2.ADODataSetteacher.FieldByName('teachername').value);
if (edit1.text)=(datamodule2.ADODataSetteacher.FieldByName('teachername').value) then
begin
flag:=1;
break;
end;
datamodule2.adodatasetteacher.Next;
end;
datamodule2.ADODataSetteacher.Close;
if flag=1 then showmessage('您已经添加了该老师的记录');
if (DataModule2.ADODataSetlklsn.Parameters.ParamByName('teachername').value<>'')
and (flag=0) then
datamodule2.ADODataSetlklsn.ExecSQL;

 
你换成asstring试一下

if (edit1.text)=(datamodule2.ADODataSetteacher.FieldByName('teachername').asstring) then

因value是variant类型
 
多人接受答案了。
 
后退
顶部