Tar*_*ryn 1 sql ms-access vba loops sql-server-2005
我一直在线寻找重写当前VBA/MS Access Sub以在SQL Server 2005中的存储过程中工作的最佳方法.我们不应该使用CURSORS项目,除非我们能够完全解释为什么我们不能这样做的原因另一种方式.
现行代码:
Public Sub updcsh()
Dim tranamt
Dim Acct
Dim acct2
Dim Csh
Dim recSet As Recordset
DAO.DBEngine.SetOption dbMaxLocksPerFile, 100000
Set recSet = CurrentDb.OpenRecordset("FndVios")
recSet.MoveFirst
Do Until recSet.EOF
Acct = recSet![ID]
tranamt = recSet![TAM]
If Acct <> acct2 Then
Csh = recSet![Due]
End If
Csh = Csh+ tranamt
acct2 = Acct
recSet.Edit
recSet![Due] = Csh
recSet.Update
recSet.MoveNext
Loop
End Sub
Run Code Online (Sandbox Code Playgroud)
正在打开的记录集如下:
SELECT ID, EXEC_TM, Due, TAM
FROM FRT
ORDER BY ID, EXEC_DT, EXEC_TM, D_C_CD, SEQ_NBR, TAM DESC
Run Code Online (Sandbox Code Playgroud)
我搜索了SO并找到了这个.我查看了游标和其他方法,如何为存储过程写这个,我无法弄清楚重写这个的正确方法.
任何人都可以提供任何建议吗?我应该使用临时表吗?我以前没有这样做过,我很难理解如何继续.
编辑:
Sample Data
Original:
ID EXEC_TM Due TAM
12345678 12343811 $9250.81 $-6561.91
12345678 12343822 $9250.81 $-4374.63
12345678 15581917 $9250.81 $-4762.76
Final Result:
ID EXEC_TM Due TAM
12345678 12343811 $2688.87 $-6561.91
12345678 12343822 $-1685.76 $-4374.63
12345678 15581917 $-6448.52 $-4762.76
Run Code Online (Sandbox Code Playgroud)
从流程重新设计的角度来看,汤姆的答案更好.下面的代码是您在CURSOR形式上对当前逻辑的重新编写.
我绝不赞同这种方法,但这就是你要求的.您可能需要更正数据类型等才能正常工作.
DECLARE @ID int,
@Exec_TM int,
@Due money,
@TAM money,
@ID2 int = 0,
@Cash money
DECLARE RecSet CURSOR FOR
SELECT ID, EXEC_TM, Due, TAM
FROM FRT
ORDER BY ID, EXEC_DT, EXEC_TM, D_C_CD, SEQ_NBR, TAM DESC
OPEN RecSet
FETCH NEXT FROM RecSet INTO @ID, @Exec_TM, @Due, @TAM
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF @ID <> @ID2 SET @Cash = @Due
SET @Cash = @Cash + @TAM
SET @ID2 = @ID
UPDATE FRT
SET Due = @Cash
WHERE ID = @ID
AND EXEC_TM = @Exec_TM
AND Due = @Due
AND TAM = @TAM
FETCH NEXT FROM RecSet INTO @ID, @Exec_TM, @Due, @TAM
END
CLOSE RecSet
DEALLOCATE RecSet
Run Code Online (Sandbox Code Playgroud)