|
|
|
|
|
Attribute VB_Name = "MVWTrendConvert"
|
|
|
|
|
|
Option Explicit
|
|
|
|
|
|
|
|
|
|
|
|
'Modul mit Hilfsfunktionen f<>r Trendkonvertierung
|
|
|
|
|
|
'<27> 2002, INOSOFT GmbH
|
|
|
|
|
|
'Version 4.05.000
|
|
|
|
|
|
|
|
|
|
|
|
'Methoden:
|
|
|
|
|
|
'- ArchiveConvert Konvertiert ein Archiv oder eine Archivdatei in eine
|
|
|
|
|
|
' CSV-Datei (Textdatei) oder MSAccess2000-Datenbank
|
|
|
|
|
|
|
|
|
|
|
|
'Abh<62>ngigkeiten/zus<75>tzliche Dateien:
|
|
|
|
|
|
' - Verweise
|
|
|
|
|
|
' - DAO Microsoft DAO 3.6 Object Library (DAO360.dll)
|
|
|
|
|
|
' - Scripting Microsoft Scripting Runtime (scrrun.dll)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Public Enum ETrendConvertFormat
|
|
|
|
|
|
tcfCSV
|
|
|
|
|
|
tcfMDB
|
|
|
|
|
|
End Enum
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Public Function ArchiveConvert(ByVal Archive As String, _
|
|
|
|
|
|
ByVal SourceFilename As String, _
|
|
|
|
|
|
ByVal StartTime As Date, ByVal EndTime As Date, _
|
|
|
|
|
|
ByVal DestFilename As String, _
|
|
|
|
|
|
ByVal Format As ETrendConvertFormat _
|
|
|
|
|
|
) As Boolean
|
|
|
|
|
|
'Konvertiert ein Archiv oder eine Archivdatei in eine
|
|
|
|
|
|
'CSV-Datei (Textdatei) oder MSAccess2000-Datenbank.
|
|
|
|
|
|
'Eingabe:
|
|
|
|
|
|
' Archive: Name des Archivs (== Parameter "Name" der Archivdefinition)
|
|
|
|
|
|
' SourceFileName: Pfad und Name der Archivdatei oder "", wenn StartTime und
|
|
|
|
|
|
' EndTime angegeben werden.
|
|
|
|
|
|
' Achtung: Angabe eines falschen Archivnamens oder einer
|
|
|
|
|
|
' falschen Archivdatei f<>hrt zu Fehlern und ggf. zum Absturz.
|
|
|
|
|
|
' StartTime/EndTime: Start- und Endzeitpunkt der zu konvertierenden Trenddaten.
|
|
|
|
|
|
' Bei <20>bergabe von 0 wird das gesamte Archiv ausgelesen.
|
|
|
|
|
|
' DestFileName: Pfad, Name inkl. Endung der Zieldatei in der die Daten
|
|
|
|
|
|
' gespeichert werden sollen.
|
|
|
|
|
|
' Achtung: Dateien mit gleichem Namen werden <20>berschrieben!
|
|
|
|
|
|
' Falls DestFilename in einem externen Programm ge<67>ffnet ist,
|
|
|
|
|
|
' kann dies unter Umst<73>nden zu Problemen f<>hren.
|
|
|
|
|
|
' Format: Format von DestFilename: entweder "mdb" oder "csv"
|
|
|
|
|
|
'Ausgabe:
|
|
|
|
|
|
' ArchiveConvert: True=erfolgreich konvertiert, False=Fehler
|
|
|
|
|
|
|
|
|
|
|
|
Const NewSession = -2147483648# 'Konstante f<>r Status-Abfrage
|
|
|
|
|
|
|
|
|
|
|
|
Dim cntRet As Long 'Long f<>r Status-Abfrage
|
|
|
|
|
|
Dim i As Long 'Long zum Z<>hlen
|
|
|
|
|
|
Dim p() As Long 'Long-Array, das als Pointer benutzt wird
|
|
|
|
|
|
Dim xValues() As Variant 'Variant-Array zur Aufnahme der Aufzeichnungszeiten
|
|
|
|
|
|
Dim yValues() As Variant 'Variant-Array zur Aufnahme der Trenddaten
|
|
|
|
|
|
Dim sState() As Variant 'Variant-Array zur Aufnahme des Status
|
|
|
|
|
|
Dim vTimeNow As Date 'Variant f<>r die Zeit der aktuellen Trendaufzeichnung
|
|
|
|
|
|
Dim vTimeEnd As Date 'Variant f<>r die Zeit der letzten Trendaufzeichnung
|
|
|
|
|
|
Dim vTrends As Variant 'Variant zur Aufnahme der vorhandenen Trends
|
|
|
|
|
|
Dim tBrowser As VWSTrendBrowser 'TrendBrowser-Objekt
|
|
|
|
|
|
Dim tData As VWSTrendData 'TrendData-Objekt
|
|
|
|
|
|
Dim sNow As String 'Abfragestring
|
|
|
|
|
|
Dim sEnd As String 'Abfragestring
|
|
|
|
|
|
|
|
|
|
|
|
KillFile DestFilename 'Zieldatei l<>schen
|
|
|
|
|
|
|
|
|
|
|
|
On Error GoTo errArchiveConvert
|
|
|
|
|
|
|
|
|
|
|
|
'Neues TrendBrowser- und TrendData-Objekt erzeugen
|
|
|
|
|
|
Set tBrowser = New VWSTrendBrowser
|
|
|
|
|
|
Set tData = New VWSTrendData
|
|
|
|
|
|
|
|
|
|
|
|
'F<>llen von vTrends
|
|
|
|
|
|
tBrowser.EnumTrends Archive, vTrends
|
|
|
|
|
|
|
|
|
|
|
|
'Redimensioniere die Arrays mit der Anzahl von vTrends
|
|
|
|
|
|
ReDim p(UBound(vTrends))
|
|
|
|
|
|
ReDim xValues(UBound(vTrends))
|
|
|
|
|
|
ReDim yValues(UBound(vTrends))
|
|
|
|
|
|
ReDim sState(UBound(vTrends))
|
|
|
|
|
|
|
|
|
|
|
|
'Ermittle Zeit der ersten und der letzten Trendaufzeichnung der Trend-Datei
|
|
|
|
|
|
If StartTime = #1/1/1900# Then
|
|
|
|
|
|
tBrowser.DataFileInfo Archive, SourceFilename, StartTime, EndTime
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
'Welcher Dateityp wurde gew<65>hlt
|
|
|
|
|
|
Select Case Format
|
|
|
|
|
|
|
|
|
|
|
|
Case tcfCSV 'CSV-Datei wurde gew<65>hlt
|
|
|
|
|
|
|
|
|
|
|
|
Dim fso As FileSystemObject 'FileSystemObjekt
|
|
|
|
|
|
Dim ts As TextStream 'TextStream f<>r fso
|
|
|
|
|
|
Dim s As String 'String f<>r ts
|
|
|
|
|
|
|
|
|
|
|
|
'Neues FileSystem-Objekt erzeugen und Anlegen einer leeren "CSV-Datei"
|
|
|
|
|
|
Set fso = New FileSystemObject
|
|
|
|
|
|
Set ts = fso.CreateTextFile(DestFilename, True)
|
|
|
|
|
|
|
|
|
|
|
|
'Erzeugen einer Zeile mit "Time" und den Namen der Trends
|
|
|
|
|
|
'aus vTrends; F<>llen der Arrays xValues,yValues und sState
|
|
|
|
|
|
s = "Time"
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
s = s & ";" & vTrends(i)
|
|
|
|
|
|
s = Replace(s, ".", "_")
|
|
|
|
|
|
tData.GetTrendData Archive, SourceFilename, vTrends(i), StartTime, EndTime, xValues(i), yValues(i), sState(i)
|
|
|
|
|
|
Next i
|
|
|
|
|
|
ts.WriteLine s
|
|
|
|
|
|
|
|
|
|
|
|
'Ermitteln der Zeit der letzten Trendaufzeichnung
|
|
|
|
|
|
'in der gew<65>hlten Trenddatei
|
|
|
|
|
|
vTimeEnd = #1/1/1900#
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If DateDiff("s", xValues(i)(UBound(xValues(i))), vTimeEnd) < 0 Then
|
|
|
|
|
|
vTimeEnd = xValues(i)(UBound(xValues(i)))
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
|
|
|
|
|
|
'Schleife die l<>uft, bis die letzte Trendaufzeichnung der
|
|
|
|
|
|
'in der gew<65>hlten Datei bearbeitet wurde
|
|
|
|
|
|
Do
|
|
|
|
|
|
'Durchlaufen aller momentan ausgew<65>hlten
|
|
|
|
|
|
'Zeiten und ermitteln der niedrigsten Zeit
|
|
|
|
|
|
vTimeNow = Now
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If p(i) <= UBound(xValues(i)) Then
|
|
|
|
|
|
If DateDiff("s", xValues(i)(p(i)), vTimeNow) > 0 Then
|
|
|
|
|
|
vTimeNow = xValues(i)(p(i))
|
|
|
|
|
|
cntRet = i
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
|
|
|
|
|
|
'Leere Zeile in die "CSV-Datei" einf<6E>gen,
|
|
|
|
|
|
'falls der Status der Trendaufzeichnung eine
|
|
|
|
|
|
'neue Session anzeigt
|
|
|
|
|
|
If sState(cntRet)(p(cntRet)) = NewSession Then
|
|
|
|
|
|
ts.WriteLine ""
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
'Durchlaufen aller momentan ausgew<65>hlten Zeiten;
|
|
|
|
|
|
'falls das Array-Ende <20>berschritten
|
|
|
|
|
|
'wurde wird s nur um das Trennzeichen erg<72>nzt;
|
|
|
|
|
|
'ansonsten wird bei <20>bereinstimmung der momentan
|
|
|
|
|
|
'ausgew<65>hlten Zeit mit vTimeNow der String s
|
|
|
|
|
|
'um den zur momentan ausgew<65>hlten Zeit passenden
|
|
|
|
|
|
'Wert erg<72>nzt und der zum Trend geh<65>hrende Pointer
|
|
|
|
|
|
'hochgez<65>hlt
|
|
|
|
|
|
s = vTimeNow
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If p(i) <= UBound(xValues(i)) Then
|
|
|
|
|
|
If xValues(i)(p(i)) = vTimeNow Then
|
|
|
|
|
|
s = s & ";" & yValues(i)(p(i))
|
|
|
|
|
|
p(i) = p(i) + 1
|
|
|
|
|
|
Else
|
|
|
|
|
|
s = s & ";" & yValues(i)(p(i))
|
|
|
|
|
|
End If
|
|
|
|
|
|
Else
|
|
|
|
|
|
s = s & ";"
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
'Schreiben der Zeile in die "CSV-Datei"
|
|
|
|
|
|
ts.WriteLine s
|
|
|
|
|
|
sNow = vTimeNow
|
|
|
|
|
|
sEnd = vTimeEnd
|
|
|
|
|
|
Loop Until sNow = sEnd
|
|
|
|
|
|
|
|
|
|
|
|
'Schlie<69>en des TextStreams
|
|
|
|
|
|
ts.Close
|
|
|
|
|
|
|
|
|
|
|
|
Case tcfMDB
|
|
|
|
|
|
|
|
|
|
|
|
Dim dbs As DAO.Database 'Datenbank-Objekt
|
|
|
|
|
|
Dim tdf As DAO.TableDef 'Tabellen-Objekt
|
|
|
|
|
|
Dim fld As DAO.Field 'Feld-Objekt
|
|
|
|
|
|
Dim rst As DAO.Recordset 'Recordset-Objekt
|
|
|
|
|
|
|
|
|
|
|
|
'Anlegen und <20>ffnen der Datenbank;
|
|
|
|
|
|
Set dbs = CreateDatabase(DestFilename, dbLangGeneral)
|
|
|
|
|
|
Set dbs = OpenDatabase(DestFilename)
|
|
|
|
|
|
'Erzeugen der Tabelle "Trenddaten";
|
|
|
|
|
|
Set tdf = dbs.CreateTableDef("Trenddaten")
|
|
|
|
|
|
'Erzeugen des Feldes "Time" und hinzuf<75>gen des Feldes
|
|
|
|
|
|
'zur Tabelle "Trenddaten"
|
|
|
|
|
|
Set fld = tdf.CreateField("Time", dbDate)
|
|
|
|
|
|
tdf.Fields.Append fld
|
|
|
|
|
|
|
|
|
|
|
|
'Erzeugen von Feldern mit Namen der Trends aus vTrends
|
|
|
|
|
|
'und hinzuf<75>gen der Felder zur Tabelle "Trenddaten"
|
|
|
|
|
|
'F<>llen der Arrays xValues,yValues und sState
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
tData.GetTrendData Archive, SourceFilename, vTrends(i), StartTime, EndTime, xValues(i), yValues(i), sState(i)
|
|
|
|
|
|
s = vTrends(i)
|
|
|
|
|
|
s = Replace(s, ".", "_")
|
|
|
|
|
|
Set fld = tdf.CreateField(s, dbText)
|
|
|
|
|
|
fld.AllowZeroLength = True
|
|
|
|
|
|
tdf.Fields.Append fld
|
|
|
|
|
|
Next i
|
|
|
|
|
|
|
|
|
|
|
|
'Tabelle "Trenddaten" zur Datenbank hinzuf<75>gen
|
|
|
|
|
|
dbs.TableDefs.Append tdf
|
|
|
|
|
|
|
|
|
|
|
|
'Ermitteln der Zeit der letzten Trendaufzeichnung
|
|
|
|
|
|
'in der gew<65>hlten Trenddatei
|
|
|
|
|
|
vTimeEnd = #1/1/1900#
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If DateDiff("s", xValues(i)(UBound(xValues(i))), vTimeEnd) < 0 Then
|
|
|
|
|
|
vTimeEnd = xValues(i)(UBound(xValues(i)))
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
|
|
|
|
|
|
'neues Recordset-Objekt erzeugen
|
|
|
|
|
|
Set rst = tdf.OpenRecordset
|
|
|
|
|
|
|
|
|
|
|
|
'Schleife die l<>uft, bis die letzte Trendaufzeichnung der
|
|
|
|
|
|
'in der gew<65>hlten Datei bearbeitet wurde
|
|
|
|
|
|
Do
|
|
|
|
|
|
'Durchlaufen aller momentan ausgew<65>hlten
|
|
|
|
|
|
'Zeiten und ermitteln der niedrigsten Zeit
|
|
|
|
|
|
vTimeNow = Now
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If p(i) <= UBound(xValues(i)) Then
|
|
|
|
|
|
If DateDiff("s", xValues(i)(p(i)), vTimeNow) > 0 Then
|
|
|
|
|
|
vTimeNow = xValues(i)(p(i))
|
|
|
|
|
|
cntRet = i
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
|
|
|
|
|
|
'Neuen Datensatz der Tabelle hinzuf<75>gen
|
|
|
|
|
|
rst.AddNew
|
|
|
|
|
|
|
|
|
|
|
|
'Leeren Datensatz in die Tabelle einf<6E>gen,
|
|
|
|
|
|
'falls der Status der Trendaufzeichnung eine
|
|
|
|
|
|
'neue Session anzeigt
|
|
|
|
|
|
If sState(cntRet)(p(cntRet)) = NewSession Then
|
|
|
|
|
|
rst.Update
|
|
|
|
|
|
rst.AddNew
|
|
|
|
|
|
rst.Fields("Time").Value = vTimeNow
|
|
|
|
|
|
Else
|
|
|
|
|
|
rst.Fields("Time").Value = vTimeNow
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
'Durchlaufen aller momentan ausgew<65>hlten Zeiten;
|
|
|
|
|
|
'falls das Array-Ende <20>berschritten
|
|
|
|
|
|
'wurde wird das Feld leergelassen
|
|
|
|
|
|
'ansonsten wird bei <20>bereinstimmung der momentan
|
|
|
|
|
|
'ausgew<65>hlten Zeit mit vTimeNow das Feld
|
|
|
|
|
|
'mit den zur momentan ausgew<65>hlten Zeit passenden
|
|
|
|
|
|
'Wert beschrieben und der zum Trend geh<65>hrende Pointer
|
|
|
|
|
|
'hochgez<65>hlt
|
|
|
|
|
|
For i = 0 To UBound(vTrends)
|
|
|
|
|
|
If Not IsEmpty(xValues(i)) Then
|
|
|
|
|
|
If p(i) <= UBound(xValues(i)) Then
|
|
|
|
|
|
If xValues(i)(p(i)) = vTimeNow Then
|
|
|
|
|
|
rst.Fields(vTrends(i)).Value = yValues(i)(p(i))
|
|
|
|
|
|
p(i) = p(i) + 1
|
|
|
|
|
|
Else
|
|
|
|
|
|
rst.Fields(vTrends(i)).Value = yValues(i)(p(i))
|
|
|
|
|
|
End If
|
|
|
|
|
|
Else
|
|
|
|
|
|
rst.Fields(vTrends(i)).Value = ""
|
|
|
|
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
|
|
Next i
|
|
|
|
|
|
rst.Update
|
|
|
|
|
|
sNow = vTimeNow
|
|
|
|
|
|
sEnd = vTimeEnd
|
|
|
|
|
|
Loop Until sNow = sEnd
|
|
|
|
|
|
|
|
|
|
|
|
'Datenbank wird geschlossen
|
|
|
|
|
|
dbs.Close
|
|
|
|
|
|
|
|
|
|
|
|
End Select
|
|
|
|
|
|
|
|
|
|
|
|
ArchiveConvert = True
|
|
|
|
|
|
Exit Function
|
|
|
|
|
|
|
|
|
|
|
|
errArchiveConvert:
|
|
|
|
|
|
ArchiveConvert = False
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Private Sub KillFile(FileName As String)
|
|
|
|
|
|
On Error Resume Next
|
|
|
|
|
|
Kill FileName
|
|
|
|
|
|
End Sub
|