Abstract
Wenn an einer Schnittstelle zwischen zwei Systemen Daten ausgetauscht werden, sollte diese Datenübertragung überwacht werden:
- Stellen Sie sicher, dass die Daten in der richtigen Form übertragen werden
- Halten Sie fest, wie lange die Datenübertragung braucht
Das folgende Template einer Subroutine prüft dies von der aufrufenden / empfangenden Seite aus. Für einen Datenbankaufruf werden die Spaltenüberschriften auf Übereinstimmung mit den vorgegebenen Werten geprüft. Dies verhindert unbeabsichtigte Spaltenänderungen der Datenbankausgabe. Zusätzlich wird die Laufzeit der Datenbankabfrage im Ablaufprotokoll (Log) festgehalten. Die Genauigkeit ist lediglich auf Sekunden, aber damit lassen sich leicht größere Laufzeitunterschiede im Zeitablauf feststellen.
Das Template soll lediglich als Grundgerüst für eine Schnittstellenüberwachung mit VBA dienen.
Appendix – Call_SQLQuery Programmcode
Dieses Template benötigt (ruft auf) die Logging Module modLog und clsLog sowie das Modul (externer Link!) LibFileTools.
Bitte den Haftungsausschluss im Impressum beachten.
Option Explicit
Public q As clsQueries
Sub Call_SQLQuery(sDatabase As String, sSQL As String, _
ws As Worksheet, sDestination As String, vSQLHeader As Variant, _
Optional var1 As String, Optional val1 As Variant, _
Optional var2 As String, Optional val2 As Variant, _
Optional var3 As String, Optional val3 As Variant, _
Optional var4 As String, Optional val4 As Variant, _
Optional var5 As String, Optional val5 As Variant, _
Optional var6 As String, Optional val6 As Variant, _
Optional var7 As String, Optional val7 As Variant, _
Optional var8 As String, Optional val8 As Variant, _
Optional var9 As String, Optional val9 As Variant, _
Optional var10 As String, Optional val10 As Variant, _
Optional bNoHeaders As Boolean = True)
'Source (EN): https://www.sulprobil.de/interface_check_en/
'Source (DE): https://www.berndplumhoff.de/schnittstellen_prüfung_de/
'(C) (P) by Bernd Plumhoff 05-Sep-2016 PB V0.1
Dim dtStamp As Date
Dim i As Long
Dim lHeaderColStart As Long
Dim lHeaderRowStart As Long
Dim sPath As String
Dim v As Variant
Dim Logger As clsLog
Set Logger = New clsLog
Logger.Name = "Call_clsQueries"
Logger.LogLevel = g_log_params.log_level
sPath = GetLocalPath(ThisWorkbook.path)
If sPath = "" Then sPath = ThisWorkbook.path
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
Application.StatusBar = "Running " & sSQL & ", storing data in sheet " & _
ws.Name & ", cell " & sDestination
lHeaderRowStart = ws.Range(sDestination).Row
lHeaderColStart = ws.Range(sDestination).Column
If UBound(vSQLHeader) = 0 Then
ws.Range(ws.Cells(lHeaderRowStart, lHeaderColStart), _
ws.Cells(1048576, lHeaderColStart)).ClearContents
Else
ws.Range(ws.Cells(lHeaderRowStart, lHeaderColStart), _
ws.Cells(1048576, lHeaderColStart + UBound(vSQLHeader) _
- LBound(vSQLHeader) - 1)).ClearContents
End If
dtStamp = Now
Set q = New SQLQuery
Call q.QueryExport(ws.Range(sDestination), _
sDatabase & ";" & sPath & "SQL\" & sSQL, _
var1, val1, var2, val2, var3, val3, var4, val4, var5, val5, _
var6, val6, var7, val7, var8, val8, var9, val9, var10, val10, _
NoHeaders:=bNoHeaders, CloseRst:=True)
If ws.Range(sDestination) = "" Then
Logger.fatal sSQL & " failed"
Exit Sub
Else
dtStamp = Now - dtStamp
Logger.info sSQL & " ran " & Format(dtStamp, "n:ss") & " [m:ss]"
End If
If Not bNoHeaders Then
i = 1
For Each v In vSQLHeader
If ws.Cells(lHeaderRowStart, lHeaderColStart + i - 1) <> v Then
Logger.fatal "Sheet " & ws.Name & ": '" & v & "' expected in column " & _
i & " of row " & lHeaderRowStart & ". Abort"
'Now get main dialogue window into foreground again
With ThisWorkbook.Windows(1)
.Activate
If .WindowState = xlMinimized Then .WindowState = xlNormal ' or xlMaximized
End With
AppActivate Application.Caption
Call MsgBox("Sheet " & ws.Name & ": '" & v & "' expected in column " & i _
& " of row " & lHeaderRowStart & ". Abort", vbOKOnly, "Error")
End
End If
i = i + 1
Next v
End If
ws.Columns.EntireColumn.AutoFit
End Sub
Die Subroutine lässt sich nun zum Beispiel aufrufen mit:
Call Call_SQLQuery("MyDatabase", "Beispiel.sql", _
Worksheets(2), "A1", _
Array("Spaltentitel 1", "Spaltentitel 2", "Spaltentitel 3", ""), _
"Parameter_1", "Zeichenkettenwert für Parameter 1", _
"Parameter_2", dDoubleVariable_für_Parameter_2)
Bei diesem Aufruf wird die Datenbankausgabe in drei Spalten erwartet. Die Subroutine löscht die korrekte Anzahl von Spalten ab der oberen linken Ausgabenecke ws.Range(sDestination) bis zum unteren Tabellenblattende. Das Ende der Spaltenüberschriften wird mit dem Leerstring "" überprüft.
Hinweis: Eine umfassende Dokumentation meiner Excel Implementierungen finden Sie in Excel VBA Eine Sammlung.