2016-04-26 7 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 

Iは、ネストされたcaseステートメントを使用しようとしたが、場合によっては、返された各列には適用できません。 IIFでこれを行う方法はありますか?それとも、これを機能させるか?

+1

SQL Serverのインポートツールを使用してMSAccess DBをSQL Serverにインポートする方が簡単ではないでしょうか? – Gerfried

+0

これはAccessデータベースではなく、SQL 2012データベースにアクセスするAccessフロントエンドです。フロントエンドをWebアプリケーションとして書き直そうとしていますが、AccessでSQL呼び出しを行い、ストアドプロシージャ/ビューに移動する必要があります。 – Alex

+0

解決策に関係なく、パラメータ化されたクエリを理解し、使用し始める必要があります。文字列を構築し、それらをサーバーに対して直接実行することは、ボビー・テーブルが訪問するための公開された招待です。 http://bobby-tables.com/ –

答えて

3

次のクエリは、テーブル内のすべてのレコード(つまり、すべてのHeaderID)のコードを模倣します。あなたはそれからSQLサーバーのビューを作成する場合は、あなたのVBAサブ

SELECT Returns FROM the_view WHERE HeaderID='xxxxx' 

で行うよう

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 

は、あなたは、特定のHeaderIDで簡単に問い合わせることができますし、それはまったく同じリターンをすべきあなたの手続きとしての結果

+2

この回答は重大な問題に取り組んでいます:** set-based ** codeを書いてください。集合に基づくコードは列で考えることを意味します。 COLUMNSで考えることはSQLと同じです。 ROWSを考えると、あなたはSQLに惑わされ、あなたの仕事は挫折します。プレーンなSQLを使用してVBAレコードセットの行単位の処理を(Accessの場合でも)置き換えることができれば、正しい方向に進んでいます。 – Smandoli

+0

これを見ると、vbaのように行単位で操作するよりも理にかなっています。残念ながら、私は多くの人が書いた20年以上のコードで作業していますが、これは翻訳される必要がある「マスタークエリ」の一部である14の関数のうちの1つです – Alex

関連する問題