| |
VB.NET - FortgeschritteneDGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 11:25 |
| mittels Linq Abfrage möchte ich erreichen, wie oft die Maximo Nummer (String) vorkommt
um in der Liste zu vergleichen nach Standort und Artike. Leider sehe ich keine Daten in der df Datatable.
was mache ich da schon wieder falsch
Me.Cursor = Cursors.WaitCursor
Dim q = From row As DataRow In LagerlisteDB.Lagerliste
Let Standort = row.Field(Of String)("Standort")
Let Artikel = row.Field(Of String)("Artikelbezeichnung")
Let Maximo = row.Field(Of String)("MAXIMO")
Where Standort = row.Field(Of String)("Standort").ToLower _
AndAlso row.Field(Of String)("Artikelbezeichnung").ToLower _
AndAlso row.Field(Of String)("MAXIMO").ToLower _
Group By art = row.Field(Of String)("Maximo") Into Count()
Dim df As New DataTable
With df.Columns
.Add("Standort", GetType(String))
.Add("Artikel", GetType(String))
.Add("Maximo", GetType(String))
.Add("Count", GetType(Integer))
End With
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i
'Daten in der DGV anzeigen
dgvErgebnis.DataSource = bs
Me.Cursor = Cursors.Default Abfrage bleibt leer, keine Fehlermeldung. | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Manfred X | Datum: 08.04.18 11:34 |
| Hallo
Ich sehe in der Where-Klausel keine Auswahlbedingung für
die Spalten "Artikel" und "Maximo". | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 11:44 |
| Hallo Manfred X,
Ich sehe in der Where-Klausel keine Auswahlbedingung für
die Spalten "Artikel" und "Maximo". ich möchte auch ja alle vorhandenen Artikel die eine MAXIMO bekommen haben.
OK evtl. über das "INMAXIMO" row.Field(of Boolean) = true
doch da bringt er jetzt die Meldung Ungültige Konvertierung von der Zeichenfolge in Typ Boolean ?
Me.Cursor = Cursors.WaitCursor
Dim q = From row As DataRow In LagerlisteDB.Lagerliste
Let Standort = row.Field(Of String)("Standort")
Let Artikel = row.Field(Of String)("Artikelbezeichnung")
Let Maximo = row.Field(Of String)("MAXIMO")
Where Maximo = row.Field(Of Boolean)("INMAXIMO") = True _
AndAlso row.Field(Of String)("Artikelbezeichnung").ToLower _
AndAlso row.Field(Of String)("MAXIMO").ToLower _
Group By art = row.Field(Of String)("Maximo") Into Count()
Dim df As New DataTable
With df.Columns
.Add("Standort", GetType(String))
.Add("Artikel", GetType(String))
.Add("Maximo", GetType(String))
.Add("Count", GetType(Integer))
End With
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i
'Daten in der DGV anzeigen
dgvErgebnis.DataSource = bs
Me.Cursor = Cursors.Default | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Manfred X | Datum: 08.04.18 11:53 |
| "Maximo" ist ein String-Spalte.
Ich weiß nicht, welche Werte dort stehen.
Welchen Typ hat die Spalte InMaximo? Ich vermute: String.
Solche Werte können nicht direkt als Bool
abgefragt oder genutzt werden, eventuell konvertieren.
Welcher Artikel soll ausgewählt werden?
Wieso steht "Artikel..." in der Where-Klausel, aber ohne Auswahlbedingung? | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 11:58 |
| "Maximo" ist ein String-Spalte.
Ich weiß nicht, welche Werte dort stehen.
Welchen Typ hat die Spalte InMaximo? Ich vermute: String. Nein ist ein Ja/Nein Feld
Solche Werte können nicht direkt als Bool
abgefragt oder genutzt werden, eventuell konvertieren.
Welcher Artikel soll ausgewählt werden? Alle Artikel möchte ich sehen
Wieso steht "Artikel..." in der Where-Klausel, aber ohne Auswahlbedingung?
da steht doch Where Maximo = row.Field(Of Boolean)("INMAXIMO") = True | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Manfred X | Datum: 08.04.18 12:05 |
| [I]OK evtl. über das "INMAXIMO" row.Field(of Boolean) = true
doch da bringt er jetzt die Meldung
Ungültige Konvertierung von der Zeichenfolge in Typ Boolean ?[/I]
Die Hilfs-Variable Maximo bezieht sich auf die Stringspalte "Maximo"
und nicht auf die Spalte "InMaximo".
Vermutlich einfach:
Where row.Field(Of Boolean)("INMAXIMO") _
AndAlso .... | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 12:17 |
| OK habe es abgeändert, nun habe ich wieder erwarten das DBNUll Problem. Wann verstehe ich das mal?
https://picload.org/view/dawgwoia/08-04-_2018_12-10-43.png.html
ich brauche, Standort, Artikel, Maximo(Count) um die Artikel zu vergleichen auf Schreibweise
die kann unterschiedlich sein, aber die Maximo gleiche Maximo bekommen haben.
Me.Cursor = Cursors.WaitCursor
Dim q = From row As DataRow In LagerlisteDB.Lagerliste
Let Standort = row.Field(Of String)("Standort")
Let Artikel = row.Field(Of String)("Artikelbezeichnung")
Let Maximo = row.Field(Of String)("MAXIMO")
Where row.Field(Of Boolean)("INMAXIMO") _
Group By art = row.Field(Of String)("Maximo") Into Count()
Dim df As New DataTable
With df.Columns
.Add("Standort", GetType(String))
.Add("Artikel", GetType(String))
.Add("Maximo", GetType(String))
.Add("Count", GetType(Integer))
End With
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i
'Daten in der DGV anzeigen
dgvErgebnis.DataSource = bs
Me.Cursor = Cursors.Default | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Manfred X | Datum: 08.04.18 12:28 |
| Das hängt davon ab, in welchen der beteiligten Spalten
Nullwerte vorkommen können und wie in diesem Fall mit
den unvollständig gefüllten Datensätzen zu verfahren ist.
In der Statistik werden oft gemischte Verfahren eingesetzt.
1. Man prüft wie viele Datensätze unvollständig sind
2. Datensätze, bei denen mehr als ein bestimmter Prozentsatz
an Daten (insgesamt oder auswertungs-spezifisch) fehlt,
werden bei der Auswertung ausgesondert (meist 5%).
3. Bei Datensätze mit nur wenigen fehlenden Werten, werden bei der
Auswertung die Missing-Werte durch Schätz- oder Defaultwerte ersetzt.
Bei der Wahl des Vorgehens sind konkrete Sachentscheidungen relevant. | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 12:44 |
| OK bei mir würde es die Maximo Spalte betreffen da noch nicht alle vorhanden sind
wie würde das nun bei mir aussehen müssen nach deinen 3 Anmerkungen?
Beispiel: Artikelbezeichnung Lichtschranke - Honeywell hat eine Maximo Nummer erhalten 130T061223
die gibt es 2x weil es 2 unterschiedliche Artikelnummern gibt das möchte ich im Ergebnis haben. Ist nicht einfach einem dritten das zu erklären, jemand schreibt die Artikelbezeichnung so oder so das will man vereintheitlichen. | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 08.04.18 17:16 |
| OK, aber dort sind Bedingungen drin.
habs hiermit fast geschafft, doch das Ergebnis ist nicht welches wir erwarten
ich glaube das ich das nicht so hinbekomme das man das ergbnis auch interpretieren kann.
schau dir das Bild mal an
1. Standort?
2. Artikel ?
3. MAXIMO
4. COUNT
https://picload.org/view/dawrdwgr/08-04-_2018_17-05-28.png.html
Me.Cursor = Cursors.WaitCursor
Dim q = From row As DataRow In LagerlisteDB.Lagerliste
Let Standort = row.Field(Of String)("Standort")
Let Artikel = row.Field(Of String)("Artikelbezeichnung")
Where IsFullRow(row) AndAlso row.Field(Of Boolean)("INMAXIMO") = True
Order By Standort
Order By Artikel
Group By art = row.Field(Of String)("MAXIMO") Into Count()
Dim df As New DataTable
With df.Columns
.Add("Standort", GetType(String))
.Add("Artikel", GetType(String))
.Add("Maximo", GetType(String))
.Add("Count", GetType(Integer))
End With
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
If Not IsDBNull(row("MAXIMO")) Then
sm += CInt(row("Count"))
'row("cum") = sm
End If
Next i
'Daten in der DGV anzeigen
dgvErgebnis.DataSource = bs
Me.Cursor = Cursors.Default | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Kuno60 | Datum: 09.04.18 04:41 |
| Hallo ERBRU,
wenn ich das richtig verstanden habe, willst du in der Tabelle Lagerliste alle Einträge finden, die die gleiche Maximo-Nummer haben?
Du braucht dazu 2 DataGridView und 2 BindingSource.
Beispiel:
'Zeigt alle vorkommenden Maximo-Nummern und die Anzahl
With AnzahlenDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.ReadOnly = True
.MultiSelect = False
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.AutoGenerateColumns = True
.DataSource = AnzahlenBindingSource
End With
'Zeigt die Einträge in der Lagerliste, einer Maximo-Nummer.
With LagerlisteAusgabeDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.AutoGenerateColumns = True
.DataSource = LagerlisteAusgabeBindingSource
End With
'Testdaten
'Spalten: "Standort", "Artikelbezeichnung", "Maximo"
With DataSet1.Lagerliste.Rows
.Add("Hier", "Lichtschranke", "130T061223")
.Add("Hier", "Türgriff", "130T06456")
.Add("Dort", "Tasse", "130T061234")
.Add("Hier", "Kaffee", "130T061234")
.Add("Dort", "Schnürsenkel", "130T06456")
.Add("Dort", "Sonnenuhr", "130T061228")
.Add("Dort", "Lichtschranke", "130T061223")
.Add("Dort", "Schnürsenkel", "130T06456")
End With Die Abfrage:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
'Abfrage der Tabelle "Lagerliste" im DataSet
Dim Q = From row In DataSet1.Lagerliste
Where Not row.IsMaximoNull
Group By row.Maximo Into Anzahl = Count(), Artikel = Group
Order By Anzahl Descending
AnzahlenBindingSource.DataSource = Q
LagerlisteAusgabeBindingSource.DataSource = AnzahlenBindingSource
LagerlisteAusgabeBindingSource.DataMember = "Artikel"
End Sub Das erste DGV zeigt in der ersten Spalte alle gefundenen Maximo und in der zweiten Spalte die Anzahl der Vorkommen.
Beim auswählen einer Zeile zeigt dann das 2. DGV die dazugehörigen Einträge der Lagerliste an. | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 09.04.18 06:50 |
| Guten Morgen Kuno60,
das scheint genau das zu sein was ich brauche, nur habe ich noch das Problem mit DBNull. Ansonsten hast du mich verstanden. Sind doch nicht gebunden die DGV' s ?
wie kriegen wir das DBNull in den Griff? das ist nicht so mein Ding diese Abfragen DBNull
siehe Bild, dein Ansatz ist genau das was ich bräuchte, nur habe ich ja ein paar Spalten mehr die ohne Inhalt sein können
https://picload.org/view/dawdgccw/09-04-_2018_06-37-11.png.html
Dim AnzahlenBindingSource As New BindingSource
Dim LagerlisteAusgabeBindingSource As New BindingSource
Me.Cursor = Cursors.WaitCursor
'Abfrage der Tabelle "Lagerliste" im DataSet
Dim Q = From row In LagerlisteDB.Lagerliste
Where Not row.IsMAXIMONull
Group By row.MAXIMO Into Anzahl = Count(), Artikel = Group
Order By Anzahl Descending
AnzahlenBindingSource.DataSource = Q
LagerlisteAusgabeBindingSource.DataSource = AnzahlenBindingSource
LagerlisteAusgabeBindingSource.DataMember = "Artikel"
'Zeigt alle vorkommenden Maximo-Nummern und die Anzahl
With AnzahlenDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.ReadOnly = True
.MultiSelect = False
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.AutoGenerateColumns = True
.DataSource = AnzahlenBindingSource
End With
'Zeigt die Einträge in der Lagerliste, einer Maximo-Nummer.
With LagerlisteAusgabeDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.AutoGenerateColumns = True
.DataSource = LagerlisteAusgabeBindingSource
End With
Me.Cursor = Cursors.Default | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: Kuno60 | Datum: 09.04.18 10:30 |
| Guten Morgen,
die Sache mit DBNull ist beim DataSet nicht ganz so einfach. Ich hab deshalb immer die "LINC To SQL Klassen" verwendet. Die sind gut auf Linc-Abfragen abgestimmt und damit ist es auch möglich die Werte im 2. DGV zu ändern.
Beim DataSet gibts folgende Möglichkeiten:
Für alle Spalten, die vom Typ String sind, kannst du im Dataset-Designer die Eigenschaft "NullValue" auf (Empty) oder (Nichts) einstellen. Bei allen anderen Werttypen muss man den Nullwert in der Linc-Abfrage behandeln.
Füge Select ein. Damit kannst du die Spalten auswählen, die im 2. DGV angezeigt werden sollen und die Nullbehandlung einbauen.
Hier ist die Spalte "Nummer" vom Typ Integer. Diese wird dann als Nullable(Of Integer) an das DGV weitergegeben:
Dim Q = From row In DataSet1.Lagerliste
Where Not row.IsMaximoNull
Select row.Standort, row.Artikelbezeichnung, row.Maximo, _
Nummer = If(row.IsNummerNull, Nothing, CType(row.Nummer, Nullable( _
Of Integer)))
Group By Maximo Into Anzahl = Count(), Artikel = Group
Order By Anzahl Descending Andere Möglichkeit mit gleichem Effekt:
Dim Q = From row As DataRow In DataSet1.Lagerliste
Let Maximo = row.Field(Of String)("Maximo")
Where Not String.IsNullOrEmpty(Maximo)
Select Maximo, Standort = row.Field(Of String)("Standort"), _
Artikelbezeichnung = row.Field(Of String)("Artikelbezeichnung"), _
Nummer = row.Field(Of Integer?)("Nummer")
Group By Maximo Into Anzahl = Count(), Artikel = Group
Order By Anzahl Descending | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 09.04.18 11:26 |
| Danke, doch so ganz kann ich dich noch nicht folgen.
Wo für steht die Nummer?
Spalte 'Nummer' gehört nicht zu Tabelle Lagerliste, wird gemeldet.
können wir den Code mal komplett zusammenstellen wie er bei mir aussehen sollte?
Danke!
Korrektur: habe die Nummer Zeile entfernt und noch mal probiert. Danach hat es geklappt
so sieht der Code jetzt bei mir aus.
Frage: in der ersten DGV bleibt Artikel jedoch leer
Dim AnzahlenBindingSource As New BindingSource
Dim LagerlisteAusgabeBindingSource As New BindingSource
Me.Cursor = Cursors.WaitCursor
'Abfrage der Tabelle "Lagerliste" im DataSet
Dim Q = From row As DataRow In LagerlisteDB.Lagerliste
Let Maximo = row.Field(Of String)("Maximo")
Where Not String.IsNullOrEmpty(Maximo)
Select Maximo, Standort = row.Field(Of String)("Standort"), _
Artikelbezeichnung = row.Field(Of String)("Artikelbezeichnung"), _
Artikelnummer = row.Field(Of String)("Artikelnummer")
Group By Maximo Into Anzahl = Count(), Artikel = Group
Order By Anzahl Descending
AnzahlenBindingSource.DataSource = Q
LagerlisteAusgabeBindingSource.DataSource = AnzahlenBindingSource
LagerlisteAusgabeBindingSource.DataMember = "Artikel"
'Zeigt alle vorkommenden Maximo-Nummern und die Anzahl
With AnzahlenDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.ReadOnly = True
.MultiSelect = False
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.AutoGenerateColumns = True
.DataSource = AnzahlenBindingSource
End With
'Zeigt die Einträge in der Lagerliste, einer Maximo-Nummer.
With LagerlisteAusgabeDataGridView
.AllowUserToDeleteRows = False
.AllowUserToAddRows = False
.AutoGenerateColumns = True
.DataSource = LagerlisteAusgabeBindingSource
End With
Me.Cursor = Cursors.Default
End Sub
Beitrag wurde zuletzt am 09.04.18 um 11:45:02 editiert. | |
Re: DGV zeigt keine Daten nach Abfrage | | | Autor: ERBRU | Datum: 09.04.18 18:07 |
| Hallo Kuno60,
so habe ich es nun umgesetzt funktioniert wie es man sich vorstellt. Danke, Danke
siehe selbst, etwas schick gemacht Summe hinzugefügt zum Vergleich. Passt soweit wie ich es wollte
das kann sich sehen lassen. Super noch mal Danke
https://picload.org/view/dawaagdr/09-04-_2018_17-52-58.png.html | |
| 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 |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|