请教,结构问题,如何用SQL语句将access根据表前2项内容赋值第三项

busterchen 2011-07-21 04:33:54
表data 中有三项 grp、sub、val,都为数字类型,分别表示 组号、从号、值。
现将表内每项的grp与sub的值提取出来,计算后结果放在result中,并将result的值放在表的val项中。
问题是,先执行select操作,之后再update操作,但是update后不能执行select的next操作,不知如何改。
...
sql.clear;
sql.add('select * from data');
open;
while not eof do
begin
a:=FieldByName('grp').value;
b:=FieldByName('sub').value;
...//计算得到result值
sql.clear;
sql.add('update data set [val]=:val where [grp]=:grp and [sub]=:sub');
Parameters.ParamByName('val').value:=result;
Parameters.ParamByName('grp').value:=a;
Parameters.ParamByName('sub').value:=b;
ExecSQL;
end;
next;//内存中数据会没有了,只能修改一条数据,执行到next就会报错
...
我是用delphi写的,不晓得这个结构该怎么改才能达到我想要的。
...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
busterchen 2011-07-22
  • 打赏
  • 举报
回复
val值是通过下位机回复的一串数据,分析得到的result值,将其放在表的val项中
WWWWA 2011-07-22
  • 打赏
  • 举报
回复
用两个ADOQUERY,1个SELECT、循环,另1个UPDATE

VAL值怎么得出的
busterchen 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]

(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语……
[/Quote]
初学者,第一次发贴,不好意思。问问题,谦虚为主,我觉得只需要用最简短的语言表达清我的意思就行了,内容太多,回帖的人看了也累。要是没说清楚,请包涵。
用的是access2000数据库,用delphi7写的。
真不好意思,这是上位机软件,这个是计算方法其实无法描述,需要的只是把数据通过COM串口发送到下位机板子上,下位机通过检测电路板电流之类的,反馈得到一个result值,如何检测,我也不知道,我想这个问题和通讯没关系,就忽略了一下。
with DataModule1.ADOQuery1 do
begin
sql.clear;
sql.add('select * from data'); //需要处理表中的每一项
open;
while not eof do //以下为数据处理过程,用串口通讯,使用spcomm控件
begin
a:=FieldByName('grp').value;
b:=FieldByName('sub').value;
sendbuf[0]:=Byte($06);//帧头
sendbuf[1]:=Byte(a);
sendbuf[2]:=Byte(b);
sendbuf[3]:=Byte($02);
sendbuf[4]:=Byte($02);
sendbuf[5]:=Byte(aa);//帧尾
FormMain.SpComm1.WriteCommData(@sendbuf,6);
waitresult:=event_status.waitfor(1000); //延时1秒
case waitresult of //收到的信息处理
wrError: //错误
begin

end;
wrAbandoned: //无效
begin

end;
wrSignaled: //正常接受
begin
if (receivebuf[4]=byte($a1)) and receivebuf[5]=byte($01) then
begin
s:=FormatDateTime('yyyy-mm-dd hh:mm:ss',now)+' 第'+IntToStr(receivebuf[1])+'组'+IntToStr(receivebuf[2])+'号故障';
richedit1.lines.add(s);
end;
if (receivebuf[4]=byte($a0)) and receivebuf[5]=byte($01) then
begin
result:=1;
end;
if (receivebuf[4]=byte($a0)) and receivebuf[5]=byte($02)
begin
result:=2;
end;
if (receivebuf[4]=byte($a0)) and receivebuf[5]=byte($03)
begin
result:=0;
end;
end;
wrTimeout: // 超时处理
begin

end;
end; //case结束,处理结束
sql.clear; //以下为存储result的值到表val项
sql.add('update data set [val]=:val where [grp]=:grp and [sub]=:sub');
Parameters.ParamByName('val').value:=result;
Parameters.ParamByName('grp').value:=a;
Parameters.ParamByName('sub').value:=b;
ExecSQL;
end;//whlie结束
next;
end;

结构我写清楚一点,开始时候,比如是:
grp sub val
1 2 0
1 3 0
2 1 0
3 4 0

结果,结果我也不晓得会什么样,要看当时下位机的电流大小,得到的result值。
比如得到
grp sub val
1 2 2
1 3 1
2 1 0
3 4 1
我问的问题其实和这些没关系,问的是一个思路的问题。用select语句open后,会将表数据放在内存中,每次处理一项满足条件的数据,而原本每次执行next的时候,会得到满足条件的下一条数据,不过在在next之前,又执行了SQL语句,把内存信息给替换掉了,不能执行next。
程序编译没错,我是想知道能不能有什么方法,一次性处理检测是否有故障和将result的值更新到表的val项中。
初学者,请多包涵,我觉得这是数据库使用的问题,而不是通讯的问题,所以放在这个版面了。


ACMAIN_CHM 2011-07-21
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

wwwwb 2011-07-21
  • 打赏
  • 举报
回复
贴记录及要求结果出来看看
能否直接用UPODATE解决
wwwwb 2011-07-21
  • 打赏
  • 举报
回复
用两个ADOQUERY,1个SELECT、循环,另1个UPDATE
wwwwb 2011-07-21
  • 打赏
  • 举报
回复
用两个ADOQUERY,1个SELECT、循环,另1个UPDATE

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