2017-03-03 68 views
0

我一直在努力在不同场景中传递存储过程。目前,我正尝试通过do-while循环内部的传递查询来调用SP。我有一个名为usp_MovePending的SP和一个传递查询qryPending。我有一个带do-while循环的代码,在这个循环中我必须调用SP。如何在vba访问中的do-while循环内调用存储过程?

Public Sub Import() 

On Error Resume Next 

Dim DB As Database 
Dim rs As Recordset 
Dim UserStr As String 
Dim ROG As Date 
Dim qdf As QueryDef 
Dim sql As String 

UserStr = sqlfixup(CurrentUser()) 
Set DB = CodeDb 
Set rs = DB.OpenRecordset("select * from tblQty where materialid <> 0") 
DoCmd.Hourglass True 
Set qdf = DB.CreateQueryDef("") 
qdf.Connect = SQLConnectString 
qdf.ReturnsRecords = True 

Do While rs.EOF = False 
    With MatManagement.Transactions 
     .BeginTransaction 
     .TransactionClassID = 1 
     .MaterialID = rs!MaterialID 
     .TransactionCreateUser = CurrentUser() 
     .TransactionDate = Date 
     .CommitTransaction 

     If .Failure <> True Or .TransactionID <> 0 Then 
      CodeDb.Execute "update tblMMTransactions set transNote = '" & sqlfixup(rs.Fields("note")) & "' where transactionid = " & .TransactionID, dbSeeChanges 
     End If 

     With CurrentDb.QueryDefs("qryPending") 
      .sql = "exec usp_MovePending @materialid=" & rs!MaterialID & ",@SysUser=" & " '" & UserStr & "'" & "," & " @ROG=getdate()" & ",@force= 1" 
      .Execute 
     End With 

    End With   
    rs.MoveNext 
Loop 
rs.Close 
qdf.Close 
DB.Close 
DoCmd.Hourglass False  
End Sub 

在上面的代码中,我已经加入其中,如下所示的旧代码的几行代码:

With CurrentDb.QueryDefs("qryPending") 
      .sql = "exec usp_MovePending @materialid=" & rs!MaterialID & ",@SysUser=" & " '" & UserStr & "'" & "," & " @ROG=getdate()" & ",@force= 1" 
      .Execute 
End With 

当调试我的代码,它检索SP的参数到直通查询。但是,我认为我的代码不是调用SP(当我自己测试SP时,它工作得很好)。我认为SQL正在等待一些返回值,但Access并没有返回任何东西。我尝试了不同的方法,但是在研究许多开发人员时推荐使用这种方法。任何人都可以指出我错过了什么吗?

回答

0

您是否尝试过在VB中引用SP而不是SQL?

With CurrentDb.QueryDefs("qryPending") 
      .sql = "exec " & usp_MovePending & " @materialid=" & rs!MaterialID & ",@SysUser=" & " '" & UserStr & "'" & "," & " @ROG=getdate()" & ",@force= 1" 
      .Execute 
End With 

这会给你什么结果?

SP是SQL可以看到的全局变量吗?你可以在访问查询构建器中轻松地将它调用到字段中吗?或者它只能在程序中看到VB代码?

+0

是的,我曾尝试引用VB中的SP,但是我无法从表单中获取materialID,所以使用这种方法。我不确定你的意思是SP的全球化与否。我的SP在SQL中,所以你可以看到它。 – toofaced

+0

如果将固定值添加到“qryPending”并打开查询,它是否会返回值?如果没有检查参数名称是否与SP定义的相同,Access似乎有点奇怪必须使用SP中定义的相同参数名称。 也尝试使用** dbo.usp_MovePending ** – Minty