起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: liso

[请求]在一个事务中多次更新同一记录的问题**

[复制链接]
 楼主| 发表于 2008-4-3 10:29:30 | 显示全部楼层
老师看看,那个错误已经重现过了,不过好像日志文件里面也没有什么错误信息!

4月3号日志.rar

3.44 KB, 下载次数: 111

回复 支持 反对

使用道具 举报

发表于 2008-4-3 12:02:24 | 显示全部楼层
楼主,把出错的代码提供一下吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-3 13:18:28 | 显示全部楼层
//插入
           TUpdateKind.ukInsert:
           begin
             ls_new_billid := lDeltaDataSet.FieldByName('EIBD_BILLID').AsString;
             ls_new_contract := lDeltaDataSet.FieldByName('EICONTRACT').AsString;
             ls_new_feename := lDeltaDataSet.FieldByName('EIFEENAME').AsString;
             ls_new_paymentflag := lDeltaDataSet.FieldByName('EIBD_PAYMENT_FLAG').AsString;
             lf_new_inv_fee := lDeltaDataSet.FieldByName('EIBDCstdTtl').AsFloat;
             //累加结算单开票金额
             //明细档
             ldc_ServiceCharge :=  0;
             ldc_FitmentCharge :=  0;
             ldc_OtherExpenses :=  0;
             ldc_MagrofCardFee :=  0;
             ldc_VacantRent :=  0;
             ldc_TotalAmount := 0;

             ls_sql := 'SELECT COUNT(EBD_AUTOIN) lcount FROM EXP_BILL_DETAIL WHERE EBD_MAINID = ' + QuotedStr(ls_new_billid) +
                       ' AND EBD_CONTRACT = ' + QuotedStr(ls_new_contract) + ' AND EBD_PAYMENT_FLAG = ' + QuotedStr(ls_new_paymentflag) ;
             lQueryex := TDbCommand.OpenSqlex(ls_sql, lQueryex);
             li_count := 0;
             while not lQueryex.Eof do
             begin
               li_count := lQueryex.FieldByName('lcount').AsInteger;
               lQueryex.Next;
             end;
             lQueryex.EmptyDataSet;
             If li_count = 1 Then
             begin
               ls_sql := 'SELECT (EBD_ServiceCharge - EBD_InvServiceCharge) EBD_ServiceCharge, ' +
                       '(EBD_FitmentCharge - EBD_InvFitmentCharge) EBD_FitmentCharge, ' +
                       '(EBD_OtherExpenses - EBD_InvOtherExpenses) EBD_OtherExpenses, ' +
                       '(EBD_MagrofCardFee - EBD_InvMagrofCardFee) EBD_MagrofCardFee, ' +
                       '(EBD_VacantRent - EBD_InvVacantRent) EBD_VacantRent, ' +
                       '(EBD_TotalAmount - EBD_InvTotalAmount ) EBD_TotalAmount, ' +
                       ' EBD_STATUS ' +
                       ' FROM EXP_BILL_DETAIL WHERE EBD_MAINID = ' + QuotedStr(ls_new_billid) +
                       ' AND EBD_CONTRACT = ' + QuotedStr(ls_new_contract) + ' AND EBD_PAYMENT_FLAG = ' + QuotedStr(ls_new_paymentflag) +
                       ' AND EBD_PAYMENT_FLAG = ' + QuotedStr(ls_new_paymentflag);
               lQueryex := TDbCommand.OpenSqlex(ls_sql, lQueryex);

               ldc_ServiceCharge1 :=  lQueryex.FieldByName('EBD_ServiceCharge').asfloat;
               ldc_FitmentCharge1 :=  lQueryex.FieldByName('EBD_FitmentCharge').AsFloat;
               ldc_OtherExpenses1 :=  lQueryex.FieldByName('EBD_OtherExpenses').AsFloat;
               ldc_MagrofCardFee1 :=  lQueryex.FieldByName('EBD_MagrofCardFee').AsFloat;
               ldc_VacantRent1 :=  lQueryex.FieldByName('EBD_VacantRent').AsFloat;
               ldc_TotalAmount1 := lQueryex.FieldByName('EBD_TotalAmount').AsFloat;

               //物业管理费
               If ls_new_feename = gs_ServiceCharge Then
               begin
                 If ldc_ServiceCharge1 < lf_new_inv_fee Then
                 begin
                   Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '费用名称为 ' + ls_new_feename + '的结算单的已开票金额,超出可开票金额。');
                   lQueryex.Connection.Transaction.Rollback(H);
                   SysUtils.Abort;
                 end;
                 ldc_ServiceCharge := lf_new_inv_fee;
               end;
               //家具租赁费
               If ls_new_feename = gs_FitmentCharge Then
               begin
                 If ldc_FitmentCharge1 < lf_new_inv_fee Then
                 begin
                   Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '费用名称为 ' + ls_new_feename + '的结算单的已开票金额,超出可开票金额。');
                   lQueryex.Connection.Transaction.Rollback(H);
                   SysUtils.Abort;
                 end;
                 ldc_FitmentCharge := lf_new_inv_fee;
               end;
               //物业其他费
               If ls_new_feename = gs_OtherExpenses Then
               begin
                 If ldc_OtherExpenses1 < lf_new_inv_fee Then
                 begin
                   Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '费用名称为 ' + ls_new_feename + '的结算单的已开票金额,超出可开票金额。');
                   lQueryex.Connection.Transaction.Rollback(H);
                   SysUtils.Abort;
                 end;
                 ldc_OtherExpenses := lf_new_inv_fee;
               end;
               //会所费
               If ls_new_feename = gs_MagrofCardFee Then
               begin
                 If ldc_MagrofCardFee1 < lf_new_inv_fee Then
                 begin
                   Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '费用名称为 ' + ls_new_feename + '的结算单的已开票金额,超出可开票金额。');
                   lQueryex.Connection.Transaction.Rollback(H);
                   SysUtils.Abort;
                 end;
                 ldc_MagrofCardFee := lf_new_inv_fee;
               end;
               //空房租金
               If ls_new_feename = gs_VacantRent Then
               begin
                 If ldc_VacantRent1 < lf_new_inv_fee Then
                 begin
                   Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '费用名称为 ' + ls_new_feename + '的结算单的已开票金额,超出可开票金额。');
                   lQueryex.Connection.Transaction.Rollback(H);
                   SysUtils.Abort;
                 end;
                 ldc_VacantRent := lf_new_inv_fee;
               end;

               If ldc_TotalAmount1 = lf_new_inv_fee Then
               begin
                 ls_status := '50';
               end
               Else
               begin
                 ls_status := '40';
               end;
               ls_sql := 'UPDATE EXP_BILL_DETAIL SET ' +
                       ' EBD_InvServiceCharge = EBD_InvServiceCharge + ' + floattostr(ldc_ServiceCharge) +
                       ' ,EBD_InvFitmentCharge = EBD_InvFitmentCharge + ' + floattostr(ldc_FitmentCharge) +
                       ' ,EBD_InvOtherExpenses = EBD_InvOtherExpenses + ' + floattostr(ldc_OtherExpenses) +
                       ' ,EBD_InvMagrofCardFee = EBD_InvMagrofCardFee + ' + floattostr(ldc_MagrofCardFee) +
                       ' ,EBD_InvVacantRent = EBD_InvVacantRent + ' + floattostr(ldc_VacantRent) +
                       ' ,EBD_InvTotalAmount = EBD_InvTotalAmount + ' + floattostr(lf_new_inv_fee) +
                       ' ,EBD_STATUS = ' + QuotedStr(ls_status) +
                       ' WHERE EBD_MAINID = ' + QuotedStr(ls_new_billid) +
                       ' AND EBD_CONTRACT = ' + QuotedStr(ls_new_contract) + ' AND EBD_PAYMENT_FLAG = ' + QuotedStr(ls_new_paymentflag);

               TDbCommand.ExcSqlex(ls_sql,lQueryex);
             end
             else
             begin
               Business.Forms.Dialogs.ShowMessage('累加结算单明细时出错2:编号为 ' + ls_new_billid + '合同号为 ' + ls_new_contract + '的结算单不存在唯一的记录。');
               lQueryex.Connection.Transaction.Rollback(H);
               SysUtils.Abort;
             end;
             //头档
             ls_sql := 'SELECT COUNT(EBH_AUTOIN) lcount FROM EXP_BILL_HEAD WHERE EBH_AUTOIN = ' + QuotedStr(ls_new_billid);
             lQueryex := TDbCommand.OpenSqlex(ls_sql, lQueryex);
             li_count := 0;

             while not lQueryex.Eof do
             begin
                li_count := lQueryex.FieldByName('lcount').AsInteger;
                lQueryex.Next;
             end;
             If li_count = 1 Then
             begin
               ls_sql := 'SELECT EBH_ALL_VALUTA - EBH_INV_VALUTA INV_AVAILABLE_VALUTA FROM EXP_BILL_HEAD WHERE EBH_AUTOIN = ' + QuotedStr(ls_new_billid);
               lQueryex := TDbCommand.OpenSqlex(ls_sql, lQueryex);
               lf_inv_available_valuta := lQueryex.FieldByName('INV_AVAILABLE_VALUTA').AsFloat;

               If lf_inv_available_valuta < lf_new_inv_fee Then
               begin
                 Business.Forms.Dialogs.ShowMessage('累加结算单开票金额时出错2:编号为' + ls_new_billid + '的结算单的已开票金额,超出结算金额。');
                 lQueryex.Connection.Transaction.Rollback(H);
                 SysUtils.Abort;
               end;

               If lf_inv_available_valuta - lf_new_inv_fee = 0 Then
               begin
                 ls_bill_inv_status := '50';
               end
               Else
               begin
                 ls_bill_inv_status := '40';
               end;

               ls_sql := 'UPDATE EXP_BILL_HEAD SET EBH_INV_VALUTA = EBH_INV_VALUTA + ' + floattostr(lf_new_inv_fee) +
                         ', EBH_STATUS = ' + QuotedStr(ls_bill_inv_status) + 'WHERE EBH_AUTOIN = ' + QuotedStr(ls_new_billid);
               TDbCommand.ExcSqlex(ls_sql,lQueryex);
             end
             Else
             begin
               Business.Forms.Dialogs.ShowMessage('累加结算单开票金额时出错2:编号为' + ls_new_billid + '的结算单不存在,不可累加1。');
               lQueryex.Connection.Transaction.Rollback(H);
               SysUtils.Abort;
               Exit;
             end;
           end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-3 13:22:37 | 显示全部楼层
