You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

300 lines
12 KiB
QBasic

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