Datagridview daten nach selektierten Datumsbereich anzeigen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Drachie.

    Datagridview daten nach selektierten Datumsbereich anzeigen

    Moin zusammen,

    habe da eine kleine verständnisfrage:

    ich habe in einer DGV Daten die ich filtern will wie z.b. von Datum XX.XX.XXXX bis Datum YY.YY.YYYY

    die Daten sollen dann auch vom ersten datum bis einschließlich das letzte Datum angezeigt werden.

    hinbekommen habe ich das zwar im Grunde schon, nur wird mit inner nur die Daten bis zum vortage des zweiten Datum angezeigt.

    bsp: ausgewählter Zeitraum: 10.4.2016 - 16.04.2016

    angezeigt wird mir die daten für 10.4.2016 - 15.04.2016 aber nicht für 10.4.2016 - 16.04.2016.

    ist das Normal oder muss ich bei der auswahl des zweiten datums immer +1 tag hinzuzählen damit er die Datensätze auch vom ausgewählten Tag des zweiten Datums anzeigt?
    @Drachie Da musst Du in der selektierenden Routine etwa so was schreiben (Pseudocode):

    Quellcode

    1. For date = 10.4.2016 To 16.04.2016
    2. ' ...
    3. Next
    also to <=, nicht aber to <.
    Wie genau sieht denn der begrenzende Ausdruck aus?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    anbei der ausschnitt aus dem code

    VB.NET-Quellcode

    1. Dim datum1 As String = CType(DateTimePicker1.Value, String)
    2. Dim datum2 As String = CType(DateTimePicker2.Value, String)
    3. Dim x As New DataView(LabeldruckerDataSet.gls_print)
    4. x.RowFilter = String.Format("starttime >= '{0}' and starttime <= '{1}'", datum1, datum2)
    5. DataGridView1.DataSource = x


    datumsauswahl: 15.4. - 16.4. (dort sollten auch die datensätze vom 16.4. angezeigt werden, was nicht passiert)
    2019-04-16 12_54_11-Report Versandlabel UPS _ GLS.png

    datumsauswahl: 15.4. - 17.4. (hier werden dann wiede die daten richtig angezeit. wenn datum2 +1 tag ist)
    2019-04-16 12_53_47-Report Versandlabel UPS _ GLS.png
    Bilder
    • 2019-04-16 12_53_47-Report Versandlabel UPS _ GLS.png

      33,21 kB, 1.293×273, 21 mal angesehen
    • 2019-04-16 12_54_11-Report Versandlabel UPS _ GLS.png

      26,26 kB, 1.295×235, 18 mal angesehen
    den Zeitteil ist aus der Elementeingenschaft entfernt worden, das rein das Datum nur Angezeigt und ausgegeben wird

    Vollzitat entfernt. ~Thunderbolt

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

    dem Studio zufolge schon:
    2019-04-16 15_15_47-Reporter Labeldruck - Microsoft Visual Studio.png

    als auch bei der ausgabe des filtersring in einer Messageboc für die Demonstration das nur die gewählten datumen benutzt werden:
    2019-04-16 15_19_00-Report Versandlabel UPS _ GLS.png
    Bilder
    • 2019-04-16 15_15_47-Reporter Labeldruck - Microsoft Visual Studio.png

      7,45 kB, 368×276, 15 mal angesehen
    • 2019-04-16 15_19_00-Report Versandlabel UPS _ GLS.png

      28,15 kB, 1.080×209, 17 mal angesehen
    1. weil die gefilterten daten später noch an einen Crystal Report / Rdlc report übergeben werden in der als datatsource die DGV dient.
    2. das enddatum wird auch per DateTimePicker festgelegt. da bringt mir es recht wenig von dem Value nochmals 2 tage abzuziehen....

    Vollzitat entfernt. ~Thunderbolt

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

    Drachie schrieb:

    den Zeitteil ist aus der Elementeingenschaft entfernt worden, das rein das Datum nur Angezeigt und ausgegeben wird
    dann mache einfach bei Zeile #5 oben in deinem Code einen Haltepunkt rein und schaue dir den Inhalt von Datum1 und Datum2 an...

    Drachie schrieb:

    VB.NET-Quellcode

    1. CType(DateTimePicker1.Value, String)
    Du solltest ggf. einen besser geeignetet String als Vergleichsobjekt generieren.
    Informiere Dich zunächst, was das DGV da haben will oder spiel ein wenig mit dem Format rum, z.B. DateTime.Now.ToString("yyyy-MM-dd").
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Drachie schrieb:


    2. das enddatum wird auch per DateTimePicker festgelegt. da bringt mir es recht wenig von dem Value nochmals 2 tage abzuziehen....


    Vielleicht solltest Du Dir den Thread ansehen bevor Du sowas schreibst. Es geht um die Funktion "AddDay" und genau die wird dort beschrieben. Du kannst doch einfach den Value samt AddDay(1) einer DateTime Variablen übergeben und die dann zum String für deinen Filter wandeln. Aber wenn Du Dir die Mühe nicht machen willst, Tipps erst zu nehmen und zu überprüfen, dein Ding.
    Danke dass Du mich offensichtlich für dämlich hältst.
    Was irgendwo im DGV oder im DTP oder in einem anderen CE angezeigt wird, ist vollkommen wurscht. Was in der Tabelle oder im DTP als tatsächlicher Wert hinterlegt ist, ist einzig relevant.

    Wenn Du die DateTimePicker-Werte hernimmst, wird Dir zwar das Datum angezeigt, aber die DTPs enthalten auch die (aktuelle) Zeit:

    Abhängig davon, was jetzt bei startdate in Deiner Tabelle steht, kann es also passieren, dass der Filter entweder den Anfangstag (im DateTimePicker1 (DTP1)) verschluckt, oder auch den Endtag (DTP2).
    Beispiel: In der DataTable siehst Du über das DGV 11.04.2019. Tatsächlich aber steht der Zeitpunkt(!) drin, bei dem die Zeile angelegt wurde. Oder vielleicht ein anderer Zeitpunkt, wir wissen ja nicht, wie Du die Daten in die DataTable schreibst. Dann steht dann also als vollständiger Wert z.B. 11.04.2019 09:45:00 drin. Wenn Du jetzt mithilfe Deiner DTPs den Filter aktivierst, kommt es mit Deinem Code drauf an, zu welchem Zeitpunkt Du das machst. Wenn Du um 12:16 sagst: Alle Zeilen anzeigen zwischen 11.04.2019 und 16.04.2019. Dann werden die Zeilen angezeigt, die das startdate zwischen 11.04.2019, 12:16:00 und 16.04.2019 12:16:00 haben. Also Deine 11.04.2019 09:45:00-Zeile fällt durch den Filter durch! Wenn Du den Filter aber 3 Stunden vorher aktiviert hättest, würde die Zeile angezeigt werden. Genauso passiert es mit dem DTP2-Wert für Zeilen, die uhrzeittechnisch nach dem Filteraktivieren erzeugt wurden. in der DataTable-Zeile steht immer noch 11.04.2019 09:45:00 und Du willst alle Zeilen vom 01.04.2019 bis zum 11.04.2019 habe, aktivierst aber den Filter 08:45. Dann ist die Zeile vom 11.04. ebenfalls wegen der Uhrzeit raus. Daher z.B.:

    VB.NET-Quellcode

    1. Dim datum1 As String = CType(DateTimePicker1.Value, String)
    2. Dim datum2 As String = CType(DateTimePicker2.Value.Date.AddDays(1), String)
    3. Dim x As New DataView(Tds.gls_print)
    4. x.RowFilter = String.Format("starttime >= '{0}' and starttime < '{1}'", datum1, datum2)
    5. DataGridView1.DataSource = x

    Größtenteils unverändert. Aber beachte Zeile#2 und #4: Es werden nun nur noch die Datumskomponenten verwendet und beim DTP2 wird noch 1 Tag draufgerechnet. Zusätzlich wird der Filter von <= auf < geändert. Dann passt es. Dann wird vom DTP1-Datum 00:00 Uhr bis DTP2.Datum 23:59:59,999... alles angezeigt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Man kann auch die Stunden, Minuten und Sekunden vorgeben. Aus dem Kopf also ungetestet:

    VB.NET-Quellcode

    1. Dim dt2 As DateTime = New DateTime(DateTimePicker2.Year, DateTimePicker2.Month, DateTimePicker2.Day, 23, 59, 59)
    2. Dim datum2 As String = CType(dt2, String)


    Der Vergleich wäre also "<=" (kleiner gleich).
    Der gewählte Tag ist als Includiert. Man kann aber auch

    VB.NET-Quellcode

    1. Dim dt2 As DateTime = New DateTime(DateTimePicker2.Year, DateTimePicker2.Month, DateTimePicker2.Day + 1, 0, 0, 0)
    2. Dim datum2 As String = CType(dt2, String)

    schreiben. In dem Fall müsste der Vergleich "<" (kleiner) lauten.
    @VaporiZed:
    Danke für den hinweis. dementsprechend habe ich mit den Datensatz in der DGV angesehen welcher ausgegeben wird und die DTP entsprechend angepasst, das diese jetzt den Zeitraum 00:00:00.001 bis 23:59:59.999 umfassen und die Daten entsprechend angezeigt werden können.

    für das Nächste mal weiß ich es jetzt.