Prüfen ob Datensatz vorhanden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von AndreasD.

    Prüfen ob Datensatz vorhanden

    Hallo zusammen,
    bevor ihr mich steinigt ich hab schon Mr. Google bemüht aber ich steh, da ich blutiger Anfänger in Sachen DB bin, total auf dem Schlauch und bräuchte einen Denkanstoß.
    Kurzum ich habe eine Form in Visual Studio erstellt in der auch Tableadapter für die entsprechenden Tabellen eingebunden sind. Das schreiben in die entsprechende Tabelle ist kein Problem nun wollte ich vor dem Schreiben prüfen lassen ob der Datensatz anhand der Felder Nr und d vorhanden ist aber irgendwie bekomm ich das nicht hin.
    Hier das von mir gebastelte:

    VB.NET-Quellcode

    1. Dim d As Date
    2. Dim zeit As Integer
    3. Dim krank As Integer
    4. Dim frei As Integer
    5. Dim nr As Integer = limport.Text
    6. Dim t As Date
    7. Dim a As Integer
    8. Dim te As Integer
    9. If Not cvoll.Checked And Not chalb.Checked And Not ckrank.Checked And Not curlaub.Checked Then
    10. MessageBox.Show("Sie müssen eine Arbeitszeit Option wählen")
    11. Else
    12. If cvoll.Checked Then
    13. zeit = 24
    14. End If
    15. If chalb.Checked Then
    16. zeit = 12
    17. End If
    18. If ckrank.Checked Then
    19. krank = 1
    20. End If
    21. If Not curlaub.Checked Then
    22. frei = 0
    23. End If
    24. ' Für jedes slektierte Datum
    25. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    26. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    27. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    28. Next
    29. MessageBox.Show("Ihre Eingabe wurde verarbeitet")
    30. End If

    AndreasD schrieb:

    wollte ich vor dem Schreiben prüfen lassen ob der Datensatz anhand der Felder Nr und d vorhanden ist
    Möchtest du etwas durchsuchen?
    Und wenn ja, was?
    Im gezeigten Code ist nichts zu sehen, was man irgendwie durchsuchen könnte.

    Eine DataTable könnte man durchsuchen.
    Aber welche, wie heisst die?
    Der Table Adapter ist ArbeitTableAdapter (steht unten bei der Dim nz). Das DateSet heißt ZeitV1DataSet...ich hoffe dass ich da jetzt nicht was durcheinander bringe in meiner Denke. Beides habe ich in Visual Studio direkt auf die Form gezogen und es wird mir um unteren Bereich angezeigt
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ups sorry falsch verstanden die DataTable heißt Arbeit, ich hoffe das passt denn irgendwie verliere ich gerade etwas den Überblick von dem ganzen ausprobieren.

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

    probierma sowas:

    VB.NET-Quellcode

    1. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    2. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    3. dim rwArbeit = ZeitV1DataSet.Arbeit.FirstOrDefault(function(x)x.nr=nr andalso x.d=d)
    4. if rwArbeit isnot Nothing then MessageBox.Show($"{nr} und {d} gibts schon!")
    5. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    6. Next
    Sorry ich hatte soviel im Kopf dass ich mich nichtig ausgedrückt habe aber ich habe eine Lösung gefunden in die ich nur noch die Fehlermeldungen reinwursteln muss

    VB.NET-Quellcode

    1. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    2. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    3. Dim row As DataRow
    4. Dim dt As DataTable = Zeitv1DataSet.Tables("arbeit")
    5. 'alle Zeilen des DataTable durchlaufen
    6. For Each row In dt.Rows
    7. If row!manr = nr And row!datum = d Then
    8. Else
    9. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    10. End If
    11. Next
    12. Next


    Code-Tags eingefügt. ~Thunderbolt

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

    Hättst dir garnet soo viel Mühe machen brauchen - Einfach sagen, wie die Spalten wirklich heissen - nämlich nicht Nr und d, sondern mannr und datum!

    Nu probier nochma, wies vlt. richtig geht:

    VB.NET-Quellcode

    1. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    2. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    3. Dim rwArbeit = ZeitV1DataSet.Arbeit.FirstOrDefault(Function(x) x.mannr = nr AndAlso x.datum = d)
    4. If rwArbeit IsNot Nothing Then
    5. MessageBox.Show($"{nr} und {d} gibts schon!")
    6. Else
    7. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    8. End If
    9. Next

    Oh, ich glaub ich hab dein Anliegen falsch verstanden. Ich dachte, du suchest eine bestimmte Row, und wenns die nicht gibt, wird sie angelegt.
    Aber wenn ich dein Code betrachte, dann willst du wohl massenhaft Datensätze anlegen, ausser es gibt ihn schon.
    Aber auch dann ist das sehr komisch, was du machst:

    VB.NET-Quellcode

    1. For Each row In dt.Rows
    2. If row!manr = nr And row!datum = d Then
    3. Else
    4. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    5. End If
    6. Next
    Angenommen, es sind 10 rows in deiner DataTable - alle mit einem anderen Datum als d.
    Dann erzeugt deine Schleife 10 mal denselben Datensatz auf der Datenbank. Und das zu jedem Datum d!
    Noch wüster wirds, wenn mehrere manr auftreten, die sich von nr unterscheiden.
    Ich glaub wir reden aneinander vorbei. Es ist eine Stundenverwaltung für mehrere Mitarbeiter die natürlich verschiedene manr haben. Bei der Eingabe sind verschiedene manr und gleiches Datum oder gleiche manr und verschiedene Daten ok. Sollte aber bei der Eingabe die Kombi manr, datum schon vorhanden sein dann soll eine Fehlermeldung kommen und nicht schreiben.
    Mein Code ist nicht das wahre... und er schreibt grundsätzlich ins Table... Super deine Geduld mit mir!!
    Je nachdem wieviel im Monthkalender markiert ist und die Daten nicht vorhanden sind solle Datensätze erstellt werden also z.b manr = 1 und markiert =1-5.09.2021
    index 1 manr 1 1.9.
    index2 manr 1 2.9. usw
    Ih habs jetzt so gelöst:

    Wenn ich mit IsNot und else funktionierts nicht, so klappt es nun. Jetzt noch die Fehlermeldungen einbastenl und nach dem Schreiben die Table neu laden ...


    VB.NET-Quellcode

    1. If Not cvoll.Checked And Not chalb.Checked And Not ckrank.Checked And Not curlaub.Checked Then
    2. MessageBox.Show("Sie müssen eine Arbeitszeit Option wählen")
    3. Else
    4. If cvoll.Checked Then
    5. zeit = 24
    6. End If
    7. If chalb.Checked Then
    8. zeit = 12
    9. End If
    10. If ckrank.Checked Then
    11. krank = 1
    12. End If
    13. If Not curlaub.Checked Then
    14. frei = 0
    15. End If
    16. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    17. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    18. Dim rwArbeit = Zeitv1DataSet.arbeit.FirstOrDefault(Function(x) x.manr = nr AndAlso x.datum = d)
    19. If rwArbeit Is Nothing Then
    20. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    21. End If
    22. Next
    23. End If


    Code-Tags eingefügt. ~Thunderbolt

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

    AndreasD schrieb:

    und nach dem Schreiben die Table neu laden
    Wie wäre es, wenn du den DataAdapter so nütztest, wie er gedacht ist?
    Dann würdest du die Änderungen im Dataset machen, und anschliessend mit einem Befehl an die DB senden.
    Ein erneutes Laden aller Daten - die vorher ja auch schon in der Anwendung waren - ist doch völlig unnützer Db-Traffic.

    Probierma so:

    VB.NET-Quellcode

    1. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    2. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    3. Dim rwArbeit = ZeitV1DataSet.Arbeit.FirstOrDefault(Function(x) x.mannr = nr AndAlso x.datum = d)
    4. If rwArbeit Is Nothing Then
    5. rwArbeit = ZeitV1DataSet.Arbeit.AddArbeitRow(nr, d, zeit, krank, frei)
    6. End If
    7. Next
    8. ArbeitTableAdapter.Update(ZeitV1DataSet.Arbeit)
    Sicherlich muss zeile #5 angepasst werden, weil ich weiss ja nicht die genauen Parameter, die die .AddArbeitRow()-Methode erwartet.
    Ich weiss nur, dass es diese Methode gibt - die wird mit-generiert, wenn es eine typisierte ArbeitDataTable gibt.




    Was anderes: bitte stell doch deine codes so ein, dass man sie auch lesen kann:

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

    So endlich hatte ich mal Zeit ... das funktioniert

    VB.NET-Quellcode

    1. For i = 0 To DateDiff(DateInterval.Day, MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)
    2. d = MonthCalendar1.SelectionRange.Start.AddDays(i)
    3. If d > Today Then
    4. MessageBox.Show("Bitte prüfen Sie Ihre Eingabe, ihr eingegebenes Datum ist größer als as heutige")
    5. Else
    6. Dim rwArbeit = Zeitv1DataSet.arbeit.FirstOrDefault(Function(x) x.manr = nr And x.datum = d)
    7. If rwArbeit Is Nothing Then
    8. Dim nz = ArbeitTableAdapter.Insert(nr, d, zeit, krank, frei)
    9. Dim nz2 = ArbeitTableAdapter.ClearBeforeFill()
    10. Dim nz3 = ArbeitTableAdapter.Fill(Zeitv1DataSet.arbeit)
    11. End If
    12. End If
    13. Next


    CodeTags gesetzt ~VaporiZed

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