| |
ADO.NET / DatenbankenSQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Bloing | Datum: 01.03.18 10:58 |
| Hallo zusammen!
Ich habe mal wieder ein kleines (für mich großes) Problem beim erstellen einer passenden SQL Abfrage.
In meiner Datenbank habe ich mehrere sich wiederholende Namen und Arbeitsschritte. Nun würde ich gerne wissen wie oft ein Name welchen Arbeitsschritt gemacht hat und das ganze dann in einem DGV anzeigen.
Mein Code schaut bis jetzt so aus:
Try
SQLstr = ("SELECT DISTINCT P_Name, P_As, SchritteCount(SELECT COUNT(" & _
"P_As) FROM Tabelle2) FROM Tabelle2")
Mycn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data" & _
"Source=" & sPfad & DbPw)
Using cmd = New OleDbCommand(SQLstr, Mycn)
Mycn.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
Dim dt = New DataTable
dt.Load(reader)
DataGridView5.DataSource = dt
DataGridView5.Refresh()
DataGridView5.ClearSelection()
reader.Close()
Mycn.Close()
End Using
Catch ex As Exception
MessageBox.Show(ex.Message & " - " & ex.Source)
End Try Soweit sogut, allerdings werden hier anscheinend alle Arbeitsschritte zusammengezählt und nicht jeder für sich :/
Ist es überhaupt möglich sowas abzufragen? Oder muß man da iwie über mehrere Etappen gehen um das gewünschte Ergebnis zu erzielen?
LG,
Bloing | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Franki | Datum: 04.03.18 06:09 |
| Hallo,
pauschal kann man dazu niczts sagen weil wir deine genaue Struktur der DB nicht kennen. Allgemein aber ist dein Wunsch durchaus realisierbar durch passendes DB Desingn und entsprechende SQL Abfragen.
Ob deine DB bzw. dein SQL Statement grundsätzlich funktionieren solltest du mit einem Test analysieren. Einfach mal neu Aufsetzten in einem Tesprojekt und mit ein paar eindeutigen Datensätzen testen. Und sich dann an die konkrete Aufgabe Schritt für Schritt heran tasten. Nur so kannst du dein Priblem analysieren und nebenbei lernst du auch noch etwas.
Gruß
Frank | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Manfred X | Datum: 04.03.18 08:16 |
| Hallo!
Da ich Deine Datenstruktur nicht kenne, kann ich keinen
verbindlichen Hinweis zur Gestaltung der SQL-Abfrage geben.
Aber Du könntest vielleicht die Tabelle zunächst in eine
Datatable laden und über die Datensätze eine LINQ-Abfrage
laufen lassen:
Option Infer On
Public Class frmCount
Dim dt As New DataTable
Dim dtx As DataTable
Dim dgv As New DataGridView With
{.Parent = Me, .AllowUserToAddRows = False}
Private Sub frmCount_Load(sender As Object, _
e As EventArgs) Handles MyBase.Load
'Einige Testdaten erstellen
With dt.Columns
.Add("ID", GetType(Integer))
.Add("Name", GetType(String))
.Add("Arbeitsschritt", GetType(String))
End With
Dim namen() As String = _
{"Müller E.", "Schneider K.", "Meier L.", "Üzgül E."}
Dim schritte() As String = _
{"Falten", "Schneiden", "Bohren", "Schleifen", "Messen"}
Dim rndm As New Random(1234)
For i As Integer = 1 To 1000
'zufällige Datensätze
dt.Rows.Add(i, namen(rndm.Next(0, 4)), schritte(rndm.Next(0, 5)))
Next i
'LINQ: Gruppieren/Sortieren und Zählen der Datensätze
Dim q = From r As DataRow In dt.AsEnumerable
Let name As String = r("Name").ToString
Let schritt As String = r("Arbeitsschritt").ToString
Order By name, schritt
Group By name, schritt
Into Anzahl = Group, Count()
'Listenelemente des anonymen Typs in die Sätze einer Datatable eintragen
dtx = dt.Clone
dtx.Columns.Add("Anzahl")
For i As Integer = 0 To q.Count - 1
dtx.Rows.Add(i, q(i).name, q(i).schritt, q(i).Count)
Next i
'Anzeigen
dgv.DataSource = dtx
End Sub
End Class
Beitrag wurde zuletzt am 04.03.18 um 08:21:42 editiert. | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: effeff | Datum: 04.03.18 22:49 |
| Und wenn Du COUNT und DISTINCT richtig herum verdrehst? Du musst doch erst einmal mit DISTINCT herausfinden, was Du mit COUNT zählen möchtest...
EALA FREYA FRESENA | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Bloing | Datum: 05.03.18 14:12 |
| Erstmal viiiiielen lieben Dank für die Hilfe an alle
Mein ganz besonderer Dank geht an Manfred X!
Mit deiner Lösung habe ich es hinbekommen - ultrageil! (freu mich grad schusselig )
So schaut jetzt mein funktionierender Code aus:
Dim dt As New DataTable
Dim dtx As DataTable
With dt.Columns
.Add("ID", GetType(Integer))
.Add("P_Name", GetType(String))
.Add("P_As", GetType(String))
End With
Try
SQLstr = ("SELECT P_Name, P_As FROM Zeiterfassung")
Mycn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data" & _
"Source=" & sPfad & DbPw)
Mycn.Open()
Using cmd = New OleDbCommand(SQLstr, Mycn)
Dim reader As OleDbDataReader = cmd.ExecuteReader()
dt.Load(reader)
reader.Close()
'LINQ: Gruppieren/Sortieren und Zählen der Datensätze
Dim q = From r As DataRow In dt.AsEnumerable
Let name As String = r("P_Name").ToString
Let schritt As String = r("P_As").ToString
Order By name, schritt
Group By name, schritt
Into Anzahl = Group, Count()
'Listenelemente des anonymen Typs in die Sätze einer Datatable
' eintragen
dtx = dt.Clone
dtx.Columns.Add("Anzahl", GetType(Integer))
For i As Integer = 0 To q.Count - 1
dtx.Rows.Add(i, q(i).name, q(i).schritt, q(i).Count)
Next i
'Anzeigen
DataGridView5.DataSource = dtx
DataGridView5.Columns("ID").Visible = False
DataGridView5.ClearSelection()
End Using
Mycn.Close()
Catch ex As Exception
MessageBox.Show(ex.Message & " - " & ex.Source)
End Try | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Franki | Datum: 06.03.18 02:28 |
| Hallo,
schön, dass es funktioniert wie von dir gewünscht.
Aber generell gefragt an alle, ist das der richtige Weg die eigentliche SQL Abfrage ab zu specken und deren Funktionalität in das anzeigende Steuerelement zu verlagern? Damit kann ich mich noch nicht so wirklich anfreunden.
Bei geringen Datenmengen mag das funktionieren von der Performance her, aber je größer die Anzahl der Datensätze wird, desto langsamer ist diese Methode im Endeffekt. Ganz zu schweigen vom Traffic der unnötig verbraucht wird und evtl. auch Datenvolumen oder Geld kostet.
Übertrieben gesehen funktioniert ein "Select * From Tabelle" hervorragend wenn man dann später ausfiltert, aber je größer der Datenbestand ist, desto performanter wird es beim SQL Statement noch ein "Where...." dran zu hängen.
Nur mal so als Diskussionsgrundlage, vielleicht OT hier wir könnten das auch verschieben in ein anders Forum.
Gruß
Frank | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Manfred X | Datum: 06.03.18 11:36 |
| Hallo!
Wenn Du die gezielte SQL-Abfrage für wichtig hälst,
warum schreibst Du sie dann nicht hin???
Unter der Annahme, die Spalten "Name" und "Schritt" stehen in
einer Tabelle "Test" würde die Abfrage (unter SQL CE 4.0)
so aussehen:
Select Name, Schritt, COUNT(Schritt) As Anzahl From Test
Group By Name, Schritt
Order By Name, Schritt | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Franki | Datum: 07.03.18 04:03 |
| Hallo ManfredX,
Zitat: | |
Wenn Du die gezielte SQL-Abfrage für wichtig hälst,
warum schreibst Du sie dann nicht hin???
| |
Das hat mehrere Gründe:
Erstens war danach gar nicht gefragt, ich wollte nur anmerken, dass ein gezieltes SQL Statement evtl. besser geeignet ist als im Steuerelement später auszufiltern.
Zweitens kann man ohne die DB zu kennen gar kein konkretes SQL Statement formulieren.
Drittens weiß ich nicht, ob das überhaupt gewünscht ist, denn die Fagestellung und die Antworten (ganz allgeimein) gehen ja inzwischen generell in die andere Richtung, das später auszufiltern. Diesen Trend wollte ich einfach mal zur Diskussion stellen, ob das so üblich ist und Zukunft hat.
Zitat: | |
Unter der Annahme ... würde die Abfrage so aussehen ...
| |
Ja, aber das steht in jedem Buch, jedem Tutorial im Internet usw.
Mir ging es nicht darum wie SQL Statements formuliert werden sondern darum ob es sinnvoll ist diese vorher abzusetzten oder erst nachher zu filtern.
Ich persönlich unterscheide da zwischen Sortierung und Filterung. Also z.B. A-Z oder Z-A im Steuerelment zu sortieren ist ok, da bleibt der Datenbestand ja gleich und der Rechner kann das schneller als eine neue SQL Abfrage.
Wenn sich die Menge der Datensätze für das Ergebnis ändert bin ich für die neue SQL Abfrage. Wie siehst du das?
Bei kleinen Datenmengen macht das keinen Unterschied, aber je größer der Datenbestand ist, desto relevanter wird das meiner Meinung nach. Früher war die Rechenleistung der Server und Clients nicht so wie heute, die evtl. notwendige Internetverbindung langsam. Aber im Zeitalter der mobilen Endgeräte spielt das auch wieder rein in Bezug auf verbrauchten Traffic. Eine "echte" Flatrate gibt es nicht wirklich. (Die Telekom plant zwar eine, aber ob die voraus gesetzt werden kann für eiine Anwendung wird sich zeigen)
Gruß
Frank | |
Re: SQL Abfrage AccessDatenbank in VB.net mit (aufwendigem?) Count | | | Autor: Manfred X | Datum: 07.03.18 08:05 |
| Hallo!
Einen Trend zur Verlagerung von DB-Operationen in den Hauptspeicher
habe ich hier nicht angeregt, sondern klar gemacht, daß ich auf LINQ in einer
Datatable zurückgreife, weil ich die zugrundeliegende DB-Struktur nicht
eindeutig einordnen kann.
Die Frage, die Du aufwirfst, ist komplex und es gibt meiner Ansicht nach
dafür keine allgemein anwendbaren Regeln.
Ob wiederholte DB-Selects und Updates kleiner Datenmengen zweckmäßiger sind
als die Verlagerung großer DB-Teile in den Hauptspeicher, hängt von vielen
Parametern ab:
- Art der Verbindung zur Datenbank (Kapazität, Geschwindigkeit)
- Grad der Auslastung dieser Verbindung zur DB
- Überlegungen zur Datensicherheit (evt. Minimierung des Traffic; Nutzung eingebetteter
Routinen - insbesondere bei komplexen Datenstrukturen)
- Art der Abfragen (Können sie zusammengefaßt werden? Sind sie
voneinander oder vom Benutzer stark abhängig oder sachbezogen überschaubar? usw.)
- Update-/Transaktions-Sicherheit (Grad des Risikos von Abstürzen/Fehlfunktionen des
Gesamt-Systems während der Bearbeitung bzw. Übertragung von Daten)
- Hardware-Ausstattung (z.B. Verfügbarkeit schneller und sicherer lokaler Speichermedien
für den temporären Gebrauch bei Remote-Access)
- usw.
Dazu kommen allgemeine Gesichtspunkte wie Wartbarkeit, Entwickungsoffenheit,
Ergonomie, ... auf die die DB-Interaktion ebenfalls Auswirkungen hat.
Solche Parameter sind auch vom konkreten System/Anwendungsfall/Kunden abhängig.
Aus diesem Grund kann der Entwickler bei der Konzipierung einer "App"
meist nur begrenzt diesbezügliche Annahmen zugrundelegen.
Insbesondere beim Verarbeiten großer Datenmengen muß man eventuell sogar mehrere
alternative Strategien der DB-Interaktion einbauen, die je nach Lage/Settings
verwendet werden können.
Voraussetzung ist auch die fundierte Kenntnis der diversen Möglichkeiten, die ADO-Net
zur Verfügung stellt - z.B. Pooling - und die auch laufend weiterentwickelt werden. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|