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()