2016-04-26 45 views
1

我正在將Access應用程序轉換爲Web應用程序,並且無法將此vb/SQL轉換爲視圖。這似乎不是那麼難的問題,但它真的讓我陷入循環。將動態查詢中的邏輯從Access VBA轉換爲SQL Server視圖

Public Function GetProjectNumber(ByVal HeaderID As Long) As String 
    Dim retval As String 
    Dim rst As New ADODB.Recordset 
    Dim tempID As Long 

On Error GoTo Err_Handler 

    rst.Open "SELECT TransferID, ProjectID FROM dbo.tblProject WHERE HeaderID = " & HeaderID 
    If Not (rst.EOF And rst.BOF) Then 
     If IsNull(rst!TransferID) Then 
      retval = rst!ProjectID 
     Else 
      tempID = rst!TransferID 
      If rst.State = adStateOpen Then rst.Close 
      rst.Open "SELECT ProjectID FROM dbo.tblProject WHERE HeaderID = " & tempID 
      If rst.EOF And rst.BOF Then 
       retval = "Transfer from ????" 
      Else 
       retval = "Transfer from " & rst!ProjectID 
      End If 
     End If 
    End If 

If rst.State = adStateOpen Then rst.Close 

Exit_Handler: 
    Set rst = Nothing 
    GetProjectNumber = retval 
    Exit Function 

End Function 

我試着使用嵌套case語句,但情況下不能被應用到返回的每一行。有沒有辦法做到這一點IIF?或者讓這個功能?

+1

使用SQLserver的導入工具將MSAccess數據庫導入SQLserver會不會更容易? – Gerfried

+0

它不是Access數據庫,它是一個訪問SQL前端數據庫的Access前端。我試圖將前端重寫爲一個Web應用程序,但需要在Access中接受任何SQL調用並將它們移動到存儲過程/視圖。 – Alex

+0

無論您需要閱讀有關解決方案,瞭解並開始使用參數化查詢。建立字符串並直接對你的服務器執行它是一個公開邀請bobby表來訪問。 http://bobby-tables.com/ –

回答

3

以下查詢模仿您的代碼爲表中的所有記錄(即爲所有HeaderIDs)。

SELECT P1.HeaderID, 
(CASE 
    WHEN P1.TransferID IS NULL THEN P1.ProjectID 
    WHEN P2.ProjectID IS NULL THEN 'Transfer from ???' 
    ELSE "Transfer from " + P2.ProjectID 
END) AS Returns 
FROM dbo.tblProject P1 
LEFT JOIN dbo.tblProject P2 ON P1.TransferID = P2.HeaderID 

如果你犯了一個SQL服務器的觀點出來,你可以很容易地與特定HeaderID查詢它,就像你在你的VBA子

SELECT Returns FROM the_view WHERE HeaderID='xxxxx' 

做,它應該返回一模一樣結果作爲您的程序

+2

這個答案解決了關鍵問題:編寫**基於集合的**代碼。基於集合的代碼意味着在COLUMNS中思考。在COLUMNS中思考與SQL是一致的。在ROWS中思考讓你與SQL不一致,挫敗了你的工作。如果您可以使用普通SQL來替換VBA記錄集的逐行處理(即使在Access中),那麼您將朝着正確的方向前進。 – Smandoli

+0

現在看到它比逐行處理像vba更有意義。不幸的是,我正在使用20多年來由許多人編寫的代碼,這只是需要翻譯的「主查詢」的一部分,這是14個函數中的一個 – Alex