vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 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
Hat ein DataTable sich geändert 
Autor: henrikl2000
Datum: 29.10.14 16:14

Wie kann ich beim Exit meines Programmes wissen ob ein DataTable sich geändert hat.
Beim Load Ereignis wird eine Kopie von meiner DataTable gemacht.
Ich habe es in FormClosing mit GetChanges versucht aber das funktioniert nicht.
        If dtEngine.GetChanges Is Nothing Then
            MsgBox("No changes")
        Else
            MsgBox("Changes made")
        End If
Kann man einfach 2 DataTables vergleichen wäre das vielleicht eine Möglichkeit.
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: Manfred X
Datum: 29.10.14 18:09

Hallo!

Man kann den Inhalt von 2 Datatable-Instanzen vergleichen.

Wie wird die Datatable beim Programmstart gefüllt? Datenquelle?

Geht es um das Erkennen von Änderungen der geladenen Daten oder
des Inhalts der Datenquelle?

Änderungen seit wann?
Seit dem letzten Update der Datenquelle?
Seit dem aktuellen Programmstart?
Seit dem letzten (davor liegenden) Start des Programms?

Wodurch können Änderungen zustande kommen?
Durch den Benutzer-Dialog? Durch den Programmcode (Algorithmen)?
In solchen Fällen: Bei Datenzuweisungen eine Kennung setzen!
Kann es vorkommen, daß Änderungen wieder rückgängig gemacht
werden (UNDO)?

Besitzen die Datensätze eine eindeutige ID (Schlüssel)?
Werden im Programm komplette Datensätze hinzugefügt oder
gelöscht? Auch Spalten? Oder werden nur Zellinhalte modifiziert?

Kann es während der Programmausführung zum Nachladen von Daten aus
der Quelle kommen? Ist es möglich, daß dabei auch andere Table-Eigenschaften
neu gesetzt werden (z.B. Spalten-Ensemble, Spalten-Header, Valuetypes)?

Welche Zielsetzung ist mit dem Erkennen von Änderungen beim Programm-EXIT
verbunden? Durchführen eines Update der Datenquelle?
Hinweis an den Benutzer? Aktualisieren eines Änderungsprotokolls?
Wie differenziert soll die Reaktion sein? Ein allgemeiner Hinweis
oder detailliert (geänderte Zeilen, geänderte Zellen?)

usw.

Beitrag wurde zuletzt am 29.10.14 um 18:27:05 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: Christoph1972
Datum: 29.10.14 18:11

Hi,

was ist denn mit .GetChanges()? Bei mir funktioniert das.

Gruß
Christoph

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: henrikl2000
Datum: 29.10.14 20:46

Hallo,