ls_sql := 'UPDATE EXP_BILL_DETAIL SET ' +
                       ' EBD_InvServiceCharge = EBD_InvServiceCharge + ' + floattostr(ldc_ServiceCharge) +
                       ' ,EBD_InvFitmentCharge = EBD_InvFitmentCharge + ' + floattostr(ldc_FitmentCharge) +
                       ' ,EBD_InvOtherExpenses = EBD_InvOtherExpenses + ' + floattostr(ldc_OtherExpenses) +
                       ' ,EBD_InvMagrofCardFee = EBD_InvMagrofCardFee + ' + floattostr(ldc_MagrofCardFee) +
                       ' ,EBD_InvVacantRent = EBD_InvVacantRent + ' + floattostr(ldc_VacantRent) +
                       ' ,EBD_InvTotalAmount = EBD_InvTotalAmount + ' + floattostr(lf_new_inv_fee) +
                       ' ,EBD_STATUS = ' + QuotedStr(ls_status) +
                       ' WHERE EBD_MAINID = ' + QuotedStr(ls_new_billid) +
                       ' AND EBD_CONTRACT = ' + QuotedStr(ls_new_contract) + ' AND EBD_PAYMENT_FLAG = ' + QuotedStr(ls_new_paymentflag);

               TDbCommand.ExcSqlex(ls_sql,lQueryex);
