客户端是delphi+sql2005,都是单机,不存在并发的问题,在许多客户那边都出现这种主表没有纪录,细表又有记录的情况,一个月大概会出现几条,我自己测试时怎么测也出不来这种数据.
还有的是他们在同一单里执行删除细表记录的操作,全删完后再执行插入操作,结果删除的记录在数据库中还是有.
感觉很奇怪,在DBGRID里明明是有这条记录,删的时候也是用qryGetRCKMX0.fieldbyName('明细ID')去删的,结果DBGRID没显示,数据库里又没有删掉.(这种数据只在客户那边有)一般是这样,主表记录是ID,DH,... 细表记录是 第一条细表记录:细表ID,主表ID-1,DH,... ,第二条:细表ID+1,主表ID-1,DH...第二条:细表ID+2,主表ID,DH...
把代码贴出来,希望有人能帮我解答,不知道是不是事务的问题还是同一个ADO的问题,谢谢,加分.
主表 主键ID为自动增长,DH为单号(取主表里DH的最大值+1)在保存按钮里用事务控制.第一次保存根据ID.text是否为空,为空的话用单号.text 插主表,取出刚插的记录的ID.
try
frmDB.ADOConnection1.BeginTrans;
if trim(ID.text) = '' then
begin
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' insert into 主表(DH,...');
execSQL;
close;
sql.clear;
sql.add(' select ID from 主表 where DH = '+'单号');
open;
ID.text=fieldByName("ID").asString;
end;
end; with qryGetTmp do
begin
close;
sql.clear;
sql.add(' insert into 细表(主表ID,主表DH,..) values( ');
sql.add(ID.text+','+','+''''+edRCKDH0.text+''''...) ');
execSQL;
close;
with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('更新库存的SQL语句');
execSQL;
close;
end;
end;
with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('更新主表的语句'); //插完细表再更新主表
execSQL;
close;
end; frmDB.ADOConnection1.CommitTrans;
except
on e: exception do begin
MsgBox('错误', '数据操作失败!' + e.message, '');
frmDB.ADOConnection1.RollbackTrans;
exit;
end;
end;
RefreshRCKMX; //刷新明细信息;右边的DBGRID绑定的是 qryGetRCKMX0 procedure TfrmKC_YPLS.RefreshRCKMX; //刷新明细;
if trim(ID.text) = '' then
begin
qryGetRCKMX0.close;
exit;
end;
with qryGetRCKMX0 do
begin
close;
sql.clear;
sql.add(' select a.*,c.ypsl00 as kcsl00,'+''''+edyprkdh.Text+''''+' as rkdbh0 from 细表 a,主表 b,库存 c ');
sql.add(' where a.ID=b.ID and a.单号=c.单号 and a.ID= '+ID.text);
open;
end;
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' select sum(yppfj0*ypsl00) as hjje00 from 细表 where rckid0 = '+ID.text);
open;
edCFZJE0.text:=FormatFloat('0.0',fieldByname('hjje00').asFloat);
close;
end;
删除按钮的函数:
if trim(qryGetRCKMX0.fieldbyName('RCMXID').asString) = '' then
begin
//明细表没有数据,但主表有数据,直接把主表的数据也删除掉.
if trim(ID.text) <> '' then
begin
ExecuteSQL('delete from 主表 where ID= '+ID.text); edRCKDH0.text:='';
ID.text:='';
end;
exit;
end;
//否则,要修改相关的库存信息. with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('修改库存的语句');
execSQL;
close;
end; with qryGetTmp do
begin
close;
sql.clear;
sql.add(' delete from 细表 where RCMXID = '+qryGetRCKMX0.fieldbyName('RCMXID').asString);
execSQL;
end;
RefreshRCKMX; //刷新入出库明细;
qryGetRCKMX0,qryGetTmp,frmDB.qryCMD连接都是用的是frmDB.ADOConnection1
ADOConnection1的connectOption是 coAsyncConnect,IsolationLevel是ilCursorStability,MODE是cmShareDenyNone不知道有没有影响望知道问题出在哪里的说下,小的不胜感激.
还有的是他们在同一单里执行删除细表记录的操作,全删完后再执行插入操作,结果删除的记录在数据库中还是有.
感觉很奇怪,在DBGRID里明明是有这条记录,删的时候也是用qryGetRCKMX0.fieldbyName('明细ID')去删的,结果DBGRID没显示,数据库里又没有删掉.(这种数据只在客户那边有)一般是这样,主表记录是ID,DH,... 细表记录是 第一条细表记录:细表ID,主表ID-1,DH,... ,第二条:细表ID+1,主表ID-1,DH...第二条:细表ID+2,主表ID,DH...
把代码贴出来,希望有人能帮我解答,不知道是不是事务的问题还是同一个ADO的问题,谢谢,加分.
主表 主键ID为自动增长,DH为单号(取主表里DH的最大值+1)在保存按钮里用事务控制.第一次保存根据ID.text是否为空,为空的话用单号.text 插主表,取出刚插的记录的ID.
try
frmDB.ADOConnection1.BeginTrans;
if trim(ID.text) = '' then
begin
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' insert into 主表(DH,...');
execSQL;
close;
sql.clear;
sql.add(' select ID from 主表 where DH = '+'单号');
open;
ID.text=fieldByName("ID").asString;
end;
end; with qryGetTmp do
begin
close;
sql.clear;
sql.add(' insert into 细表(主表ID,主表DH,..) values( ');
sql.add(ID.text+','+','+''''+edRCKDH0.text+''''...) ');
execSQL;
close;
with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('更新库存的SQL语句');
execSQL;
close;
end;
end;
with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('更新主表的语句'); //插完细表再更新主表
execSQL;
close;
end; frmDB.ADOConnection1.CommitTrans;
except
on e: exception do begin
MsgBox('错误', '数据操作失败!' + e.message, '');
frmDB.ADOConnection1.RollbackTrans;
exit;
end;
end;
RefreshRCKMX; //刷新明细信息;右边的DBGRID绑定的是 qryGetRCKMX0 procedure TfrmKC_YPLS.RefreshRCKMX; //刷新明细;
if trim(ID.text) = '' then
begin
qryGetRCKMX0.close;
exit;
end;
with qryGetRCKMX0 do
begin
close;
sql.clear;
sql.add(' select a.*,c.ypsl00 as kcsl00,'+''''+edyprkdh.Text+''''+' as rkdbh0 from 细表 a,主表 b,库存 c ');
sql.add(' where a.ID=b.ID and a.单号=c.单号 and a.ID= '+ID.text);
open;
end;
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' select sum(yppfj0*ypsl00) as hjje00 from 细表 where rckid0 = '+ID.text);
open;
edCFZJE0.text:=FormatFloat('0.0',fieldByname('hjje00').asFloat);
close;
end;
删除按钮的函数:
if trim(qryGetRCKMX0.fieldbyName('RCMXID').asString) = '' then
begin
//明细表没有数据,但主表有数据,直接把主表的数据也删除掉.
if trim(ID.text) <> '' then
begin
ExecuteSQL('delete from 主表 where ID= '+ID.text); edRCKDH0.text:='';
ID.text:='';
end;
exit;
end;
//否则,要修改相关的库存信息. with frmDB.qryCMD do
begin
close;
sql.clear;
sql.add('修改库存的语句');
execSQL;
close;
end; with qryGetTmp do
begin
close;
sql.clear;
sql.add(' delete from 细表 where RCMXID = '+qryGetRCKMX0.fieldbyName('RCMXID').asString);
execSQL;
end;
RefreshRCKMX; //刷新入出库明细;
qryGetRCKMX0,qryGetTmp,frmDB.qryCMD连接都是用的是frmDB.ADOConnection1
ADOConnection1的connectOption是 coAsyncConnect,IsolationLevel是ilCursorStability,MODE是cmShareDenyNone不知道有没有影响望知道问题出在哪里的说下,小的不胜感激.
//----------------------------------------------------------------------------------
// 你主表的单位是从哪儿得到的?我怎么没有看出来?另外,你能保证DH在主表里的唯一性么?
// 会不在向从表插入数据时得到不是最新的主表的DH呢?
//----------------------------------------------------------------------------------try
frmDB.ADOConnection1.BeginTrans;
if trim(ID.text) = '' then
begin
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' insert into 主表(DH,...');
execSQL;
close;
sql.clear;
sql.add(' select ID from 主表 where DH = '+'单号');
open;
ID.text=fieldByName("ID").asString;
end;
end;
在点新单时.
with qryGetTmp do
begin
close;
sql.clear;
sql.add(' select max(cast(dh as int)) as dh from 主表);
open;
if fieldByname('dh').asString='' then
DH.text:='1'
else
DH.text:=IntToStr(strToInt(fieldByname('dh').asString)+1);
end;在我机子上怎么点新单,保存,删除,都不会出现客户那边的状况,都是单机
就是根据细表的ID插的,删完执行RefreshRCKMX; //刷新明细的函数;
到最后一条删完时刷新,DBGRID是显示没有数据的,此时再点删除的话才会删主表里的记录
也就是删除没和单号有关系.另外,问题是这样的,主表里只有ID2530的记录,没有ID为2529的记录,主表的历史记录表里也没有
主表 里的记录:
ID DH ..
2530 1266 ..主表的历史记录表(用触发器操作,主表插入,更新时都会在历史表里插入一条记录)
ID DH ..
2530 1266 ..
2530 1266 ..
2530 1266 ..
2530 1266 ..细表 里的记录:
细表ID 主表ID 单号
10745 2529 1266
10746 2529 1266
10747 2530 1266
10748 2530 1266 细表的历史记录与细表一样.(分析是没有做细表的删除操作.)这种记录在每个客户那里都有,有些说只是执行了保存,最后完成,有些是执行了保存,还有执行了删除操作(在DBGIRD里看到是删掉了,在数据库里又没有删掉,细表的历史记录表也是只有插入的操作)忘高手指点一下