vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 02.02.18 11:26

Hallo zusammen,

meine Anwendung soll einträge löschen können nach 90 Tagen so ähnlich wie Outlook?

wie sieht so eine Abfrage für eine Datatable aus?

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 02.02.18 14:17

Hallo!

Und woher kommt die erforderliche Information über das "Alter"
eines Datesatzes? Gibt es ein entsprechendes Datenfeld in der Tabelle?
In dem Fall:
Worin besteht das Problem bei der Berechnung des Zeitintervalls
zwischen "Now" und dem Zeitstempel in den Datensätzen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 02.02.18 17:32

ich habe mal dies probiert, ist aber falsch nur was weiß ich noch nicht.

 Dim Abfrage = From Eintrag In BS_Eingang_Liste
                      Where Eintrag.RowState <> DataRowState.Deleted AndAlso _
                        Eintrag.IsBestelldatumNull = False AndAlso _
                            Eintrag.Bestelldatum >= "#" & Format(Now, _
                            "yyyy.MM.dd") & "#" AndAlso _ 
        Select Eintrag
 
 
        If Abfrage.Count = 0 Then Exit Sub
 
        For Each Eintrag In Abfrage : Eintrag.Delete() : Next
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 02.02.18 18:10

noch ein Ansatz da befürchte ich das er alle löscht

 Dim von_Datum = Today.AddDays(-5)
 
        Dim Abfrage = From Eintrag In BS_Eingang_Liste
                      Where Eintrag.RowState <> DataRowState.Deleted AndAlso _
                        Eintrag.IsBestelldatumNull = False AndAlso _
                            Eintrag.Bestelldatum < von_Datum _
        Select Eintrag
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 02.02.18 19:36

Tja. Was soll das eigentlich?
Du knallst hier Code rein ohne jede Erklärung.
Eine LINQ-Abfrage löscht keine Datensätze in der Datenquelle.

Ist BS_Eingang_Liste eine Bindingsource? Wie ist "Eintrag" deklariert?
Was bedeutet Bestelldatum? Ist das eine Date(Time)-Spalte?
Enthält diese Spalte jeweils das kritische Datum des Datensatzes?

Wieso Today.AddDays(-5)? Es sollen doch 90 Tage subtrahiert werden?

Zu klären wäre eventuell noch die Behandlung der Tageszeit
(Bestelldatum bei Berechnung auf auf 00:00 Uhr setzen)?

'Löschen der Datensätze aus "dt", 
'wenn der Eintrag in Datetime-Spalte "Columnname" 
'mehr als "Days" Tage zurückliegt
 
    Private Sub DeleteOldRows(ByVal Dt As DataTable, _
        ByVal Columnname As String, ByVal Days As Integer)
 
        For i As Integer = Dt.Rows.Count - 1 To 0 Step -1
            If Not IsDBNull(Dt.Rows(i)(Columnname)) Then
                If CDate(Dt.Rows(i)(Columnname)) < Today.AddDays(-Days) Then
                    Dt.Rows(i).Delete()
                End If
            End If
        Next i
    End Sub


Beitrag wurde zuletzt am 02.02.18 um 19:41:50 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 03.02.18 09:31

Hallo und Danke,

Ja hast natürlich Recht

