一个可能比较难的ADOQuery增加记录问题,各位高手帮忙耐心看看。

laohai 2003-09-10 10:10:25
我从三个表里选出了想要的字段,用ADOQuery控件显示出来了。
现在我想向这个组合表里增加(或修改)一个记录。
选表的SQL语句如下:
select a_tline.f_name as 线路名称,a_tbuslist.f_buscode as 测点编码,a_tbuslist.f_busname as 监测点名称,
a_tbuslist.f_kva as 容量,a_tbuslist.f_addr 安装地址,a_tbuslist.f_busnum as 仪表号,
a_ttype.f_name as 型号,a_tbuslist.f_size as 变比,a_tbuslist.f_setdate as 安装日期,a_tbuslist.f_note as 备注
from a_tline,a_tbuslist,a_ttype
where a_tline.f_lineno=a_tbuslist.f_lineno and a_ttype.f_type=a_tbuslist.f_type
想要增加或修改字段如下: 线路名称 测点编码 监测点名称 容量 安装地址
仪表号 型号 安装日期 备注

{
form2.ADOQuery1.append;
form2.ADOQuery1.fieldvalues['测点编码']:=strtoint(edit1.text);
form2.ADOQuery1.fieldvalues['监测点名称']:=edit2.text;
form2.ADOQuery1.post;
form2.ADOQuery1.refresh;
}//开始这样写的,可惜这段代码实现不了

各位高手给点思路或来段实现代码更好(呵呵),小弟谢了先!

...全文
21 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wing_er 2003-09-12
  • 打赏
  • 举报
回复
每个表的主键必须包含在列中
lrany 2003-09-12
  • 打赏
  • 举报
回复
用存储过程肯定可以实现。实际上你的问题等价于:建立一个多表来源的视图,对此视图进行增加修改。理论上来说,如果只是对其中的一张表进行操作,是可以的。但是我也好像有过问题。现在我是再用其他QUERY连接后台表,对此QUERY定位,再修改后台表,则随之前台的数据刷新改变。例如:
//删除计划
var
XH: INTEGER;

begin

if (Edit_ND.Text = '') or (ComboBox_YF.Text = '') then
begin
abort;
end;

if DataModule1.AQ_YFMDJH.FieldByName('计划下达部门').AsString = 'FC' then
begin
Application.MessageBox('此零件由分厂下达,车间不可删除', '错误', MB_OK
+
MB_ICONEXCLAMATION + MB_DEFBUTTON1 + MB_APPLMODAL);
ABORT;
end;

if DataModule1.AQ_YFMDJH.RecordCount = 0 then
begin
Application.MessageBox('目前没有记录可供删除', '错误', MB_OK
+
MB_ICONEXCLAMATION + MB_DEFBUTTON1 + MB_APPLMODAL);
ABORT;
end;

XH := DataModule1.AQ_YFMDJH.FIELDBYNAME('序号').AsInteger;

///进行删除
try

DataModule1.ADOCon_cjjh.BeginTrans;

DataModule1.AQ_YFMDJH.Edit;
DataModule1.AQ_YFMDJH.Delete;
DataModule1.AQ_YFMDJH.UpdateBatch;

//找出所有比这个序号大的数值
ADOQuery_DELETE.Close;
ADOQuery_DELETE.Parameters.ParamByName('XH_CS').Value := XH;
ADOQuery_DELETE.Parameters.ParamByName('ND_CS').Value := Edit_ND.Text;
ADOQuery_DELETE.Parameters.ParamByName('YF_CS').Value := ComboBox_YF.Text;
ADOQuery_DELETE.Open;
ADOQuery_DELETE.First;

//进行序号的根新
while not ADOQuery_DELETE.Eof do
begin
ADOQuery_DELETE.Edit;
ADOQuery_DELETE.FieldByName('XH').AsInteger :=
ADOQuery_DELETE.FieldByName('XH').AsInteger - 1;
ADOQuery_DELETE.Post;
ADOQuery_DELETE.UpdateBatch();
ADOQuery_DELETE.Next;
end;

DataModule1.ADOCon_cjjh.CommitTrans;

except
DataModule1.ADOCon_cjjh.RollbackTrans;
Application.MessageBox('出现错误,请检查网络', '错误', MB_OK
+
MB_ICONEXCLAMATION + MB_DEFBUTTON1 + MB_APPLMODAL);
end;

DataModule1.AQ_YFMDJH.Refresh;

end;

上段程序ADOQuery_DELETE就是专门来删除的。
一点意见,希望高手批评!
huazaijiajia 2003-09-12
  • 打赏
  • 举报
回复
干嘛不用sql语句来做
wuzhanxi 2003-09-12
  • 打赏
  • 举报
回复
同意楼上的观点,用存储过程
xah_JD 2003-09-11
  • 打赏
  • 举报
回复
用procedure 会更好处理
AWolfBoy 2003-09-11
  • 打赏
  • 举报
回复
只要你的表都是以主键来关联的就可以了
golinjin 2003-09-10
  • 打赏
  • 举报
回复
关注
laohai 2003-09-10
  • 打赏
  • 举报
回复
自己Up以下,如果回答正确,再加50,穷我所有分,问!
sirliner 2003-09-10
  • 打赏
  • 举报
回复
还是分开一个表一个表的增加记录好.
AWolfBoy 2003-09-10
  • 打赏
  • 举报
回复
你这属于多表更新的问题,只要你的关联表都有外键参考就可以的
laohai 2003-09-10
  • 打赏
  • 举报
回复
up

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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