vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 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

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

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

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

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

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

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

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

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

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

Re: DGV zeigt keine Daten nach Abfrage 
Autor: Manfred X
Datum: 08.04.18 15:35

Wenn Datensätze mit fehlenden Spalten-Angaben bei der Linq-Enumeration
ausgesondert werden sollen, geht das durch "IsDbNull":
So wie hier ...
http://www.vbarchiv.net/forum/read.php?f=10&t=75507&i=75514

Beitrag wurde zuletzt am 08.04.18 um 15:39:09 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

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

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

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

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

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
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