Navigation

Gespeicherte Prozeduren und VBA

Wie kann man nun mit VBA und gespeichtere Prozeduren arbeiten?
Zuerst sollte man sich eine gespeicherte Prozedur erstellen, die das macht, was sie soll ;-)
Angenommen ihr habt viele unterschiedliche Datentypen, die ihr immer wieder auf dem Server speichern wollt.
Dafür gäbe es 2 Möglichkeiten. Entweder mit einem Array oder mit einer INSERT INTO-Anweisung:

Array:

Gespeichtere Prozedur (Beispiel):

CREATE PROCEDURE dbo.ins_NewValue
  (@Var1 As varChar(50,
   @Var2 As int,
   @Var3 As Char(50))
AS
INSERT INTO Tabelle (Feld1, Feld2, Feld3)
VALUES (@Var1, @Var2, @Var3)
GO

Funktion:

Public Function ExeStP(StP As String, _
	Optional Genauigkeit As Integer, Optional Nachkomma As Integer) As Variant
Dim objCmd  As ADODB.Command
Dim StPPara As ADODB.Parameter

Set objCmd = New ADODB.Command

With objCmd
    .ActiveConnection = CurrentProject.Connection
    .CommandType = adCmdStoredProc
    For i = LBound(ParName) To UBound(ParName)
        Set StPPara = New ADODB.Parameter
        With StPPara
            Select Case ParType(i)

                '//Char
                Case Is = 129
                    .Name = ParName(i)
                    .Type = ParType(i)
                    .Direction = ParFunk(i)
                    .Size = ParSize(i)
                    .Value = Parameter(i)

                '//Decimalwerte
                Case Is = 14
                    .Name = ParName(i)
                    .Type = ParType(i)
                    .Precision = Genauigkeit
                    .NumericScale = Nachkomma
                    .Direction = ParFunk(i)
                    .Value = Parameter(i)

                '//Standard
                Case Else
                    .Name = ParName(i)
                    .Type = ParType(i)
                    .Direction = ParFunk(i)
                    .Value = Parameter(i)

            End Select
        End With
        .Parameters.Append StPPara
        Set StPPara = Nothing
    Next i
    .CommandText = StP
    .Execute
End With
Set objCmd = Nothing
End Function

Dazu müsste man dann noch für den Namen, den Typen und den Wert jeweils ein Array bilden und könnte dann alle Werte aufeinmal übergeben.
Die Funktion würde diese auswerten und an den Server übergeben, welcher dann die Funktion auswertet.

INSERT INTO:

Beim INSERT INTO würde man sich den SQL-String in VBA zusammensetzen und ihn dann an die gespeicherte Prozedur übergeben:

CREATE PROCEDURE dbo.execSQL
  @strSQL As VarChar(200)
AS
EXEC (@strSQL)
GO

Und die VBA-Anweisung sähe so aus:

Dim objCmd  As ADODB.Command
Dim strSQL As String

strSQL = "INSERT INTO Tabelle (Feld1, Feld2, Feld3) "
strSQL = strSQL & "VALUES ('" & MeFeld1 & "'," & Me!Feld2 & "," & Me!Feld3 & ")"

Set objCmd = New ADODB.Command

With objCmd
    .ActiveConnection = CurrentProject.Connection
    .CommandType = adCmdStoredProc
    .Parameters.Append .CreateParameter("@strSQL",adVarChar,adParamInput, 200,strSQL)
    .CommandText = insert_NewTester
    .Execute
End With
Set objCmd = Nothing

Wenn man nun eine gespeicherte Prozedur als Datenherkunft für ein Formular o.ä. verwendet, kann man auch mit dem Eingabeparameter arbeiten.
Der Eingabeparameter ist in den Eigenschaften des Formulares zu finden. Dort kann man dann zB folgende Syntax verweden:

@ChargenID int=[Berichte]![rptAuswertung]![ChargenID]

Oder auch

@ChargenID int=globaleFunktion()