Ist BS_Eingang_Liste eine Bindingsource? Ja Wie ist "Eintrag" deklariert?
Was bedeutet Bestelldatum? Artikel Bestellungen im Wareneingang Historie
Ist das eine Date(Time)-Spalte? Ja (Format(dd.mm.yyyy)
Enthält diese Spalte jeweils das kritische Datum des Datensatzes? Ja

Wieso Today.AddDays(-5)? sollte nur zum testen sein
Es sollen doch 90 Tage subtrahiert werden? Ja

Zu klären wäre eventuell noch die Behandlung der Tageszeit
(Bestelldatum bei Berechnung auf auf 00:00 Uhr setzen)? OK

ich denke für den User wäre auch sicher eine Auflistung der Datensätze die da gelöscht werden Sinnvoll?
evtl. die älteren Daten in eine DGV und dort entscheiden löschen Ja Nein?

in der Datenbank gibt es nicht täglich Daten

Bestelldatum
29.04.2010
15.04.2011
19.04.2012
13.02.2013
01.04.2013
usw bis Heute
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 03.02.18 10:27

Hallo!

[I]Ich denke für den User wäre auch sicher eine Auflistung der Datensätze die da gelöscht werden Sinnvoll? evtl. die älteren Daten in eine DGV und dort entscheiden löschen Ja Nein?[/I]

Dazu kann ich nichts sagen!
Die Entscheidung über das Löschen von Bestelldaten aus einer Datenbank,
kann eine "komplizierte" Operation sein.
Es gibt dabei gewöhnlich mehrere Datums-Werte - z.B.:
- die Aufgabe der Bestellung durch den Kunden
- eine Frist für die kostenlose/kostenpflichtige Stornierung der Bestellung
- die Bestätigung des Kunden, die Waren vollständig erhalten zu haben
- eine Frist, in der die Ware vom Kunden geprüft und ggf. zurückgeschickt werden kann
- die vollständige Bezahlung der Ware (Geldeingang)
- Telefon-Support-, Garantie- und Gewährleistungs-Zeiträume
- bei Teilzahlung: die Kreditlaufzeit

Es gibt - im Einzelfall - auch gesetzlich vorgegebene Dokumentations- und
Aufbewahrungspflichten (z.B. Steuer, Versicherung).

Ob das Löschen von Daten willkürlich durch den User per Dialog oder systematisch
durch einen geeigneten Algorithmus erfolgen soll, ist deshalb nicht allgemein zu
beantworten.

Eventuell reicht ein Dataview (Bindingsource-Filter), um die gezielte Löschung
von Datensätzen per Dialog zu ermöglichen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 03.02.18 10:48

Danke für die Anregungen, doch dient meine Anzeige nur Intern. der Eigentliche Vorgang einer Bestellung
wird in seperaten Systemen abgewickelt, ich muss hier also keiner der Anmerkungen berücksichtigen.
evtl. ist bei mir der Befriff "Bestellung" nicht ideal.


Ob das Löschen von Daten willkürlich durch den User per Dialog oder systematisch
durch einen geeigneten Algorithmus erfolgen soll, ist deshalb nicht allgemein zu
beantworten.
wie könnte das aussehen ?
Eventuell reicht ein Dataview (Bindingsource-Filter), um die gezielte Löschung
von Datensätzen per Dialog zu ermöglichen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 03.02.18 11:25

Eine kleine Hilfsfunktion für die Filter-Eigenschaft der
Bindingsource - näheres in der VB-Doku im Kapitel "Datacolumn.Expression".
Private Function GetExpressionDate(ByVal dat As DateTime) As String
 
        'System.Globalization.DateTimeFormatInfo.InvariantInfo
 
        With dat
            Return "#" & .Month.ToString & _
                "/" & .Day.ToString & _
                "/" & .Year.ToString & "#"
        End With
End Function
Der Bestelldatum-Filter wird einfach in die Bindingsource "bs" eingetragen:
Dim del_date As DateTime = Today.AddDays(-90) 'kritisches Datum
bs.Filter = "Bestelldatum < " & GetExpressionDate(del_date) 'Filter
Sätze mit DbNull-Wert in der Spalte "Bestelldatum" werden nicht angezeigt.

Beitrag wurde zuletzt am 03.02.18 um 11:35:10 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 03.02.18 12:36

Oh Manfred X,

Danke funktioniert!
habe den Filter erweitert damit er mir nur die gelieferten älteren Dateneinträge anzeigt
  Dim del_date As DateTime = Today.AddDays(-90) 'kritisches Datum
                BS_Eingang.Filter = "geliefert = True And Bestelldatum < " & _
                  GetExpressionDate(del_date)  'Filter
wie ist die Funktion zu verstehen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 03.02.18 13:14

Hallo Manfred,

hier mal meine löschen Sub Prozedur, die auch funktioniert
ist das aber grundsätzlich falsch? ich muss auch ja speichern.

ich bin hier mal auf das lieferdatum gegangen und delete_Date auf -100 Tage eingestellt

 Private Sub Delete_AlteDatensaetze()
        Dim del_date As DateTime = Today.AddDays(-100) 'kritisches Datum
 
        Dim Abfrage = From Eintrag In BS_Eingang_Liste
                      Where Eintrag.RowState <> DataRowState.Deleted AndAlso _
                            Eintrag.Lieferdatum < del_date _
        Select Eintrag
 
 
        Dim anzahlDatensaetze As Integer = Abfrage.Count
 
        If Abfrage.Count = 0 Then Exit Sub
 
        Dim Abfrage_Result As DialogResult = MessageBox.Show(anzahlDatensaetze _
          & " wirklich endgültig entfernen?", "Sicherheits-Abfrage", _
          MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
          MessageBoxDefaultButton.Button2)
        If Abfrage_Result = System.Windows.Forms.DialogResult.No Then Return
 
        Me.Cursor = Cursors.WaitCursor
 
        For Each Eintrag In Abfrage : Eintrag.Delete() : Next
 
        Me.Validate()
        BS_Eingang.EndEdit()
 
        dict_BS_Pos.Clear()
        dict_BS_Pos.Add(BS_Eingang, BS_Eingang.Position)
        mod_Saver.SaveDataset(Me.LagerDB, dict_BS_Pos, _
          EingangTableAdapter.Adapter) 'Reihenfolge! - Parent-Adapter zuerst
 
        modus_Eingang = DatensatzModus.Fertig
        TP_gesperrt = False
        dgv_Eingang_Einkauf_SelectRow()
        Me.Cursor = Cursors.Default
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 03.02.18 16:34

Das kann ich nicht beurteilen, weil ich die Datenumgebung
und deren Aufbau nicht kenne.

Warum nicht einfach so:
Dim del_date As DateTime = Today.AddDays(-90)
bs.Filter = "Bestelldatum < " & GetExpressionDate(del_date)
 
If Not MsgBox("Sollen diese " & bs.count.tostring & " Sätze gelöscht werden?", _
            MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then Exit Sub
 
For i As Integer = bs.Count - 1 To 0 Step -1
   'In typisierten Bindingsourcen kann das Casten entfallen
   DirectCast(bs(i), DataRowView).Delete()
Next i
 
bs.filter = ""
 
'DB-Update ausführen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 03.02.18 16:37

So wie es in der oben angegebenen Dokumentation steht.

Der Filter-Vergleich von DateTime-Spalten mit einem Datum muß
die invariante Kultur verwenden.
Man kann entweder direkt formatiert abfragen (siehe Comment-Zeile)
oder die erforderliche Zeichenfolge selbst zusammenbauen (siehe Code).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 03.02.18 18:00

Supi Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 04.02.18 10:11

Hallo Manfred X,

eine Frage kann man für die Lösch Prozedur auch eine Progressbar anzeigen für den Anwender
Löschvorgang zu 30% ... erledigt? das würde doch Sinn machen bei 1500 Datensätzen

und wie könnte man das einbauen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 04.02.18 11:11

Die Anzeige des Fortschritts macht eigentlich nur Sinn
bei der Ausführung des Datenbank-Updates.
Ob bzw. wie die Progress-Rückmeldung möglich ist, hängt von der
verwendeten Update-Methode ab.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 04.02.18 11:23

ich denke das Modul dazu erklären kriege ich wahrscheinlich nicht hin

ich beende mit BS_Eingang.EndEdit()

und speichere in mein Dataset über tableadapter

würdest du mir trotz deiner meinung eine Lösch Progressbar zeigen?

  'DB-Update ausführen
 
        BS_Eingang.EndEdit()
 
        dict_BS_Pos.Clear()
        dict_BS_Pos.Add(BS_Eingang, BS_Eingang.Position)
        mod_Saver.SaveDataset(Me.LagerDB, dict_BS_Pos, _
          EingangTableAdapter.Adapter) 'Reihenfolge! - Parent-Adapter zuerst
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: ERBRU
Datum: 04.02.18 11:57

OK ich habe es so probiert, läuft auch aber ist das auch sicher?

 Private Sub upd_Progress_Daten_loeschen(ByVal Meldung As String, ByVal cnt As _
   Integer)
        pgb_delete.Value += cnt
        lbl_Value.Text = Meldung
        lbl_Value.Refresh()
        System.Threading.Thread.Sleep(15)
    End Sub
und hier den Code ergänzt:

........
        pgb_delete.Maximum = CInt(BS_Eingang.Count)
        pgb_delete.Minimum = 0
        pgb_delete.Value = 0
 
        System.Threading.Thread.Sleep(2000)
 
        For i As Integer = BS_Eingang.Count - 1 To 0 Step -1
            'In typisierten Bindingsourcen kann das Casten entfallen
            DirectCast(BS_Eingang(i), DataRowView).Delete()
 
            upd_Progress_Daten_loeschen("Daten werden gelöscht", 1)
        Next i
was meinst du zu der Lösung? und wie könnte man das in % angeben
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensätze löschen älter 90 Tage 
Autor: Manfred X
Datum: 04.02.18 12:49

Innerhalb des geladenen Dataset (In-Memory)
irgendwelche Aktualisierungen im Fortschritt anzuzeigen,
macht gewöhnlich keinen Sinn.
Das Umsetzen von einigen tausend DataRow.State-Werten
innerhalb einer Schleife geschieht in Sekunden-Bruchteilen.

Rechenzeit-relevant ist höchstens das Update.Kommando für
die Datenbank selbst.
Bei einem TableAdapter.Update kannst Du nicht nur das Dataset oder
eine einzelne Datatable, sondern auch paketweise Zeilen updaten.

Allerdings bremst Du dadurch vermutlich den Update-Vorgang aus.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel