vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
SQL 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel