update 语句出错(50分)

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

ttaa

Unregistered / Unconfirmed
GUEST, unregistred user!
access的两个表 planfile,plantemp都有字段prodno.
现在要用符合某一条件的planfile的prodno的最大值替换plantemp的prodno
我的思路:将planfile的prodno最大值赋予临时表t1。
ADOQDel.SQL.Clear;
ADOQDel.SQL.Add('update Plantemp set Prodno=t1.prodno from ');
ADOQDel.SQL.Add('Select max(Prodno) as prodno from Planfile as t1 ');
ADOQDel.SQL.Add('where left(Prodno,4)='''+copy(ADOQrecProdno.Value,1,4)+'''');
ADOQDel.ExecSQL;
但出错了。如果不用 ADOQDel.SQL.Add('update Plantemp set Prodno=t1.prodno from ');这句。
其他的几条语句都没有问题。出错应该在搭配上。

我换了几种写法,多出错。
ADOQDel.SQL.Clear;
ADOQDel.SQL.Add('update Plantemp set Prodno=t1.prodno from ');
ADOQDel.SQL.Add('(Select max(Prodno) as prodno from Planfile) as t1 ');
ADOQDel.SQL.Add('where left(Prodno,4)='''+copy(ADOQrecProdno.Value,1,4)+'''');
ADOQDel.ExecSQL;

或者
ADOQDel.SQL.Clear;
ADOQDel.SQL.Add('update Plantemp set Prodno=t1.prodno from ');
ADOQDel.SQL.Add('(Select max(Prodno) as prodno from Planfile ');
ADOQDel.SQL.Add('where left(Prodno,4)='''+copy(ADOQrecProdno.Value,1,4)+'''');
ADOQDel.SQL.Add(') as t1');
ADOQDel.ExecSQL;
 
好象使用了access不支持的SQL写法
 
说一下错误信息
 
用showmessage查看一下sql语句,注意空格如第一句的from和第二句的select是不是连在一起了
 
我这有一例子,看看对你有没有帮助:
(1)在ACCESS中
UPDATE gr a, zjjhmx b SET a.dnzhze = a.dnzhze + b.zhsj
WHERE ( (a.bh = b.grbh ) AND (b.djh = 15) );
(2)但在SQLSERVER上应该这样写。其中 SET 后面不能用gr.dnzhze
UPDATE gr SET dnzhze = a.dnzhze + b.zhsj from gr a,zjjhmx b
where (a.bh = b.grbh) and (b.djh = 15)
 
試一下
with adoqdel do
begin
sql.clear;
SQL.Add('update plantemp set prodno=(select max(prodno) from ');
sql.add('planfile where left(prodno,4)='+''''+copy(adoqrecprodno.value,1,4)+''''+')');
ExecSQL;
end;
 
我在Sql下試了一個
AA,BB兩個表﹐結構是一樣的
共兩個字段
id int(4) not null
data int(4) not null
建立了兩個表后﹐輸入一些數據
然后
update aa set data=(select max(data) from bb) where id=3
你會看到什么結果呢﹖
也不要笑話![:D]
 
with ADOQDel do
begin
Close;
SQL.Text:= 'update Plantemp set Prodno='#13#10 +
'(Select Max(Prodno) from Planfile'#13#10 +
'where left(Prodno,4)=''' + copy(ADOQrecProdno.Value, 1, 4) + ''')';
ExecSQL ;
end;
 
to smallbs:access也支持''''的吧。我试过的。不是错在''''上。
to lubmin:当然注意了空格。
to hgood:我也认为你的语句是正确的,很清晰啊。但执行的时候还是错误。
我甚至简化成:
ADOQDel.SQL.Clear;
ADOQDel.SQL.Add('update Plantemp set Prodno= ') ;
ADOQDel.SQL.Add('(Select max(Prodno) from Planfile )');
还是错误的,错误是:操作必须使用一个可更新的查询。
to svw0506:#10是什么?你的语句我还没有测试。
 
我的意思是這樣的:
update plantemp set prodno=(select max(prodno) from planfile where left(prodno,4)
=copy(adoqrecprodno.value,1,4))
有可能我上面的語句寫錯了,
你可以用
showmessage(sql.text)顯示一下﹐要不你把顯示的效果貼在這里看看﹗﹗
 
我写成最简单的
update plantemp set prodno=(select max(prodno) from planfile)测试一下,
已经没加进where条件了。
竟然也是错的。为什么啊?
 
prodno是什么類型的數據﹖
我在我的數據庫里做下面的操作可以,你再檢查一下數據類型吧
update aa set data=(select max(data) from bb) where id=3
 
access表 prodno字段
类型 文本
字段大小 7
必填字段 是
允许空字符串 否
索引 有(无重复)

一切都很正常。
我要干活去了。暂时离开我心爱的电脑。:)。两个小时后才上来
 

to ttaa:
update plantemp set prodno=(select max(prodno) from planfile),
在access中支持吗?但在oracle中是支持的。
 
to hgood:错误提示:操作必须使用一个可更新的查询
to pcc_mmz1:我也不知道支部支持。怎样不知道支不支持?
access帮助?
 
已经没人愿意回答我的问题了?
 
加上
try
except
end;
再看看結果﹗我想有可能是Access數據庫不支持吧﹗如果這樣的話﹐你就分兩步做吧
1.data=得到最大值
2.update table set pnno=data
3.把 try ..except end 加上去﹗
 
多人接受答案了。
 
后退
顶部