FindRows in dataview mit Date

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von strzata.

    FindRows in dataview mit Date

    Guten Abend,
    es gelingt mir nicht, in einer DataView die DataRowViews mit einem bestimmten Datum zu finden.
    Die DataView ist schon gefiltert und mit einem RowFilter sortiert. Weil die Suche in einer Schleife läuft (alle Kalendertage), möchte ich den RowFilter nicht ständig neu setzen und deshalb ein FindRows nutzen.
    Die gesuchte Row hat z.B. in der Spalte C0503 den Wert #5/28/2024 06:52:37 AM#
    Das wird mir so im Visuial Studio in der Überwachung angezeigt. In der zu Grunde liegenden MySql Tabelle steht 2024-05-28 06:52:37

    Gesucht werden soll mit
    Dim found = dtView.FindRows(myDate)
    myDate ist ein Date im Format #5/28/2024 09:13:48 AM#
    Es matcht nicht, weil ja die Time unterschiedlich ist.

    Mit einer Datatable habe ich es hinbekommen.

    Quellcode

    1. Dim d As Date = myDate
    2. Dim found = (From dd In dt.AsEnumerable Let dp = CDate(dd("C0503").ToString.Trim).Date Where dp = d.Date Select r = dd).ToList


    Oder nach "ErfinderDesRades"

    Quellcode

    1. Dim rw = table.AsEnumerable().Where(Function(r) r.Field(Of Date?)("C0503").HasValue AndAlso r.Field(Of Date?)("C0503").Value.Date = Date.ToDay)

    Danke nochmal!

    Von einer DataView bin ich gewohnt, dass damit alles einfacher geht. Ich möchte aber auch nicht in der Schleife, in der sich ständig der zu suchende Wert ändert, immer in die DataTable wechseln. Jedoch will das FindRows einfach nicht funktionieren. Wie ist denn die korrekte Syntax? Wie trennt man die Time ab, so dass nur nach dem reinen Date gesucht wird? Kann mir jemand behilflich sein?

    Danke und Viele Grüße
    Norbert

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Eigentlich sucht man in der DataTable nicht im DataView.
    Dass dir das "einfacher" erscheint, liegt daran, dass du mit dem untypisierten Gestrüpp hantierst.
    Hast du dir mal den DataSet-Designer angeschaut? (Damit kann man sich typisierte DataTables basteln)

    Kannst du beschreiben, warum du den Wert suchst, bzw. was du wo mit dem gefundenen Resultat anstellst?
    Ich bin mir nichtmal sicher, ob FindRows für sowas vorgehen ist. Und dann verwirrt es mich warum du EdRs Lösung nicht nutzt.

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

    Danke für die schnelle Antwort.
    Typisiertes DS habe ich noch nie verwendet (Schimpf und Schande über mich ...) Aber wenn man jahrelang ohne ausgekommen ist und ständig gestresst ist von täglich vielen Aufgaben, die zu programmieren sind, scheut man sich vor der Einarbeitung. X(

    Da ich nunmal ein Dataview habe (ist wie gesagt eine Teilmenge einer großen Table mit einigen tausend Datensätzen) wollte ich darin auch suchen. Bei Verwendung der Originaltable müsste ich einiges umbauen (z.B. PrimaryKey erzeugen, Filterung, Sortierung ...) Ich könnte den Vorschlag von EDR verwenden und in dtView.Table suchen. Aber ich befürchte hierbei Leistungseinbußen. Oder gäbe es da keine?

    Ziel ist es:
    Ich gehe einen Zeitraum durch (z.B. vom 01.01.2014 bis heute) und will wissen, ob das jeweilige Datum in der View in der Column C0503 vorhanden ist. Wenn nicht, dann adde dieses Datum (dtView.AddNew). Die neue Row wird mit einigen Values bestückt. Alles bleibt sortiert und erscheint sofort korrekt in meinem angebundenen DataGridView.

    Wie die Date's formatiert sind habe ich oben beschrieben. Gibt es wirklich keine Möglichkeit, z.B. Date.Now in einer DataView in einem DataTime-Feld zu suchen? Eignetlich müssten doch nur die DateTime in Date geparst werden. Aber genau hier hänge ich fest.

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

    Ein typisiertes DS bedienst du wie ein Form. Nur statt Buttons irgendwo hinzuziehen, ziehst du Tabellen.

    strzata schrieb:

    Ich könnte den Vorschlag von EDR verwenden und in dtView.Table suchen. Aber ich befürchte hierbei Leistungseinbußen. Oder gäbe es da keine?
    Müsste man vermutlich ausprobieren.

    strzata schrieb:

    Gibt es wirklich keine Möglichkeit, z.B. Date.Now in einer DataView in einem DataTime-Feld zu suchen?
    Gibts bestimmt. Ich kenn mich nur so wenig mit den untypisierten Sachen aus. Die FindRows Methode sucht z.B im ganzen DataView und gibt alle gefundenen Zeilen zurück. Als Argument will die Methode so sieht es für mich aus den Wert der Key-Spalte haben. Ist C0503 der PrimaryKey?

    strzata schrieb:

    Eignetlich müssten doch nur die DateTime in Date geparst werden.
    Ne, DateTime und Date ist ein und derselbe Datentyp, zumindest in .NET
    DateTime-Werte mit 00:00:00 als Zeitkomponente gibts mit der Date Property (Also Date.Date, dudelige Benennung, aber eigentlich nicht verkehrt)

    Du könntest selbst durchs DataView laufen:

    VB.NET-Quellcode

    1. Dim found = False
    2. For i = 0 To DataView.Count - 1
    3. If CDate(DataView(i).("C0503")).Date = Date.Today Then
    4. found = True
    5. Exit For
    6. End If
    7. Next
    @Haudruferzappeltnoch:
    'n guten Abend, schön dass Du wieder da bist.
    Ist C0503 der PrimaryKey?

    Nein, Werte sind n-fach. Deshalb FindRows und nicht FindRow. Ist beim DataView auch nicht nötig. Eine Sortierung genügt. Lass mich aber belehren.

    An eine Schleife hab ich auch schon gedacht. Sie muss jedoch anders aussehen als Deine. Ich müsste alle Rows im "Kalender" (z.B. alle Tage vom 01.01.2014 bis heute, das sind über 4000 Datensätze) durchgehen und zu jedem Tag die Rows im DV mit einer weiteren inneren Schleife mit For ... Each und mit If .. = ... suchen. Bei 500 Rows im DV macht das 4000 X 500 = 2 Mio Durchläufe. Und da 1:n müsste ich noch Zählvariablen einfügen. Ob das sinnvoll ist?

    Mit Found hätte ich found.Length, was sich prima weiterverarbeiten lässt. Dehalb nochmal die Frage: wie lässt sich Date.Now in einer DataView in einem DateTime Feld finden ohne For .. Next? Wenn das zu lösen ist, wäre die Kuh vom Eis.

    In MySql wüsste ich, wie ich es machen müsste, nämlich mit WHERE IN. Könnte man nicht ein so ähnliches FindRows in .Net machen?
    Nochmal mein Ziel:
    Ich will alle Mitarbeiter/innen wissen, die seit 2014 (oder in anderen auswählbaren Zeiträumen) Fehltage hatten. Sie tragen sich täglich in eine Tabelle ein, wenn sie anwesend waren. Urlaub, krank oder Feiertage werden aussortiert (Modul dazu ist fertig).

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

    Das hab ich jetzt überhaupt nicht verstanden, found.Length gibt es nicht. found ist ein Boolean in meinem Code.

    strzata schrieb:

    In MySql wüsste ich, wie ich es machen müsste, nämlich mit WHERE IN. Könnte man nicht ein so ähnliches FindRows in .Net machen
    Na dann schreib den Sql doch mal hin. Da wird man sehr viel mehr dran sehen, als was du erklärst.Ohnehin fehlt da viel Input zum Iststand.
    Von einem Kalender hast du noch nix erwähnt, hier ging es bisher darum 1 Datum zu suchen.
    x IN y wird in .NET auf verschiedene Arten gelöst: Contains, Any, sicher noch viele andere. Bei allesamt, auch im SQL, muss dabei eine Liste durchlaufen werden, für jede einzelne Auswertung. So ein IN kann auch SQL-Abfragen gut ausbremsen, je nachdem was man braucht und wie das Datenmodell aufgebaut ist.

    Welche Fragen ich mir nun stelle, da obige Lösungen ja scheinbar alle nicht passen:
    Was ist die Quelle? Die echte Quelle, die rohen Daten. Eine Tabelle in einer Datenbank? Was steht da konzeptionell drin, die Anwesenheitstage der Mitarbeiter?
    Was zeigt das DataView im Kontrast zu diesen Rohdaten? Welcher Filter sitzt dazwischen, dass es nur eine Teilmenge ausweist?

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

    Ich blick da nicht durch - Mir scheinen hier im Thread verschiedene Anforderungen vorzuliegen:
    In post#1 werden Zeilen gesucht, die vorhanden sind, in post#5 werden Zeilen gesucht, die fehlen.

    Auch das Datenmodell ist unzureichend bekannt: Scheinbar gibt es eine Tabelle, mit einer Zeitpunkt-Spalte "C0503".
    Aber es gibt irgendwo auch Mitarbeiter, die gesucht werden. Möglicherweise gibts in der Tabelle aus Post#1 auch eine Spalte "MitarbeiterID" - aber das dürfen wir bislang nicht wissen.

    Ein anderes (?) Problem scheint zu sein, dass in der Zeitpunkt-Spalte nach Datums (ohne Zeitanteil) gesucht werden soll.
    Werden natürlich nicht gefunden, weil Datumse sind da nicht drin, sondern wie gesagt Zeitpunkte.
    Hier könnte man Abhilfe schaffen, indem man der DataTable eine Spalte zufügt, die aus C0503 extrahierte Datumse enthält.
    (keine Ahnung, ob dieser Hinweis in die richtige Richtung geht, bei Interesse nachfragen)

    Ja, soweit ins Blaue hinein.
    Genaueres kann man nur vorschlagen, wenn das Datenmodell mit allen relevanten Tabellen, Spalten und Zusammenhängen bekannt ist.
    Und eine einzige, klare Anforderung - nicht mal dies mal das und widersprüchlich.

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

    Vielen Dank für eure Mühe!
    Das hab ich jetzt überhaupt nicht verstanden, found.Length gibt es nicht. found ist ein Boolean in meinem Code.

    found hab ich explicit klein geschrieben, um zu zeigen, dass es ein DataRowView Array ist und kein Boolean

    Quellcode

    1. Dim found = dtView.FindRows(myDate.Date)
    2. If found.Length = 0 Then


    In SQL

    SQL-Abfrage

    1. SELECT * FROM t005 WHERE C0503 IN (SELECT C1 FROM kalender)

    Da hätte ich natürlich auch Probleme mit den Datumsformaten, aber dafür gibt es viele SQL-Funktionen (z.B. str_to_date)

    In 'kalender' stehen alle Kalendertage außer Sa, So, Feiertage (hier nur fiktive Tabelle, ch gehe die Datumse mit

    Quellcode

    1. While dStart < dEnde
    2. ... (finde dStart im dtView = Teilmenge von t005, ich will ja nicht 100 Jahre zurückgehen)
    3. dstart = dstart.AddDays(1)
    4. End While
    durch (dazu braucht es keine extra Tabelle) und wollte das found da rein packen.

    In 't005' stehen die Mitarbeiter an den Tagen, an denen sie anwesend waren. Fehlt jemand an einem Datum, hat er Fehlstunden (Arbeitszeitkonto Überprüfung).
    Die Abbildungen der Tabellen (Dateianhänge) sind nur beispielhaft und sollen nur das Grundgerüst erklären.

    @ErfinderDesRades
    Mit Deiner Linq Funktion in #1 wird in der DataTable gesucht und das klappt hervorragend. Ich hab mich nun mal auf die DataView versteift, weil mich die Lösung dieses Problems näher an die Sonne bringt (sprich Lernerfolg). Und ob ich suche, ob vorhanden oder nicht vorhanden: ich brauche beides und verarbeite im Nachhinein auch beides.
    Bilder
    • personal.png

      40,56 kB, 2.936×2.504, 39 mal angesehen
    • TabKalender.png

      30,85 kB, 2.936×2.504, 40 mal angesehen

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

    strzata schrieb:

    Da hätte ich natürlich auch Probleme mit den Datumsformaten, aber dafür gibt es viele SQL-Funktionen (z.B. str_to_date)
    Dann schreib die auch mit rein... Konvertierungen, die im SQL fehlen, werden auch im Code nicht automatisch gemacht.

    Das hier entspricht deinem letzten Codeschnipsel. Anhand deines SQL wird klar, dass es noch eine weitere Datensammlung gibt, als nur die, in der du suchst. Probier das:

    VB.NET-Quellcode

    1. ...
    2. If Not HasRowsOf(dtView, myLookUpDates) Then
    3. ...
    4. Private Function HasRowsOf(dv as DataView, kalender as IEnumerable(Of Date))
    5. Dim found = False
    6. For i = 0 To dv.Count - 1
    7. For each tag in kalender
    8. If CDate(dv(i).("C0503")).Date = tag.Date Then
    9. found = True
    10. Exit For
    11. End If
    12. Next
    13. If found Then Exit For
    14. Next
    15. Return found
    16. End Function
    Eine Liste an Datümmern zu übergeben, halte ich für sinnvoller, da ich vermute, dass die eher klein ist.
    Wenn kein Ergebnis gefunden wird, spielts natürlich keine Rolle.

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Dann schreib die auch mit rein...

    Braucht wider Erwarten nur die date() funktion

    SQL-Abfrage

    1. SELECT * FROM t005 WHERE DATE(C0503) IN (SELECT DATE(C1) FROM kalender)


    Hast mich vielleicht missverstanden. Das SQL ist nur ein Beispiel wie ich es machen könnte. Ich wende es jedoch nicht an. Ich bilde meine Table und die View so:

    Quellcode

    1. Private Function GetTable() As DataTable
    2. Dim cmd As New MySqlCommand("SELECT * FROM t005 WHERE C0501 LIKE '" & Worker & "%'", _conn)
    3. Dim da As New MySqlDataAdapter(cmd)
    4. Dim t As New DataTable
    5. t.Locale = Globalization.CultureInfo.InstalledUICulture
    6. da.Fill(t)
    7. Return t
    8. End Function

    Quellcode

    1. dtView = dt.DefaultView
    2. dtView.Sort = "C0503 ASC"
    3. DGV.DataSource = dtView

    Daran will ich auch nichts ändern, da sonst nachfolgend viele Umbauten notwendig würden.

    Nun zu Deiner #9 (ich komme gar nicht mit dir mit, bist schneller als der Schall)
    Zwei verschachtelte Schleifen hatte ich schon in #5 diskutiert. Danke für Deine Mühe. Ist eine Lösung. Mein Ziel ist also klar. Aber ich suche wirklich nach einer Lösung ohne Schleifen. Geht sicherlich mit Linq? Oder Hash's? Bin kein großes Licht in dieser Frage. EDR hat für die DataTable auch ein Linq mit einer einzigen Zeile gebaut. Warum soll's nicht mit DVs gehen.

    Bei Verwendung von Schleifen muss ich zu viel drum herum bauen. Mitarbeiter arbeiten auch gleitend. Das heisst vormittags mal 3 Stunden und dann abends nochmal. Ich brauche also einige Zählvariablen, die ich mitführen müsste uam. In "meinem" found, was ja leider noch nicht funktioniert (aber ich gebe die Hoffnung nicht auf) hätte ich wirklich alles zusammen, was ich brauche.

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

    strzata schrieb:

    Und ob ich suche, ob vorhanden oder nicht vorhanden: ich brauche beides und verarbeite im Nachhinein auch beides.
    Na, wenn du vorhandenes suchst, das ist ja extrem einfach:

    VB.NET-Quellcode

    1. Dim sMinDate = "9/11/2001"
    2. Dim sMaxDate = Date.Today.AddDays(1).ToString(System.Globalization.CultureInfo.InvariantCulture)
    3. Dim dv = New DataView(myTable)
    4. dv.RowFilter = $"c0503> '{sMinDate}' AND c0503 < '{sMaxDate}'"
    Nun enthält dv alle Datensätze mit c0503-Werten, deren Datümer auch in deim "calender" vorkommen täten.
    Einfacher und wohl auch performanter natürlich ohne DataView:

    VB.NET-Quellcode

    1. Dim minDate = #9/11/2011#, maxDate = Date.Today.AddDays(1)
    2. Dim rows = myTable.AsEnumerable.Where(Function(x)
    3. Dim dt = CDate(x("c0503"))
    4. Return dt > minDate AndAlso dt < maxDate
    5. End Function).ToArray
    Nun enthält rows alle Datensätze mit c0503-Werten, deren Datümer auch in deim "calender" vorkommen täten.

    Übrigens empfehle ich dir sehr, Strings auf moderne Art zusammenzusetzen - verbesserte Beispielzeile aus post#10

    VB.NET-Quellcode

    1. 'statt
    2. Dim cmd As New MySqlCommand("SELECT * FROM t005 WHERE C0501 LIKE '" & Worker & "%'", _conn)
    3. 'mach
    4. Dim cmd As New MySqlCommand($"SELECT * FROM t005 WHERE C0501 LIKE '{Worker}%'", _conn)

    Das nennt man String-Interpolation, und dazu setzt man $ vor den String, und kann dann im String mit {...} Ausdrücke einbasteln.

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

    Ihr lieben Helferlein - vielen vielen Dank!
    Wahrscheinlich habe ich gerade ein Brett vorm Kopf. Ich brauche doch "vorhandenes" und auch "nicht vorhandenes. EDR hat mich wohl bekehrt, dass ein DV Mist ist. Dennoch:

    Wie in der t005 zu sehen, stehen in C0503 der Arbeitsbeginn und in C0504 das Ende. Auch mehrfach an einem Tag (Mitarbeiter hat die Zeiten gesplittet). Am Monatsende (oder auch mal für ein ganzes Jahr) will ich die Sollstunden (z.B. 35 Stunden pro Woche, also 7 Stunden am Tag) mit den Ist-Stunden zusammen rechnen und vergleichen und im "Arbeitsstunden Konto" in der t005 mitführen (Spalte C0506).
    Ist es nicht so, dass ich (wie im Beispiel oben), beim Durchlaufen des Kalenders für jeden Tag den RowFilter neu setzen muss, um das Stundenkonto zu berechnen (wieviel Stunden gearbeitet, wieviel Stunden gefehlt)?

    Ich hatte gedacht:
    nimm ein Datum - schaue in der t005 nach wieviel Stunden anwesend - weniger als 7 dann Fehlzeit abziehen - mehr als 7 Stunden dann Mehrzeit addieren. Wenn gar nicht anwesend dann 7 Stunden abziehen. Wenn Urlaubstag oder krank 7 Stunden addieren. Zeiten lassen sich nicht manipulieren. Mit Mausklick wird immer die Systemzeit eingetragen. Funktioniert wie bei einer Stechuhr. Und das nur, weil wir von unserem Steuerbüro die Auflage erteilt bekommen haben, für alle Mitarbeiter eine fälschungssichere Arbeitszeitenerfassung mit gesetzlich vorgeschriebenen Pausen nachzuweisen. Was hatten wir früher für ein ruhiges Leben ...

    Nun enthält dv alle Datensätze mit c0503-Werten, deren Datümer auch in deim "calender" vorkommen täten.

    Wie soll ich ich damit die täglichen Arbeitszeiten berechnen? Wie gesagt: wahrscheinlich Brett vorm Kopp.

    Das nennt man String-Interpolation, und dazu setzt man $ vor den String, und kann dann im String mit {...} Ausdrücke einbasteln.

    Hab ich schon oft gesehen. Endlich weiss ich, was das bedeutet. Danke!

    Hab mal meinen Coden rauskopiert. Eine Berechnung für die zurückliegenden 60 Tage.

    Quellcode

    1. Private Sub BerechneKonto(idx As Integer)
    2. dtView.RowFilter = $"C0503 > #{Today.AddDays(-60).ToString("MM/dd/yyyy")}#"
    3. Dim start As Date = CDate(dtView(0)("C0503"))
    4. Dim dEnde As Date = Today.AddDays(1)
    5. DGV.DataSource = Nothing
    6. If dtView.Count > 0 Then
    7. mkonto = CDec(dtView(dtView.Count - 1)("C0506")) 'letzter Kontostand
    8. End If
    9. While start < dEnde
    10. If "0,6".Contains(CStr(CInt(start.DayOfWeek))) Then 'Sa, So
    11. start = start.AddDays(1)
    12. Continue While
    13. End If
    14. Dim found = dtView.FindRows(start.Date) 'wenn ich hier die gefundenen Rows erhalten würde, wäre alles prima
    15. If found.Length = 0 Then
    16. 'wenn nicht krank, feiertag, urlaub
    17. Dim nrow As DataRowView = dtView.AddNew
    18. nrow("C0501") = Worker & " " & start.ToString("ddd", New Globalization.CultureInfo("de-DE"))
    19. nrow("C0502") = "frei"
    20. nrow("C0503") = start
    21. nrow("C0506") = mkonto
    22. mkonto -= CDec(7.3)
    23. Else
    24. Dim hours As Decimal = 0
    25. Dim drv As DataRowView = Nothing
    26. For Each drv In found
    27. hours += Math.Round(CDec((CDate(drv("C0504")) - CDate(drv("C0503"))).TotalMinutes / 60), 2)
    28. drv("C0506") = 0
    29. Next
    30. mkonto += hours - CDec(7.3)
    31. drv("C0506") = mkonto
    32. End If
    33. start = start.AddDays(1)
    34. End While

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

    strzata schrieb:

    Wie in der t005 zu sehen,
    Hast du die Bilder von den Tabellen mal selbst versucht zu lesen? Da kann man nix sehen.

    strzata schrieb:

    Wie soll ich ich damit die täglichen Arbeitszeiten berechnen?
    Ein Datensatz heißt eine Zeile. Und in der Zeile hast du ja selbst gesagt steht Start und Ende drin.

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

    Ja in einer Zeile. Ich habe aber
    alle Datensätze mit c0503-Werten, deren Datümer auch in deim "calender" vorkommen täten.

    Und was ist mit den Tagen, die nicht enthalten sind? Muss ich wieder im "Kalender" nachsehen, war es Samstag, Sonntag, Feiertag oder hatte der Mitarbeiter frei? Schwierig.
    Hast du die Bilder von den Tabellen mal selbst versucht zu lesen? Da kann man nix sehen.

    Tut mir leid. Wie muss ich das ändern? Ich habe einen Screenshot gemacht, den in Paint geworfen. Speichern unter und dann die Datei hier reingezogen. Habs mir hier angesehen. Man kann unten auf den "Spreizen" Button und dann auf die Lupe klicken. Geht dann gerade so. Ich weiss es leider nicht besser. Sagst Du es mir, wie ich es machen muss?

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

    Für Feiertage braucht man nunmal n Kalender, das ist ja in jeder Kommune unterschiedlich.
    In deinem Code aus Post 13 ersetze Zeile 17 dtView.FindRows durch EdRs Vorschlag aus Post 12. myTable ist dtView.Table.
    Ersetze den Return entsprechend das dort nur dein start.Date geprüft wird statt von-bis

    strzata schrieb:

    Sagst Du es mir, wie ich es machen muss?
    Tja, so mach ichs auch. Hast du den Hintergrund zu groß? Die Leinwand sozusagen?
    @Haudrauerzappeltnoch:
    Danke dass Du nicht aufgibst! Paint ist nicht meins, ich arbeite lieber mit Photoshop. Aber beim nächsten Image versuche ich es besser zu machen.
    In deinem Code aus Post 13 ersetze Zeile 17 dtView.FindRows durch EdRs Vorschlag aus Post 12. myTable ist dtView.Table

    Das könnte die Lösung sein. Ich probiers gleich aus. Ich muss ja Rows einfügen. Wenn ich das in der Table mache - sind die dann gleich in der View? Denn die View sortiert sich automatisch ohne PrimaryKey (wichtig fürs angebundene DGV). Sonst müsste ich die Table wieder in eine View umwandeln und DataSource des DGV neu setzen. Wenn das alles nicht funktioniert, muss ich die Table erst in die DB wegschreiben und neu holen. Ich bin ja gespannt. Hoffentlich kann ich Dir Erfolg vermelden.

    Ergebnis:
    Hab mich an Dein Posting in #2 erinnert
    Eigentlich sucht man in der DataTable nicht im DataView.

    Und das war genau richtig. Wenn ich dtView.Table verwende wirds kompliziert. Ich muss hinten statt ToArray ein CopyToDataTable machen und aus dieser Table wieder ein View machen. Und das bei jedem Datum im Kalender. Ich steige nun doch wieder auf meinen Ursprung ohne DataView um. Bin nur gespannt, ob die Table dann korrekt sortiert im Grid erscheint, wenn ich neue Datensätze angefügt habe.


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

    Weil Rows hinzukommen. Wenn jemand an einem Tag nicht in der Praxis war, hat er auch keinen Eintrag in der t005 gemacht. Bei der Berechnung muss ich eine Row mit 7 Stunden minus einfügen. Es muss später sichtbar sein, sonst wundert sich der Mitarbeiter später, woher die Fehlstunden kommen. Der Umbau dauert, ich muss morgen weiter machen. Schönen Abend noch.
    LG Norbert
    Da würde eine BindingSource helfen. Ein DataTable, die per BindingSource an ein DGV gekoppelt wird, aktualisiert das DGV automatisch.

    Da sind wir auch wieder bei

    strzata schrieb:

    Aber wenn man jahrelang ohne ausgekommen ist und ständig gestresst ist von täglich vielen Aufgaben, die zu programmieren sind, scheut man sich vor der Einarbeitung
    Einen Spagat wie du hier zu programmieren versuchst, kann man sich nach einer Einarbeitung in die gegebenen Tools, getrost sparen. Du sitzt jetzt schon länger hier im Forum am Tippern als es dauert sich sich eine typisierte DataTable zu Gemüte zu führen