Beim Start des Programms wird eine Datei eingelesen und eine DataTable (dtEngine) wird mit diesen Daten gefüllt. Dasselbe kann mit einem Button gemacht werden.
Eine Kopie der DataTable wird erstellt (dtUndo).
Was ich beim Abschluss meines Programms gerne wissen möchte. Ist Änderungen in dtEngine Zeit einlesen der Daten gemacht worden.
Änderungen in dtEngine können unterwegs mit Verschiebung von ein oder mehrere DataPoints passieren.
Ich habe mit folgendem Code inzwischen eine Lösung. Ich bin mir aber nicht sicher ob dass die beste Lösung ist. Ich meine es gibt sicher ein einfacher und eleganter Lösung.

    Private Sub frmMain_FormClosing(sender As Object, e As _
      System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Dim IsEqual As Boolean = True
        For i = 0 To dtEngine.Rows.Count - 1
            If Not dtEngine.Rows(i).Item(2).Equals(dtUndo.Rows(i).Item(2)) Or _
              Not dtEngine.Rows(i).Item(3).Equals(dtUndo.Rows(i).Item(3)) Then
                IsEqual = False
            End If
        Next
 
        If IsEqual = False Then
            Dim Answer As MsgBoxResult
            Answer = MsgBox("You have made changes. Do you want to save the" & _
              "changes?", MsgBoxStyle.YesNo, "Changes made")
            If Answer = MsgBoxResult.Yes Then
                MsgBox("Saving")
            End If
        End If
 
    End Sub
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: ModeratorDaveS (Moderator)
Datum: 29.10.14 21:23

DataTables haben keine "Reihenfolge" der Sätze, SQL erkennt sowas nicht. Wenn es darum geht ist keine "Änderung" vorhanden. Warum setzt du nicht einfach ein "Dirty Bit" wenn etwas "geändert" wird?

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: Manfred X
Datum: 29.10.14 21:26

Wenn Du während der Programmausführung die Datatable-Methode
"AcceptChanges" nicht aufrufst, sollten ggf. die geänderten Zeilen
durch "GetChanges" abgerufen werden können.
Ein Abgleich der Daten mit einer zweiten DataTable-Instanz wäre
unnötig.
Wie trägst Du die Änderungen in die Datatable ein?

(Unmittelbar nach dem vollständigen Füllen der Table beim
Programmstart - aus der Datei - solltest Du "AcceptChanges" rufen.)

Per Datenbindung? Per Code?
Was machst Du sonst noch mit der Table? Weitere Daten laden o.ä.?

Übrigens:
Die Abfolge der Zeilen in einer Datatable (Rows-Auflistung) sollte
stets als "nicht definiert" betrachtet werden.
Tables sollten deshalb eine Spalte besitzen, in der für jede Zeile
eine eindeutige Kennung eingetragen ist.

Beitrag wurde zuletzt am 29.10.14 um 21:52:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: henrikl2000
Datum: 30.10.14 08:44

Hallo,

Danke für deine immer schnelle Antwort.

Ich habe jetzt wie du es vorschlägt. AcceptChanges gleich nach ausfüllen von der Table beim Programmstart gesetzt.
Und jetzt funktioniert es mit Getchanges.

Ich verwende die Table in mein Chart um DataPoints zu setzen.
                            Dim dp As New DataPoint
 
                            dp.XValue = CInt(dtEngine.Rows(i).Item(0))     ' RPM
                            dp.YValues = {CInt(dtEngine.Rows(i).Item(3))}  ' HP
Bei Änderungen wird die Table mit den Änderungen auf datiert. Beim Speichern der Daten wird die Table gebraucht um eine existierende Datei auf zu datieren.

Das hier unten habe ich nicht ganz verstanden. Meinst du damit dass ich eine Spalte machen soll für eine ID?
Ich habe in meiner DataTable Spalten für RPM, Brake, Torque und HP
Die Spalte RPM wird mit Daten gefüllt die nicht gleich sind also eindeutig.

Übrigens:
Die Abfolge der Zeilen in einer Datatable (Rows-Auflistung) sollte
stets als "nicht definiert" betrachtet werden.
Tables sollten deshalb eine Spalte besitzen, in der für jede Zeile
eine eindeutige Kennung eingetragen ist.

0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: Manfred X
Datum: 30.10.14 12:55

Die Zeilen in einer Datatable bilden eine Auflistung.
Es können deshalb Zeilen gelöscht, eingefügt oder angehängt werden.
Durch solche Operationen verändert sich der Bezug zwischen
dem "rowindex" und der Datenzeile, die dadurch abgefragt wird.

Aus diesem Grund benötigt man eindeutige Schlüssel, wenn man
Datensätze in Tables auf den Inhalt einer Datenbank oder auf
andere Tables beziehen will. Schlüssel können über mehrere Spalten
definiert sein.

Hier ein Beispiel für eine Beziehung zwischen zwei Tabellen
in einem Dataset über eine Datarelation (per PrimaryKey).

Private Sub TableRelation()
 
    Dim dt1 As New DataTable
 
    dt1.Columns.Add("RPM", GetType(Integer))
    dt1.Columns.Add("Sound", GetType(String))
 
    With dt1.Rows
         .Add(1000, "surr")
         .Add(1200, "brumm")
         .Add(1500, "brumm")
         .Add(2500, "pfeif")
         .Add(4000, "rassel")
         .Add(5000, "schepper")
         .Add(6000, "kaputt")
    End With
 
    dt1.PrimaryKey = {dt1.Columns("RPM")} 'eindeutiger Schlüssel
 
    Dim dt2 As New DataTable
 
    dt2.Columns.Add("RPM_2", GetType(Integer))
    dt2.Columns.Add("Sound", GetType(String))
 
    With dt2.Rows
       .Add(2500, "brumm")
       .Add(4000, "quietsch")
       .Add(6000, "jaul")
       .Add(1500, "surr")
       .Add(1200, "surr")
       .Add(1000, "surr")
    End With
 
    dt2.PrimaryKey = {dt2.Columns("RPM_2")} 'eindeutiger Schlüssel
 
    'gemeinsames Dataset
    Dim ds As New DataSet("RPM_Set")
 
    ds.Tables.Add(dt1) : ds.Tables.Add(dt2)
 
    'Beziehung zwischen Tabellen über eine Datarelation
    Dim dr As New DataRelation _
        ("RPM_Relation", dt1.Columns("RPM"), dt2.Columns("RPM_2"), True)
    ds.Relations.Add(dr)
 
 
    For r1 As Integer = 0 To dt1.Rows.Count - 1
        'korrespondierende Zeilen zur r-Zeile in dt1 '
        'per Relation aus dt2 abfragen
        Dim rows_in_dt2 As DataRow() = dt1.Rows(r1).GetChildRows(dr)
        If rows_in_dt2.Count = 0 Then
           Console.WriteLine _
           (dt1.Rows(r1)("RPM").ToString & _
            " keine Entsprechung in Tabelle 2")
        Else
           For rc As Integer = 0 To rows_in_dt2.Count - 1
              Console.WriteLine _
              (dt1.Rows(r1)("RPM").ToString & "--->" & _
               rows_in_dt2(rc)("Sound").ToString)
           Next rc 'Childrows zur row r1 ind dt1
        End If
    Next r1
 
End Sub


Beitrag wurde zuletzt am 30.10.14 um 12:56:58 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hat ein DataTable sich geändert 
Autor: henrikl2000
Datum: 30.10.14 13:11

Danke für deine Auskunft reiche Beschreibung.
0
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