Tabellenwerte zählen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Tabellenwerte zählen

    Hallo Zusammen,

    in einem dgv durch ein Dataset bereitgestellte Daten möchte ich gern filtern. Genau genommen handelt es sich um Datumsangaben, welche als String vorhanden sind.
    Ich möchte nun die Häufigkeit eines Datums ( Monat ausreichend ) hochzählen und ausgeben. Prinzipiell ist mir das auch gelungen aber ich vermute, die Performance wird mit zunehmenden Einträgen jenseits der 10000 leiden.
    Wie könnte ich das verbessern, um keine Einbrüche zu erleben.
    Folgenden Code habe ich bislang am laufen. Eines noch, ich wiederhole mich da auch gern, ich bin kein Programmierer sondern versuche mit Beispielen und ein wenig eigenem Verständnis zum Ziel zu kommen.
    Hierbei wird vermutlich Code entstehen, welche eher pragmatisch ist und bei dem einen oder anderen sehr wahrscheinlich Schwindel verursacht, von daher, seid gnädig ;)

    VB.NET-Quellcode

    1. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".01.")
    2. Dim jan As String = TblAuftragsbuchBindingSource.Count
    3. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".02.")
    4. Dim feb As String = TblAuftragsbuchBindingSource.Count
    5. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".03.")
    6. Dim mar As String = TblAuftragsbuchBindingSource.Count
    7. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".04.")
    8. Dim apr As String = TblAuftragsbuchBindingSource.Count
    9. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".05.")
    10. Dim mai As String = TblAuftragsbuchBindingSource.Count
    11. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".06.")
    12. Dim jun As String = TblAuftragsbuchBindingSource.Count
    13. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".07.")
    14. Dim jul As String = TblAuftragsbuchBindingSource.Count
    15. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".08.")
    16. Dim aug As String = TblAuftragsbuchBindingSource.Count
    17. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".09.")
    18. Dim sep As String = TblAuftragsbuchBindingSource.Count
    19. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".10.")
    20. Dim okt As String = TblAuftragsbuchBindingSource.Count
    21. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".11.")
    22. Dim nov As String = TblAuftragsbuchBindingSource.Count
    23. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", ".12.")
    24. Dim dez As String = TblAuftragsbuchBindingSource.Count
    25. Dim arr As Integer() = {jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, dez}
    26. Dim top As Integer = Nothing
    27. For u = 0 To arr.Count - 1
    28. If arr(u) > top Then
    29. top = arr(u)
    30. End If
    31. Next
    32. If top.ToString = jan Then
    33. LabelMonat.Text = "Januar " & "(" & top.ToString & ")"
    34. ElseIf top.ToString = feb Then
    35. LabelMonat.Text = "Februar " & "(" & top.ToString & ")"
    36. ElseIf top.ToString = mar Then
    37. LabelMonat.Text = "März " & "(" & top.ToString & ")"
    38. ElseIf top.ToString = apr Then
    39. LabelMonat.Text = "April " & "(" & top.ToString & ")"
    40. ElseIf top.ToString = mai Then
    41. LabelMonat.Text = "Mai " & "(" & top.ToString & ")"
    42. ElseIf top.ToString = jun Then
    43. LabelMonat.Text = "Juni " & "(" & top.ToString & ")"
    44. ElseIf top.ToString = jul Then
    45. LabelMonat.Text = "Juli " & "(" & top.ToString & ")"
    46. ElseIf top.ToString = aug Then
    47. LabelMonat.Text = "August " & "(" & top.ToString & ")"
    48. ElseIf top.ToString = sep Then
    49. LabelMonat.Text = "September " & "(" & top.ToString & ")"
    50. ElseIf top.ToString = okt Then
    51. LabelMonat.Text = "Oktober " & "(" & top.ToString & ")"
    52. ElseIf top.ToString = nov Then
    53. LabelMonat.Text = "November " & "(" & top.ToString & ")"
    54. ElseIf top.ToString = dez Then
    55. LabelMonat.Text = "Dezember " & "(" & top.ToString & ")"
    56. End If


    Gruß Madde

    Madde schrieb:

    ein wenig eigenem Verständnis zum Ziel zu kommen

    Madde schrieb:

    von daher, seid gnädig

    VB.NET-Quellcode

    1. Dim jan As String = TblAuftragsbuchBindingSource.Count
    Ich bin gnädig - daher frage ich dich gleich als ersteres für dein eigenes Verständnis:
    Was für ein Datentyp ist TblAuftragsbuchBindingSource.Count ?
    Und hast du Option Strict auf ON ?
    Danach

    VB.NET-Quellcode

    1. Dim arr As Integer() = {jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, dez}
    2. Dim top As Integer = Nothing
    3. For u = 0 To arr.Count - 1
    4. If arr(u) > top Then
    5. top = arr(u)
    6. End If
    7. Next

    -->

    VB.NET-Quellcode

    1. Dim top = {jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, dez}.Max()


    ##########

    Grundsätzlich solltest Du so viele Code-Dopplungen wie möglich durch Auslagerung entfernen. Eine Möglichkeit:

    VB.NET-Quellcode

    1. Private Function DatensatzAnzahl(Monatszeichen As String) As HierKorrektenDatentypEinfügen
    2. TblAuftragsbuchBindingSource.Filter = String.Format("CONVERT([Eingangsdatum],System.String) LIKE '%{0}%'", Monatszeichen)
    3. Return TblAuftragsbuchBindingSource.Count
    4. End Function


    Aber hey: Welchen Typ hat denn Eingangsdatum? Warum nicht direkt in der DataTable nach Datumsangaben suchen statt mit dem BS-Filter zu arbeiten?
    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.
    Warum nicht direkt in der DataTable nach Datumsangaben suchen statt mit dem BS-Filter zu arbeiten?

    Kann in etwa so mit einem Einzeiler funktionieren, wenn in der Tabelle das Datum im Datumsformat gehalten wird...

    VB.NET-Quellcode

    1. Dim mostCommonMonth = DeinDataset.DeineTabelle.GroupBy(Function(g) g.DeineDatumColumn.Month).OrderByDescending(Function(g) g.Count).First.Key
    2. lblMonat.Text = {"Jän", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"}(mostCommonMonth - 1)
    Aber was ist, wenn es mehrere Monate mit gleicher Häufigkeit gibt?

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

    Hallo, erstmal Danke für das Feedback.

    VB1963 schrieb:


    Was für ein Datentyp ist TblAuftragsbuchBindingSource.Count ?

    VaporiZed schrieb:


    Aber hey: Welchen Typ hat denn Eingangsdatum? Warum nicht direkt in der DataTable nach Datumsangaben suchen statt mit dem BS-Filter zu arbeiten?

    Das Datum ist auch im Datumformat in der Datatable abgelegt.

    Wenn die Filterung in der Datatable eventuell schneller geht, wäre ich für Tipps für die Umsetzung dankbar.

    Gruß Madde