sqlthis.autocommit=false
if dw_1.update(true , false ) <> 1 then //salepay表更新
rollback using sqlthis;
messagebox("提示1","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
//================付款方式为储值卡时数据的更新(脱机状态不允许使用储值卡)
if netlink = true then
string ls_chu , ls_type , ls_t
decimal le_c2,le_c3 , le_c
int jj
for jj = 1 to dw_1.rowcount()
ls_type = dw_1.object.paystyle[jj]
ls_chu = dw_1.object.paystyleno[jj]
le_c = dw_1.object.pay[jj]
select autohandin into :ls_t from paystyle where paystylename = :ls_type using sqlthis ;
if ls_t='1' then // '1'表示储值卡
select card2 , card3 into :le_c2 , :le_c3 from paycard where id = :ls_chu using sqlthis ;
le_c2 = le_c2 - le_c
le_c3 = le_c3 - le_c
update paycard set card2 = :le_c2 , card3 = :le_c3 where id = :ls_chu using sqlthis ;
end if
next
end if
//----储值卡数据处理完毕
//============================================
//=====找零数据的插入
le_return=dw_1.object.c_return[1]
if le_return<0 then
INSERT INTO salepay
( saleid,
salepayno,
seller,
sellername,
saledate,
paystyle,
paystyleno,
currency,
exchangerate,
pay,
payrmb )
VALUES ( :gs_saleid,
:li_rowsum,
:userid,
:username,
:id_system,
'现金',
'',
'人民币',
1,
:le_return,
:le_return )
using sqlthis;
if sqlthis.sqlcode = -1 then
rollback using sqlthis ;
messagebox("提示2","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
//*********付款数据处理完毕********************//
//////////////////////////////////////////////////////////////////
///// 销售明细数据的处理salecom表更新
//////////////////////////////////////////////////////////////////
if w_salemain.dw_1.getitemdecimal(w_salemain.dw_1.rowcount() , "saleprice") = 0 &
or isnull(w_salemain.dw_1.getitemdecimal(w_salemain.dw_1.rowcount() , "saleprice")) then
w_salemain.dw_1.deleterow(w_salemain.dw_1.rowcount())
end if
if w_salemain.dw_1.update(true , false) <> 1 then //salecom表更新
rollback using sqlthis;
messagebox("提示3","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
decimal le_zk,le_zksum,le_total
le_zk=w_salemain.dw_1.getitemdecimal(1,"saledisc")
le_zksum=w_salemain.dw_1.object.disc[1]
if isnull(le_zksum) then le_zksum =0
le_total=totalval + le_zksum
//----销售主表数据的插入
INSERT INTO salemain
( saleid,
posid,
saledate,
seller,
sellername,
vipid,
totalsale,
totaldisc )
VALUES ( :gs_saleid,
:gs_posid,
:id_system,
:userid,
:username,
'',
:le_total ,
:le_zksum )
using sqlthis ;
if sqlthis.sqlcode=-1 then
rollback using sqlthis ;
messagebox("提示4","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
//---销售主表数据插入完毕
///////////////////////////////////////////////////
/*--更新本地库---*/
if netlink then
UPDATE posmachineparm
SET saleid = :gs_saleid
WHERE posmachineparm.posmachineid = :gs_posid using sqllocal ;
if sqllocal.sqlcode = -1 then //本地库存盘错误时
rollback using sqlthis ;
rollback using sqllocal ;
messagebox("提示5","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
/*------更新网络库-----*/
UPDATE posmachineparm
SET saleid = :gs_saleid
WHERE posmachineparm.posmachineid = :gs_posid using sqlthis ;
if sqlthis.sqlcode=-1 then
rollback using sqlthis ;
rollback using sqllocal ; //前面已经有本地库操作,故本地库事物必须回滚
messagebox("提示6","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
//*POS机销售流水号更新完毕
//=====================================================
//会员卡消费处理
if gi_vip=1 then
update salemain set vipid=:vipid where saleid=:gs_saleid using sqlthis ;
if sqlthis.sqlcode=-1 then
rollback using sqlthis ;
rollback using sqllocal ; //前面已经有本地库操作,故本地库事物必须回滚
messagebox("提示7","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
select disc,totalamount,totaldisc,totalinterest into :le_disc,:le_totalamout,:le_totaldisc,:le_totalinter from vip where vipid=:vipid using sqlthis;
if isnull(le_disc) then le_disc = 0
if isnull(le_totalamout) then le_totalamout = 0
if isnull(le_totalinter) then le_totalinter = 0
le_tdisc=le_zksum
le_totaldisc=le_tdisc + le_totaldisc
le_totalamout=totalval + le_totalamout
le_totalinter=totalval + le_totalinter
update vip set totalamount=:le_totalamout , totaldisc=:le_totaldisc,totalinterest=:le_totalinter where vipid=:vipid using sqlthis;
if sqlthis.sqlcode=-1 then
rollback using sqlthis ;
rollback using sqllocal ; //前面已经有本地库操作,故本地库事物必须回滚
messagebox("提示8","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
//---会员卡处理完毕
////////////////////////////////////////////
///折让、折扣数据的处理
/////////////////////////////
if w_salemain.dw_disclevel.update(true , false) <> 1 then
rollback using sqlthis ;
rollback using sqllocal ; //前面已经有本地库操作,故本地库事物必须回滚
messagebox("提示9","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
//-------折扣、折让处理完毕
//数据的提交
commit using sqlthis ;
commit using sqllocal ;
///////////////////////////////////////
/////数据处理完毕
/////票据打印
//////////////////////////////////////
CREATE TABLE [dbo].[salemain] (
[saleid] [char] (12) NOT NULL ,
[posid] [char] (2) NOT NULL ,
[saledate] [datetime] NOT NULL ,
[seller] [char] (6) NOT NULL ,
[sellername] [varchar] (12) NOT NULL ,
[vipid] [varchar] (12) NOT NULL ,
[totalsale] [decimal](15, 4) NOT NULL ,
[totaldisc] [decimal](15, 4) NOT NULL,
CONSTRAINT salemainpk PRIMARY KEY CLUSTERED
(saleid)
)
go
create index i_salemaindate on salemain
(saledate)
go
CREATE TABLE salecom(
saleid char(12) NOT NULL,
salecomno smallint NOT NULL,
saledate datetime NOT NULL,
comid varchar(12) NOT NULL,
comname varchar(40) NOT NULL,
comtype varchar(10) NULL,
warehouseid varchar(8) NOT NULL,
warehouse varchar(40) NOT NULL,
vendorid varchar(8) NOT NULL,
vendorname varchar(50) NOT NULL,
saleprice decimal(15, 4) NOT NULL ,
saledisc decimal(15, 4) NOT NULL ,
quantity decimal(15, 4) NOT NULL ,
subdisc decimal(15, 4) NOT NULL ,
subsale decimal(15, 4) NOT NULL ,
remark varchar(20) NULL ,
constraint salecompk primary key Nonclustered
(saleid,salecomno)
)
go
create index i_salecomsaleid on salecom
(saleid)
go
create index i_salecomcomid on salecom
(comid)
go
create index i_salecomwarehouseid on salecom
(warehouseid)
go
create index i_salecomsaledate on salecom
(saledate)
go
create index i_salecomsalevendorid on salecom
(vendorid)
go
create table salepay (
saleid char(12) NOT NULL,
salepayno smallint NOT NULL ,
seller char (6) NOT NULL ,
sellername varchar (12) NOT NULL ,
saledate datetime NOT NULL ,
paystyle varchar (20) NOT NULL ,
paystyleno varchar (20) NOT NULL ,
currency varchar (20) NOT NULL ,
exchangerate decimal(15, 8) NOT NULL ,
pay decimal(15, 4) NOT NULL ,
payrmb decimal(15, 4) NOT NULL ,
constraint salepaypk primary key NONclustered
(saleid,salepayno)
)
go
create index i_salepaysaleid on salepay
(saleid)
go
create index i_salepaysaledate on salepay
(saledate)
这是从修改后的程序目前没有发现死锁
//// --数据存盘(保证用一个事物,避免死锁)
sqlthis.autocommit = false
sqllocal.autocommit = false
if dw_1.update(true , false ) <> 1 then
rollback using sqlthis;
messagebox("提示1","付款数据存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
///// 销售主表数据的处理
if w_salemain.dw_salemain.update(true , false) <> 1 then
rollback using sqlthis;
messagebox("提示2","销售主表数据存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
///// 销售明细数据的处理
if w_salemain.dw_1.update(true , false) <> 1 then
rollback using sqlthis;
messagebox("提示3","销售明细数据存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
///// 会员卡数据的处理
if gi_vip=1 then
if w_salemain.dw_vip.update(true , false) <> 1 then
rollback using sqlthis;
messagebox("提示4","会员卡数据存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
//================付款方式为储值卡时数据的更新(脱机状态不允许使用储值卡)
if netlink = true and dw_paycard.rowcount() > 0 then
if dw_paycard.update(true , false) <> 1 then
rollback using sqlthis ;
messagebox("提示5","储值卡存盘错误!",stopsign!)
return
end if
end if
///折让、折扣数据的处理
if ll_discrowcount > 0 then
if w_salemain.dw_disclevel.update(true , false) <> 1 then
rollback using sqlthis ;
messagebox("提示6","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
//*POS机销售流水号更新开始
//=====================================================
/*------更新网络库-----*/
UPDATE posmachineparm
SET saleid = :gs_saleid
WHERE posmachineparm.posmachineid = :gs_posid using sqlthis ;
if sqlthis.sqlcode=-1 then
rollback using sqlthis ;
messagebox("提示7","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
/*--更新本地库---*/
if netlink then
UPDATE posmachineparm
SET saleid = :gs_saleid
WHERE posmachineparm.posmachineid = :gs_posid using sqllocal ;
if sqllocal.sqlcode = -1 then //本地库存盘错误时
rollback using sqlthis ;
rollback using sqllocal ;
messagebox("提示8","存盘错误!",stopsign!)
dw_1.setfocus()
return
end if
end if
//数据的提交
commit using sqlthis ;
commit using sqllocal ;
强烈建议你在客户端更新表的时候对该表的某条记录加锁,即不要出现多个客户端同时更新一个表的同一条纪录!!
举个例子:
//====================================================================
//入库单加锁
//====================================
UPDATE KCRKD1 SET KCRKD1_LSBH=KCRKD1_LSBH WHERE KCRKD1_LSBH=:vsRKLS;
if sqlca.sqlcode(sqlca)<>0 then
vsMessage="对入库单加锁错误!具体信息如下:~r~t"+sqlca.SqlErrText
messagebox("",vsmessage)
end if
这样你就对kcrkd1这个表的一条纪录加锁了,直到你commit以后,该条记录是不允许其他人对其修改的!!!
这样或许就能解决你的死锁问题!!!