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.