上面这段代码,循环执行,第一次的时候,不报错,第二次跑到这里就报错了.
回复 支持 反对

使用道具 举报

发表于 2008-4-3 13:41:52 | 显示全部楼层
第二次执行,是在一个立即事务中执行了2次,还是执行了两个立即事务

现在用的是什么应用服务器(tomcat吗)?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-7 10:56:41 | 显示全部楼层
用tomcat服务器,第二次执行还是在同一个立即事务中
我现在处理方法就是在一个立即事务中需要对同一条记录进行多次更新,并且更新之前还要对这条记录的某些字段进行判断后再作不同更新处理.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-7 15:57:03 | 显示全部楼层
贾老师:你们的ftp上传不了,我上传到我们服务器上,您从这个地址下载一下吧:
http://www.jqlogistic.com/download/X3/JQ20080407.rar
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-7 16:17:50 | 显示全部楼层
贾老师:操作步骤是这样的1)在开发端模式下,打开租售管理系统---财务结算--开票管理(功能)---开票管理(窗体),然后运行.
(2)运行后新增一张发票,输入发票号(随意),选择普睿司曼电缆(上海)有限公司这家客户,录入日期\开票日期\银行\银行帐号\币种这些信息输入一下
(3)在下面明细表中点击结算单号字段中按钮会弹出一个选择窗口,选择第二条记录(费用比较多点),点击添加按钮会添加到明细表中,点击返回按钮返回
(4)点击保存就开始保存,会执行procedure TINVOICE_MANAGE.dsb_inv_bill_detailupdate();中的代码,
由于都是新增的纪录,因此只要在83楼的代码中设置断点进行跟踪就可以了
回复 支持 反对

使用道具 举报

发表于 2008-4-9 11:28:39 | 显示全部楼层
楼主,上述问题是你在立即事务中占用了太多tomcat数据链接导致的。

解决方法已经发到tianyw@jqlogistic.com邮箱了。
请查收。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-10 04:06 , Processed in 0.045570 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表