Wie stelle ich die Daten am besten in einem DGV da?

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von MR_NMS.

    Wie stelle ich die Daten am besten in einem DGV da?

    Hallo zusammen!
    Wie stelle ich es am besten an, das ich Jahresdaten nach Monaten in einem DGV anzeigen kann?

    Ich habe es bisher so probiert, aber so wird es eine Menge Code =O

    Die Jahre erstelle ich so:

    VB.NET-Quellcode

    1. Dim year As Integer = 2013
    2. For i As Integer = 0 To 20
    3. year += 1
    4. .Rows.Add(year, "")
    5. Next i


    jede einzelne Zeile fülle ich so:

    VB.NET-Quellcode

    1. '2014
    2. .Rows(0).Cells("Summe").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/01/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/12/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    3. .Rows(0).Cells("Januar").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/1/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/1/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    4. .Rows(0).Cells("Februar").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/2/2014 12:00:00 AM#" AndAlso x.Datum <= "#28/2/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    5. .Rows(0).Cells("März").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/3/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/3/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    6. .Rows(0).Cells("April").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/4/2014 12:00:00 AM#" AndAlso x.Datum <= "#30/4/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    7. .Rows(0).Cells("Mai").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/5/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/5/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    8. .Rows(0).Cells("Juni").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/6/2014 12:00:00 AM#" AndAlso x.Datum <= "#30/6/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    9. .Rows(0).Cells("Juli").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/7/2014 12:00:00 AM#" AndAlso x.Datum <= "#30/7/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    10. .Rows(0).Cells("August").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/8/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/8/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    11. .Rows(0).Cells("September").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/9/2014 12:00:00 AM#" AndAlso x.Datum <= "#30/9/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    12. .Rows(0).Cells("Oktober").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/10/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/10/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    13. .Rows(0).Cells("November").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/11/2014 12:00:00 AM#" AndAlso x.Datum <= "#30/11/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()
    14. .Rows(0).Cells("Dezember").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= "#1/12/2014 12:00:00 AM#" AndAlso x.Datum <= "#31/12/2014 12:00:00 AM#").Sum(Function(x) x.Waschzahlen).ToString()


    Im Beispiel sieht man vielleicht ehe, was ich meine!
    Hat jemand für mich einen Tipp, wie man es eleganter machen kann?




    Danke
    Matthias
    Bilder
    • Beispiel.JPG

      198,13 kB, 3.573×514, 108 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MR_NMS“ ()

    Naja, das ist eiglich eine Standard-Refaktorisierung.
    Im grunde steht da ja 12 mal dasselbe, nur mit kleinen Abwandlungen.
    Das lässt sich sicher in eine Schleife umformulieren, deren ZählerVariable die Monate durchzählt.
    Nur macht mir das konkret kein Spass, weil du Datentypen durcheinanderwürfelst, wenn du solche Vergleiche anstellst:

    MR_NMS schrieb:

    VB.NET-Quellcode

    1. x.Datum >= "#1/01/2014 12:00:00 AM#"

    Weil die linke seite des Vergleiches ist (hoffentlich!!) ein Datum, die rechte aber ein String.
    Mit sowas fällt man ziemlich sicher auf die Nase, und das zeigt mir auch, dass du Option Strict Off programmierst, was eine ganz grundlegende Fehl-Einstellung ist, die du zuerstmal korrigieren solltest, bevor man dir ühaupt verantwortungsvoll helfen kann, also in dem Sinne, dasses hinterher nicht nur funktioniert, sondern dass der Code dann auch tatsächlich verbessert ist anstatt nur eine neue Gräuel-Tat.

    Also zu Strict On/Off: Visual Studio - Empfohlene Einstellungen - must do - no excuses!

    Nachdem du auf Strict On umgestellt hast, wird obiger Vergleich nicht mehr funktinieren, weil dann mahnt der Compiler Type-Mismatches als Fehler an. Weil korrekt muss es heissen:

    VB.NET-Quellcode

    1. x.Datum >= #1/01/2014 12:00:00 AM#
    Dann ist die rechte Seite ebenso vom Typ Date wie die linke, und der Vergleich ist sinnvoll und fehlerrfrei.
    Es kann aber auch sein, dass bei dir die linke Seite tatsächlich als String vorliegt, das wäre noch fataler. Weil das ist dann ein Datenmodell-Fehler, weil ein Datum-Feld darf man keinesfalls mit dem Datentyp String modellieren, sondern für Datum muss!! (no excuses!) DatenTyp Date genommen werden.
    (Aber ich hoffe ja noch, dasses soo schlimm nicht ist ;) )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ok!
    Das ist ja mein Problem, das da 12 mal das gleiche steht!
    Wie stelle ich den die Schleife an?
    das Datum gibt die Spanne an aus dem die Summe gebildet wird!

    Alle ist in Typ Date!
    Option Strict on !

    Ich hab es jetzt einmal geändert!

    VB.NET-Quellcode

    1. Dim Anfang As Date = MonatsErste(#1/01/2014 12:00:00 AM#)
    2. Dim Ende As Date = MonatsEnde(#1/31/2014 12:00:00 AM#)
    3. Dim Anfang2 As Date = MonatsErste(#2/01/2014 12:00:00 AM#)
    4. Dim Ende2 As Date = MonatsEnde(#2/28/2014 12:00:00 AM#)
    5. .Rows(0).Cells("Januar").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= Anfang AndAlso x.Datum <= Ende).Sum(Function(x) x.Waschzahlen).ToString()
    6. .Rows(0).Cells("Februar").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= Anfang2 AndAlso x.Datum <= Ende2).Sum(Function(x) x.Waschzahlen).ToString()




    Habe aber gerade keinen Ansatz, wie ich eine Schleife erstelle die die Monate durchläuft????


    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „MR_NMS“ ()

    Habe ich schon umgestellt!

    VB.NET-Quellcode

    1. Dim Anfang As Date = MonatsErste(#1/01/2018 12:00:00 AM#)
    2. Dim Ende As Date = MonatsEnde(#1/31/2018 12:00:00 AM#)
    3. With DataGridView1
    4. Dim year As Integer = 2017
    5. For i As Integer = 0 To 5
    6. year += 1
    7. .Rows.Add(year, "")
    8. Next i
    9. .Rows(0).Cells("Januar").Value = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= Anfang AndAlso x.Datum <= Ende).Sum(Function(x) x.Waschzahlen)
    10. End With


    Rus kommt das was auf dem Bild zu sehen ist!
    Bilder
    • ergebnis.JPG

      123,11 kB, 2.352×856, 97 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MR_NMS“ ()

    Hör doch erstmal auf das Datum "fix" zu schreiben sondern bilde es mittels For-Schliefen wie @ErfinderDesRades dir schon vorgeschlagen hat.
    Beispiel:

    VB.NET-Quellcode

    1. Dim Anfang As Date = New Date(iJahr, iMonat,1)
    2. Dim Ende As Date = New Date(iJahr, iMonat,1).AddMonths(1).AddDays(-1)

    (Bei Ende weiß ich gerade nicht ob es eine elegantere Möglichkeit gibt, den letzten Tag des Monats zu ermitteln.
    Hallo!

    Die Schleife zum durchlaufen des Datums habe ich jetzt hinbekommen und hoffentlich auch so, das ich damit weiterarbeiten kann!
    Anfang gibt mir jetzt den 1 Tag im Monat
    Ende den letzten Tag im Monat
    Den Bereich stelle ich mit den beiden DateTimPicker ein!

    VB.NET-Quellcode

    1. Dim year1 As Date
    2. Dim year2 As Date
    3. year1 = DateTimePicker1.Value
    4. year2 = DateTimePicker2.Value
    5. Dim Anfang As Date
    6. Dim Ende As Date
    7. Anfang = New Date(year1.Year, year1.Month, 1)
    8. Ende = New Date(Year2.Year, Year2.Month, 1).AddMonths(1).AddDays(-1)
    9. Do While Year(Anfang) <= Year(Ende)
    10. Anfang = Anfang.AddMonths(1)
    11. DataGridView1.Rows.Add(Anfang.ToShortDateString)
    12. Loop


    Jetzt muss ich es irgendwie anstellen, das ich die einzelnen Schritte auflöse und die Daten erhalte!

    Schritt1 Ausgabe Wert Anfang bis Ende

    Ausgabe DGV Row (0) Jahr Januar Februar März April Mai Juni Juli August September Oktober November Dezember
    Eingelesene Werte 2017 10 12 11 11 11 11 11 11 111 111 11 45

    Schritt 2Ausgabe Wert Anfang bis Ende

    Ausgabe DGV Row (1) Jahr Januar Februar März April Mai Juni Juli August September Oktober November Dezember
    Eingelesene Werte 2018 1 1 1 1 1 1 1 1 1 1 1 1 1
    usw.
    Wie bekomme ich es hin, das für Jeden Monat eine neue Zeile angelegt wird, bis Anfang und Ende erreicht sind????

    VB.NET-Quellcode

    1. DataGridView1.Rows.Add(UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum >= Anfang AndAlso x.Datum <= Ende).Sum(Function(x) x.Waschzahlen))


    Da bräuchte ich wieder einmal HILFE!!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „MR_NMS“ ()

    MR_NMS schrieb:

    Wie bekomme ich es hin, das für Jeden Monat eine neue Zeile angelegt wird, bis Anfang und Ende erreicht sind????
    eine Zeile pro Monat? Du meinst wohl eher: eine Spalte pro Monat, oder? Ansonsten solltest Du uns mal bitte z.B. per Excel- oder Paint-Screenshot zeigen, wie das Ganze aussehen soll.
    Deine Spaltenheader hast Du ja schon per Monatsnamen versehen. Gut. Also geht es darum, die einzelnen Zellen mit den Monatszahlen zu füllen. Ein Screenshot Deines tDS-Designers - zumindest von der verwendeten Tabelle wäre ggf. auch sinnvoll. Oder besteht die Tabelle nur aus ID (Int32), Waschzahlen (Int32) und Datum (DateTime)?
    Statt da großartig mit dem Datum im Gesamten rumzuhantieren, nimm doch nur das Datum der jeweiligen DataTable-Zeile und werte die Property Month aus. Dann hast Du Deine Monatszahl und kannst damit notfalls auch die entsprechende Spalte ansteuern. Also z.B.:

    VB.NET-Quellcode

    1. For i = 2017 To Date.Today.Year
    2. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    3. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    4. DataGridView1.Rows.Add(CurrentYear)
    5. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    6. For j = 1 to 12
    7. Dim CurrentMonth = j
    8. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(j + 2).Value = RelevantDataRows.Where(Function (x) x.Datum.Month = CurrentMonth).Sum(Function (y) y.Waschzahlen)
    9. Next
    10. Next

    so aus dem Kopf heraus. Ob jetzt in Zeile#5 und #8 die "Koordinaten" (DataGridView1.RowCount - 1 oder vielleicht DataGridView1.RowCount - 2?) stimmen, ist abhängig von Deinen DGV-Einstellungen. Musst Du schauen/ausprobieren. - 1, wenn das manuelle Hinzufügen von Zeilen verboten ist, - 2 wenn erlaubt.

    ##########

    Zeile#6 von For i = 0 To 11 auf For i = 1 To 12 korrigiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Gut. Also wie vermutet: eine Monatszahl pro Spalte. Allerdings: Dein DataTable-Screenshot sagt, dass da noch ein wenig am Datenmodell zu arbeiten ist. Bearbeiter? Aushilfen? Einzahlung? Schäden? Kulanz? Anlage? Sicher, dass das alles Werte sind, die für einen Umsatz relevant sind? Ich glaube ja, das sowas in andere Tabellen gehört. Die netten Abkürzungen, die Du verwendest, sind bestimmt für Dich eindeutig, aber was sich dahinter verbirgt, weißt nur Du. Und ob es in diese eine Tabelle gehört, ist nicht abzuschätzen. Aber 1. es ist Dein Datenmodell und 2. das ist ein anderes Thema und gehört vorerst nicht zum hiesigen Problem.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Zeile 1, Spalte 1 (Z1, S1)
    Z1, S2
    Z1, S3
    Z2, S1
    Z2, S2
    Z2, S3
    Z3, S1
    Z3, S2
    Z3, S3
    Z4, S1
    Z4, S2
    Z4, S3
    Z5, S1
    Z5, S2
    Z5, S3

    Diese Tabelle hat 3 Spalten und 5 Zeilen.
    Spalten erzeuge ich keine. Ich erzeuge Zeilen. Und das ist genau das, was ich in meiner Codeanmerkung meinte. Dann hast Du wohl die DGV-Option "Zeilen hinzufügen" aktiv. Dann musst Du eben in Zeile#5 und #8 mit DataGridView1.RowCount - 2 arbeiten statt mit DataGridView1.RowCount - 1. Am besten Du deaktivierst erstmal die Jahresschleife und fügst die Daten nur für ein fixes Jahr hinzu, z.B. 2017. Wenn das klappt, also alle Felder korrekt befüllt werden (-> Du musst also meinen Code an Dein Projekt anpassen), dann kannst Du per For-Schleife alles durchgehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    OK!
    Ich werde es mal so ausprobieren!
    Ich habe den Code jetzt so angepasst, das jetzt alles für ein Jahr richtig angezeigt wird!

    Und nun fehlen nur noch die Jahre!
    Kann man die vorhanden Jahre aus dem DS nehmen?

    VB.NET-Quellcode

    1. For i = 2017 To Date.Today.Year
    2. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    3. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    4. For j = 0 To 12
    5. Dim CurrentMonth = j
    6. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    7. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    8. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth).Sum(Function(y) y.Waschzahlen)
    9. Next
    10. Next

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MR_NMS“ ()

    Ich habe es jetzt einmal mit einer zusätzlichen Schleife versucht!
    Leider aber nur ohne den gewünschten Erfolg!
    Die Schleife läuft durch und die Daten werden nach dem letzten Durchlauf mit dem dort anliegenden Jahr erzeugt!



    VB.NET-Quellcode

    1. For i As Integer = 2000 To Date.Today.Year
    2. i += 1
    3. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    4. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    5. For j = 0 To 12
    6. Dim CurrentMonth = j
    7. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    8. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    9. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth).Sum(Function(y) y.Waschzahlen)
    10. Next
    11. Next i

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MR_NMS“ ()

    Was hat es mit Zeile#3 auf sich? i wird doch schon durch die For-Schleife erhöht.
    Zeile#7: 0 To 12? Das sind 13 Zahlen. So viele Monate hat ein Jahr aber nicht. Aber Du hast natürlich insofern recht, dass es von 1 bis 12 gehen muss, da ja die Monatszahlen genauso sind. Da war ich zu 0-basiert.
    Zeile#9 und #10 sollten aus der inneren For-Schleife raus, da ja immer das gleiche dort passiert.
    Zeig mal bitte als Screenshot, was dabei rauskommt. Und teste bitte erstmal nur 2016. Nicht mehr. Und probier bitte auch (wie schon 2x geschrieben), ob Du in Zeile #9, #10 und #11 mit RowCount - 2 arbeiten musst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo
    Die 12 Monate, Summe und das Jahr. Deshalb die 12
    Habe RowCount auf -1 gestellt!

    VB.NET-Quellcode

    1. For i As Integer = 2018 To Date.Today.Year
    2. i += 1
    3. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    4. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    5. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    6. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    7. For j = 1 To 12
    8. Dim CurrentMonth = j
    9. DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth).Sum(Function(y) y.Waschzahlen)
    10. Next
    11. Next i


    Bei diesem Code kommt folgendes raus!
    Bilder
    • Daten.JPG

      120,58 kB, 3.748×673, 65 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MR_NMS“ ()

    Ich kenn zwar die Waschzahldaten nicht, aber das sieht doch ganz plausibel aus.
    Wenn Du jetzt noch das i += 1 aus Zeile#2 rausnimmst, überspringt er Dir auch nicht das Jahr 2018. Oder später, wenn der Zeitraum größer wird, jedes 2. Jahr.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Zahlen stimmen schon mal :)

    Habe ich rausgenommen!

    Mit der Schleife zum durchlaufen der Jahre fehlt mir irgendwie auch der Ansatz!
    Gibt es eine Möglichkeit die Jahre aus dem DS auszugeben, so das nur die Jahre genommen werden, wo auch Daten vorhanden sind?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MR_NMS“ ()