求帮忙,打印之后做了update 和insert 的事物控制
这样的,当我打印之后 我想做一次 更新 和 插入 的行为
sqlca.autocommit = false
for i = 1 to ll_i
temp = trim(arr_char[i])
if temp <> '' then
//更新状态
update send_yarn_dtl set finish_status = 'I'
where send_no = :temp
using sqlca;
if sqlca.sqlcode <> 0 then
messagebox('Error_update',sqlca.sqlErrText)
rollback using sqlca;
end if
//记录下信息
insert into invoice_hdr values(:is_invoice_no , :ii_invoice_customer , :temp , 'Y' , :print_date , :ls_dye_no , :li_to_customer , :invoice_date) using sqlca;
if sqlca.sqlcode <> 0 then
messagebox('Error_insert',sqlca.sqlErrText)
rollback using sqlca;
end if
commit using sqlca;
end if
next
end if
end if
sqlca.autocommit = true
我想知道这样写有没有问题?还有这个事物的一个控制,求解决!
以上这段代码 是 点击了 打印之后才做的,是否还有其他的见解!
[解决办法]
if sqlca.sqlcode <> 0 then
messagebox('Error_insert',sqlca.sqlErrText)
rollback using sqlca;
end if
一定要改成
if sqlca.sqlcode <> 0 then
rollback using sqlca;
messagebox('Error_insert',sqlca.sqlErrText)
return
end if
1.messagebox千万不能写在rollback之前,会造成锁死.
2.异常之后你不return,还继续往下进行也是不合逻辑的(这个不强求)
[解决办法]
从你的脚本中好像是做完所有打印记录后。才进行更新标识和插入记录动作。不知这个脚本写在什么地方?
如果是打印了一个dw中的内容,建议可以写到dw的printend事件中,这样确保打印完成后做你要求的更新和插入操作。
在这个事件的脚本中不必要写sqlca.autocommit;
更新标识的语句没有问题;
最好是在更新语句执行后,判断更新是否成功:
If sqlca.sqlcode= 0 then
insert into invoice_hdr values(:is_invoice_no , :ii_invoice_customer , :temp , 'Y' , :print_date , :ls_dye_no , :li_to_customer , :invoice_date) using sqlca;
if sqlca.sqlcode = 0 then
commit;
else
MessageBox('','')
rollback;
end if
else
messageBox('','')
rollback;
end if
如上所述,你的插入不成功。看看是否你的插入语句中表的列数和values中的是否一样?跟踪一下。
1#说的将rollback放到messagebox之前是不对的!因为rollback执行后,就会将sqlca中的sqlcode和sqlerrtex覆盖掉前面语句执行的错误信息,提示的错误信息将不会出现。
[解决办法]