請高手幫忙看一下這個存儲過程有什麼問題。

richardwong 2003-08-21 01:59:47
先說明一下,這時一個會計數據過帳的存儲過程。在sql server中能順利執行完畢。但是用pb調用時,就不能順利完成了。問題出在其中的一段代碼,如果將這段
代碼取消,則pb也能順利調用完成。
該存儲過程的作用是將會計數據表ac_init中的數據用循環的方法累加到會計中間
數據表acperamt中.acct_code是科目編號,period是期數,其他就是金額了。同時
如果數據中的會計科目有上層總帳科目,則也自動將上層總帳科目的金額累加。
出問題的代碼我用/************* *************/注釋出來了,這段代碼也就是
累加上層總帳科目金額的代碼。我有一個猜想不知對不對。假設acperamt中原沒有
記錄,那麼有著公共上層總帳科目的數據在過帳時,第一個子帳科目要累加其上層
總帳科目時,因為acperamt沒有其上層總帳科目的記錄,所以是添加記錄,而第二
個子帳科目要累加其上層總帳科目時,因為acperamt已經有了剛新增的上層總帳科目的記錄,所以是更新記錄時,會不會是這裡出問題了?因為我先前在pb中調試時,發現也是第二個子帳的記錄操作時出錯。
現舉例說明:科目1101有兩個子帳1101-001,1101-002,在ac_init中就會有1101-001和1101-002的記錄,1101-001在前。當1101-001過帳後,會自動用insert新增其上層總帳科目1101的記錄,所以當1101-002在過帳時,就會用update更新1101的數據了。這會出問題嗎?
由於本人是初學乍練,其中會有很多錯誤之處,請不吝賜教。
其中(@ls_ParentCode存儲的就是上層總帳的科目編號, @ls_AcctCode是當前操作的科目編號,acperamt的主鍵是acct_code,period)

以下就是這個存儲過程:
CREATE PROCEDURE dbo.msp_StartAc
( @ti_Return Integer = 99 Output,
@ts_AcctCode Varchar(10) = '' Output
)
AS

Declare @ld_SDAmt Decimal(18,2), @ld_SCAmt Decimal(18,2), @ld_ADAmt Decimal(18,2), @ld_ACAmt Decimal(18,2)
Set @ld_SDAmt = 0
Set @ld_SCAmt = 0
Set @ld_ADAmt = 0
Set @ld_ACAmt = 0

Select @ld_SDAmt = Sum(Open_CDAmt), @ld_SCAmt = Sum(Open_CBAmt),
@ld_ADAmt = Sum(Accu_DbAmt), @ld_ACAmt = Sum(Accu_CBAmt)
From Ac_Init
If @ld_SDAmt <> @ld_SCAmt Or @ld_ADAmt <> @ld_ACAmt
Begin
Set @ti_Return = 1
Return
End

Declare @ld_OpenDate DateTime,@li_StartMonth Integer,@li_Year Integer, @ls_Period Varchar(6)
Declare @ls_AccuPeriod Varchar(6)

Select @ld_OpenDate = Open_Date,@li_StartMonth = StartMonth From Ac_Sys Where Recno = 1

If Month(@ld_OpenDate) >= @li_StartMonth Set @li_Year = Year(@ld_OpenDate)
Else Set @li_Year = Year(@ld_OpenDate) - 1

Set @ls_Period = Str(@li_Year, 4) + '00'

If Month(@ld_OpenDate) >= @li_StartMonth Set @ls_AccuPeriod = Str(@li_Year, 4) + Right('0' + Rtrim(Ltrim(Str(Month(@ld_OpenDate) - @li_StartMonth + 1, 2))), 2)
Else Set @ls_AccuPeriod = Str(@li_Year, 4) + Right('0' + Ltrim(Rtrim(Str(Month(@ld_OpenDate) - @li_StartMonth + 13, 2))), 2)

Delete From Acperamt Where Period <= @ls_AccuPeriod
If @@Error <> 0 Return

Declare @ld_SDBAmt Decimal(18, 2), @ld_SCBAmt Decimal(18, 2), @ld_ADBAmt Decimal(18, 2), @ld_ACBAmt Decimal(18, 2)
Declare @ls_AcctCode Varchar(10), @li_Detail Int, @ls_ParentCode Varchar(10)
Declare @li_FetchStatus Int

