Hallo allerseits
Ich habe bisher in Access einige umfangreiche Projekte erstellt und kann behaupten, dass ich mich in VBA als fortgeschrittenen Progger bezeichnen kann.
Nun habe ich mich aus naheliegenden Gründen entschlossen, den Umstieg zu VB zu wagen.
Es hat zwar einige Tage gedauert aber einen Schnell-Überblick konnte ich mir durch Openbooks und diesem Forum verschaffen.
Als erstes Projekt habe ich natürlich eines gewählt, das ich in Access-VBA schon abgeschlossen hatte.
Die Projekt-Aufgabe:
Mit Mess-Geräten werden an elektrischen Anlagen verschiedene Messungen durchgeführt.
Diese Mess-Ergebnisse werden dann vom Gerät im Computer als Mess-Datei abgelegt.
Anschliessend soll mit der Projekt-Software diese Dateien importiert und ausgewertet werden.
Und so befinden sich mittlerweile ca. 400.000 Mess-Ergebnisse in der Access-Datenbank.
Grob beschrieben ist jede Messung in folgenden Feldern hinterlegt:
Periode, Objekt, Verteiler, Gerät, Mess-Art und ca. 20 Felder mit den Mess-Ergebnissen.
Der Benutzer der Software kann schlussendlich jede Messung betrachten und div.Befunde erstellen.
In Access sah das aus wie in Image1.jpg
In VB zeige ich die Daten in DataGridViews. Und da hatte ich schon beim Füllen der Listen mein erstes Problem.
Mit folgendem Code fülle ich die erste Liste:
(Gleich mal vorweg: Ich weiss, dass meine Benennung von Variablen nicht den üblichen Regeln entspricht...aber das sei mal meine 100. Sorge
Wenn die erste Zeile ins DataGridView geschrieben wird, dann wird diese von VB sofort markiert und natürlich das Ereignis ".CellEnter" ausgelöst.
Bei Schreiben der 2.Zeile wird dieses Ereignis dann nicht mehr ausgeführt...logisch.
Und das will ich nicht. Der Code soll erst alle Zeilen schreiben. Und dann auf die Auswahl des Nutzers warten.
Erst danach soll die nächste Liste auf Grund der Auswahl des Nutzers gefüllt werden. Und so solls dann Liste für Liste weitergehen...bis ich zum einzelnen Mess-Ergebnis gelange.
Die Variable "vListFillInProgress" nutze ich als Notbehelf nur, damit diese Ereignis-Prozedur nichts tut, bis die Liste gefüllt ist.
Und hier gleich die erste Frage: Was mach ich da falsch?
2.Frage
Wie man sieht arbeite ich noch mit dauerndem Direktzugriff auf die Datenbank
Der Test-Versuch alle Daten in DataTable zu speichern und danach zu filtern gelang einwandfrei
aber der ".Fill"-Prozess dauert gegenüber dem Direktzugriff schweinelangsam (ca. 15 Sekunden) und das ist inakzeptabel.
Die Daten je nach Benutzer-Auwahl gefiltert in DataTables zu holen ist sinnlos, weil nach der nächsten Benutzer-Auswahl die Daten neu geholt werden müssen.
1.Auswahl: Nur die Perioden (Group by Periode)
2.Auswahl: Befunde der entsprechenden Periode (Group by Periode, Group by Befund)
3.Auswahl: Objekte der entsprechenden Periode, Befundes......
Also müsste ich für schnellere Anzeige schon alle Daten im Speicher haben um dann mal schnell filtern zu können...Idee nicht schlecht...aber das Füllen von 400.000 Datensätzen (und noch zu übers Netzwerk) dauert zu lange.
Hier der Test-Code zum Füllen der Periode 2012 (wenn ich alle Datensätze holen müsste, dann dauerts ewig):
Da ich mich als Neuling in VB verstehe, ist meine 2.Frage:
Geh ich das falsch an?
Verzeiht mir bitte einen ev. Hausmeister-Programmierstil aber ich bin erst ein paar Tage in diese Liga aufgestiegen und gelobe Besserung!
mfG, Ludwig aka Wickal
Ich habe bisher in Access einige umfangreiche Projekte erstellt und kann behaupten, dass ich mich in VBA als fortgeschrittenen Progger bezeichnen kann.
Nun habe ich mich aus naheliegenden Gründen entschlossen, den Umstieg zu VB zu wagen.
Es hat zwar einige Tage gedauert aber einen Schnell-Überblick konnte ich mir durch Openbooks und diesem Forum verschaffen.
Als erstes Projekt habe ich natürlich eines gewählt, das ich in Access-VBA schon abgeschlossen hatte.
Die Projekt-Aufgabe:
Mit Mess-Geräten werden an elektrischen Anlagen verschiedene Messungen durchgeführt.
Diese Mess-Ergebnisse werden dann vom Gerät im Computer als Mess-Datei abgelegt.
Anschliessend soll mit der Projekt-Software diese Dateien importiert und ausgewertet werden.
Und so befinden sich mittlerweile ca. 400.000 Mess-Ergebnisse in der Access-Datenbank.
Grob beschrieben ist jede Messung in folgenden Feldern hinterlegt:
Periode, Objekt, Verteiler, Gerät, Mess-Art und ca. 20 Felder mit den Mess-Ergebnissen.
Der Benutzer der Software kann schlussendlich jede Messung betrachten und div.Befunde erstellen.
In Access sah das aus wie in Image1.jpg
In VB zeige ich die Daten in DataGridViews. Und da hatte ich schon beim Füllen der Listen mein erstes Problem.
Mit folgendem Code fülle ich die erste Liste:
(Gleich mal vorweg: Ich weiss, dass meine Benennung von Variablen nicht den üblichen Regeln entspricht...aber das sei mal meine 100. Sorge
Quellcode
- Public Sub ListsUpdate(ByVal vListID As fList)
- Using DBcon As New OleDbConnection, DBcmd As New OleDbCommand
- Dim DBreader As OleDbDataReader
- Dim DBreaderCount As Long
- DBcon.ConnectionString = DBsource
- DBcmd.Connection = DBcon
- DBreaderCount = 0
- Try
- DBcon.Open()
- If vListID = fList.fAll Or vListID = fList.fPeriode Then
- DBcmd.CommandText = "SELECT ResPeriode FROM tResult GROUP BY ResPeriode ORDER BY ResPeriode"
- Form1.fListPeriode.Rows.Clear()
- Form1.fListPeriode.ClearSelection()
- vListFillInProgress = True
- DBreader = DBcmd.ExecuteReader()
- Do While DBreader.Read()
- Form1.fListPeriode.Rows.Add(DBreader("ResPeriode"))
- DBreaderCount += 1
- Loop
- DBreader.Close()
- vListFillInProgress = False
- If DBreaderCount > 0 Then
- Form1.fListPeriode.ClearSelection()
- End If
- DBreaderCount = 0
- vPeriode = vbNullString
- vListID = fList.fAll
- End If
- If vListID = fList.fAll Or vListID = fList.fObject Then
- Form1.fListObject.Rows.Clear()
- vListFillInProgress = True
- If vPeriode <> vbNullString Then
- DBcmd.CommandText = "SELECT tResult.ResObject, IIf([FileIsInfo],'Info','') AS Info, tFile.FileIsInfo, tResult.ResFileID FROM tFile INNER JOIN tResult ON tFile.FileID = tResult.ResFileID WHERE (((tResult.ResPeriode)='" & vPeriode & "')) GROUP BY tResult.ResObject, IIf([FileIsInfo],'Info',''), tFile.FileIsInfo, tResult.ResFileID ORDER BY tResult.ResObject"
- DBreader = DBcmd.ExecuteReader()
- Do While DBreader.Read()
- Form1.fListObject.Rows.Add(DBreader("ResObject"), DBreader("Info"), DBreader("FileIsInfo"), DBreader("ResFileID"))
- DBreaderCount += 1
- Loop
- DBreader.Close()
- End If
- vListFillInProgress = False
- If DBreaderCount > 0 Then
- Form1.fListObject.ClearSelection()
- End If
- DBreaderCount = 0
- vObject = vbNullString
- vListID = fList.fAll
- End If
- If vListID = fList.fAll Or vListID = fList.fMesCat Then
- Form1.fListMesCat.Rows.Clear()
- vListFillInProgress = True
- If vPeriode <> vbNullString Then
- DBcmd.CommandText = "SELECT tMessureCategory.MesCatDesc, tResult.ResMesCatID FROM tMessureCategory INNER JOIN tResult ON tMessureCategory.MesCatID = tResult.ResMesCatID WHERE tResult.ResPeriode = '" & vPeriode & "' And tResult.ResObject = '" & vObject & "' GROUP BY tResult.ResMesCatID, tMessureCategory.MesCatDesc ORDER BY tResult.ResMesCatID"
- DBreader = DBcmd.ExecuteReader()
- Do While DBreader.Read()
- Form1.fListMesCat.Rows.Add(DBreader("MesCatDesc"), DBreader("ResMesCatID"))
- DBreaderCount += 1
- Loop
- DBreader.Close()
- End If
- vListFillInProgress = False
- If DBreaderCount > 0 Then
- Form1.fListMesCat.ClearSelection()
- End If
- DBreaderCount = 0
- vMesCatID = vbNullString
- vListID = fList.fAll
- End If
- If vListID = fList.fAll Or vListID = fList.fBlock Then
- Form1.fListBlock.Rows.Clear()
- vListFillInProgress = True
- If vPeriode <> vbNullString Then
- DBcmd.CommandText = "SELECT tResult.ResBlock FROM tResult WHERE tResult.ResPeriode = '" & vPeriode & "' And tResult.ResObject = '" & vObject & "' And tResult.ResMesCatID = " & vMesCatID & " GROUP BY tResult.ResBlock ORDER BY tResult.ResBlock"
- DBreader = DBcmd.ExecuteReader()
- Do While DBreader.Read()
- Form1.fListBlock.Rows.Add(DBreader("ResBlock"))
- DBreaderCount += 1
- Loop
- DBreader.Close()
- End If
- vListFillInProgress = False
- If DBreaderCount > 0 Then
- Form1.fListBlock.ClearSelection()
- End If
- DBreaderCount = 0
- vMesCatID = vbNullString
- vListID = fList.fAll
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Using
- End Sub
Wenn die erste Zeile ins DataGridView geschrieben wird, dann wird diese von VB sofort markiert und natürlich das Ereignis ".CellEnter" ausgelöst.
Bei Schreiben der 2.Zeile wird dieses Ereignis dann nicht mehr ausgeführt...logisch.
Und das will ich nicht. Der Code soll erst alle Zeilen schreiben. Und dann auf die Auswahl des Nutzers warten.
Erst danach soll die nächste Liste auf Grund der Auswahl des Nutzers gefüllt werden. Und so solls dann Liste für Liste weitergehen...bis ich zum einzelnen Mess-Ergebnis gelange.
Die Variable "vListFillInProgress" nutze ich als Notbehelf nur, damit diese Ereignis-Prozedur nichts tut, bis die Liste gefüllt ist.
Und hier gleich die erste Frage: Was mach ich da falsch?
2.Frage
Wie man sieht arbeite ich noch mit dauerndem Direktzugriff auf die Datenbank
Der Test-Versuch alle Daten in DataTable zu speichern und danach zu filtern gelang einwandfrei
aber der ".Fill"-Prozess dauert gegenüber dem Direktzugriff schweinelangsam (ca. 15 Sekunden) und das ist inakzeptabel.
Die Daten je nach Benutzer-Auwahl gefiltert in DataTables zu holen ist sinnlos, weil nach der nächsten Benutzer-Auswahl die Daten neu geholt werden müssen.
1.Auswahl: Nur die Perioden (Group by Periode)
2.Auswahl: Befunde der entsprechenden Periode (Group by Periode, Group by Befund)
3.Auswahl: Objekte der entsprechenden Periode, Befundes......
Also müsste ich für schnellere Anzeige schon alle Daten im Speicher haben um dann mal schnell filtern zu können...Idee nicht schlecht...aber das Füllen von 400.000 Datensätzen (und noch zu übers Netzwerk) dauert zu lange.
Hier der Test-Code zum Füllen der Periode 2012 (wenn ich alle Datensätze holen müsste, dann dauerts ewig):
VB.NET-Quellcode
- Public Sub DataRead()
- Using DBcon As New OleDbConnection, DBcmd As New OleDbCommand
- Dim vSQL As String
- vSQL = "SELECT *"
- vSQL &= ", tObject.ObjDesc"
- vSQL &= ", tMessureArt.MesArtDesc"
- vSQL &= ", tMessureTyp.MesTypDesc"
- vSQL &= ", tHardware.HardDesc"
- vSQL &= ", tHardware.HardTyp"
- vSQL &= " FROM tHardware RIGHT JOIN ((tMessureTyp RIGHT JOIN (tResultSys RIGHT JOIN (tSuccess RIGHT JOIN (tMessureCategory INNER JOIN (tMessureArt RIGHT JOIN tResult ON tMessureArt.MesArtID = tResult.ResMesArtID) ON tMessureCategory.MesCatID = tResult.ResMesCatID) ON tSuccess.SucID = tResult.ResSucID) ON tResultSys.ResSysID = tResult.ResSYSID) ON tMessureTyp.MesTypID = tResult.ResMesTypID) LEFT JOIN tObject ON tResult.ResObject = tObject.ObjID) ON tHardware.HardID = tResult.ResHardID"
- vSQL &= " WHERE ResPeriode = '2012';"
- DBcon.ConnectionString = DBsource
- DBcmd.Connection = DBcon
- DBcon.Open()
- DBcmd.CommandText = vSQL
- DBdataAdapter.SelectCommand = DBcmd
- DBdataAdapter.Fill(DbdataSet)
- End Using
- End Sub
Da ich mich als Neuling in VB verstehe, ist meine 2.Frage:
Geh ich das falsch an?
Verzeiht mir bitte einen ev. Hausmeister-Programmierstil aber ich bin erst ein paar Tage in diese Liga aufgestiegen und gelobe Besserung!
mfG, Ludwig aka Wickal