Declare lcur_Acinit Cursor For
Select Acct_Code, Open_CAmt, Open_CBAmt, Open_DAmt, Open_CDAmt, Accu_CAmt, Accu_CBAmt, Accu_Damt,
Accu_DBAmt From Ac_Init
Open lcur_Acinit

Fetch Next From lcur_Acinit Into @ls_AcctCode, @ld_SCAmt, @ld_SCBAmt, @ld_SDAmt, @ld_SDBAmt, @ld_ACAmt,
@ld_ACBAmt, @ld_ADAmt, @ld_ADBAmt
Set @li_FetchStatus = @@Fetch_Status

While @li_FetchStatus = 0
Begin
Select @li_Detail = Detail, @ls_ParentCode = ParentCode From Account Where Acct_Code = @ls_AcctCode
If @@RowCount = 0
Begin
Set @ts_AcctCode = @ls_AcctCode
Set @ti_Return = 2
Break
End
If @li_Detail <> 1
Begin
Set @ts_AcctCode = @ls_AcctCode
Set @ti_Return = 3
Break
End

Insert Into Acperamt (Acct_Code, Period, dr_amt, cr_amt, b_dr_amt, b_cr_amt)
Values (@ls_AcctCode, @ls_Period, @ld_SDAmt, @ld_SCAmt, @ld_SDBAmt, @ld_SCBAmt)
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End

Insert Into Acperamt (Acct_Code, Period, dr_amt, cr_amt, b_dr_amt, b_cr_amt)
Values (@ls_AcctCode, @ls_AccuPeriod ,@ld_ADAmt,@ld_ACAmt,@ld_ADBAmt,@ld_ACBAmt)
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End

/******** While Len(Ltrim(@ls_ParentCode)) > 0
Begin
Set @ls_AcctCode = @ls_ParentCode
Set @ls_ParentCode = ''
Select @ls_ParentCode = ParentCode From Account Where Acct_Code = @ls_AcctCode

Select * From Acperamt Where Acct_Code = @ls_AcctCode And Period = @ls_Period
If @@RowCount = 0
Begin
Insert Into Acperamt (Acct_Code, Period, dr_amt, cr_amt, b_dr_amt, b_cr_amt)
Values (@ls_AcctCode, @ls_Period, @ld_SDAmt, @ld_SCAmt, @ld_SDBAmt, @ld_SCBAmt)
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End
End
Else
Begin
Update Acperamt Set Dr_Amt = Dr_Amt + @ld_SDAmt, Cr_Amt = Cr_Amt + @ld_SCAmt,
b_Dr_Amt = b_dr_Amt + @ld_SDBAmt, b_cr_amt = b_cr_amt + @ld_SCBAmt
Where Acct_Code = @ls_AcctCode And Period = @ls_Period
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End
End

Select * From Acperamt Where Acct_Code = @ls_AcctCode And Period = @ls_AccuPeriod
If @@RowCount = 0
Begin
Insert Into Acperamt (Acct_Code, Period, dr_amt, cr_amt, b_dr_amt, b_cr_amt)
Values (@ls_AcctCode, @ls_AccuPeriod, @ld_ADAmt, @ld_ACAmt, @ld_ADBAmt, @ld_ACBAmt)
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End
End
Else
Begin
Update Acperamt Set Dr_Amt = Dr_Amt + @ld_ADAmt, Cr_Amt = Cr_Amt + @ld_ACAmt,
b_Dr_Amt = b_dr_Amt + @ld_ADBAmt, b_cr_amt = b_cr_amt + @ld_ACBAmt
Where Acct_Code = @ls_AcctCode And Period = @ls_AccuPeriod
If @@Error <> 0
Begin
Set @ti_Return = 98
Break
End
End
End

If @ti_Return = 98 Break
****************************/

Fetch Next From lcur_Acinit Into @ls_AcctCode, @ld_SCAmt, @ld_SCBAmt, @ld_SDAmt, @ld_SDBAmt,
@ld_ACAmt, @ld_ACBAmt, @ld_ADAmt, @ld_ADBAmt
Set @li_FetchStatus = @@Fetch_Status
End

Close lcur_Acinit
Deallocate lcur_Acinit

If @ti_Return = 2 Or @ti_Return = 3 Or @ti_Return = 98 Return

Update Ac_Sys Set Started = 1, Curr_Year = @li_Year Where Recno = 1
If @@Rowcount = 0 Return

Set @ti_Return = 0

Return
GO
...全文
34 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
8992026 2003-08-21
  • 打赏
  • 举报
回复
太长
等眼睛好的gg吧

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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