Laden...

Datensatz kopieren bei "Veränderung"

Erstellt von SideKick vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.086 Views
SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren
Datensatz kopieren bei "Veränderung"

verwendetes Datenbanksystem: <Oracle>

Hallo,

Ich habe eine Oracle-Datenbank, TableAdapter, DataSet, BindingSource, BindingsNavigator und die Form mit den Formularfelder.

Es soll ein wöchenlicher Status erzeugt werden (nur bei Veränderung)
Es gibt eine Spalte bei der ein Standardewert "Erstellungsdatum" automatisch hinzufügt wird.

Wenn ich einen Datensatz (Tupel) verändere und er älter als 1 Woche ist, soll dieser kopiert (Klon) werden.

Der neue Datensatz (Klon) soll anschließend die Daten bekommen die ich in der Form eingegeben habe.

Methoden: (Abstrakt)

* Ist Datensatz veändert UND > 1 Woche
* Mache eine Kopie (ist Status aktuelle Woche)
* Die Kopie bekommt die Daten von der aktuellen Form

Gibt es eine Stelle / Klasse die mir sagt das sich ein Datensatz verändert hat.

Das einzige was mir einfällt ist ... Daten beim laden Speichern (z.B. Array) und beim Entladen vergleichen ... geht das nicht einfacher ?

Gruß SideKick

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Hallo,

ich gehe wascheinlich jetzt folgenden Schritt. (Unwichtiges habe ich weggelassen)

  1. Beim Öffnen der Form sollen alle Daten(1) aus der Form gelesen werden. (ArrayA)

  2. Beim Schließen der Form sollen alle Daten(2) aus der Form gelesen werden. (ArrayB)

  3. Vergleiche ArrayA mit ArrayB

  4. Wenn sich die Daten verändert haben...

  5. ... Erzeuge einen neuen Datensatz mit den Daten aus der Form.

Wenn ich ein Event (changed(Daten)) hätte würde ich die Schritte 1 bis 4 nicht brauchen ...?

So nun brauche noch ein Event das mir den Wechsel eines Datensatz anzeigt ... (Wechsel von Datansatz 44 auf 45)

mfg.
SideKick

476 Beiträge seit 2004
vor 12 Jahren

Hallo SideKick,

Gibt es eine Stelle / Klasse die mir sagt das sich ein Datensatz verändert hat.

du kannst über den RowState prüfen ob sich eine DataRow verändert hat. Auch kannst du herausfinden ob eine DataRow neu hinzugefügt oder gelöscht wurde. Mehr zu RowStates findest du hier über die Forensuche oder über die MSDN.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Hallo @Yellow,

Danke erst mal !

schaut schon mal nicht schlecht aus, bin noch am Basteln.

Ich gebe noch Bescheid wenn ichs fertig habe

SideKick

F
10.010 Beiträge seit 2004
vor 12 Jahren

Hör auf zu basteln und beschäftige dich mal mit den Grundlagen von ADO.NET.

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Hör auf zu basteln und beschäftige dich mal mit den Grundlagen von ADO.NET.

Würde ich gerne machen, habe mich schon mit den Grundlagen von Oracle und MS-SQL beschäftigen müssen ... jetzt habe ich es eillig, mein Firma benötigt die Software ... ADO.NET kommt auch noch. Danke für den Tipp 😃

476 Beiträge seit 2004
vor 12 Jahren

Hallo SideKick,

Hör auf zu basteln und beschäftige dich mal mit den Grundlagen von ADO.NET.
Würde ich gerne machen, habe mich schon mit den Grundlagen von Oracle und MS-SQL beschäftigen müssen ... jetzt habe ich es eillig, mein Firma benötigt die Software ... ADO.NET kommt auch noch. Danke für den Tipp 😃

die Zeit die du für die Grundlagen verwendest holst du sicherlich durch Einsparungen bei den Bastelarbeiten wieder ein.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Hallo,

ich denke das jetzt alles in Ordnung ist

Nun habe ich das Event (Dank an @Yellow) das bei Tabellenänderungen auslöst 🙂

Ablauf (Abstrakt)1.Wenn sich der Datensatz ändert ... 1.Und das Datum älter als 7 Tage ... 1.Mache eine Kopie von dem Datensatz (== letzter Statusbericht) 1.Der aktuelle Datensatz bekommt eine aktuelles Datum 1.Fertig


private void Report_Load(object sender, EventArgs e)
{
    //Hinzufügen eines RowChanging-Event-Handler für Tabele
    dataSetHLS.T_PROJEKTE_STATUS.RowChanging += new DataRowChangeEventHandler(Row_Changing);
}

static Boolean MakeDate;

private void Row_Changing(object sender, DataRowChangeEventArgs e)
{
	//Wenn der aktuell Datensatz gelesen wird ...
	//Die Variable CurID wurde beim Aktivieren der Form gesetzt
	//"e.Row[13].ToString()" ist das Feld mit dem Datum
	if (CurID == e.Row[13].ToString())
	{
		//Wenn das Event-Argument auf "Change" gesetzt ist ...
		//Datensatz wurde geändert !
		if (e.Action.ToString() == "Change")
		{
			//Berechne den Zeitunterschied
			TimeSpan diff = DateTime.Now - (DateTime)e.Row[24];

			//Wenn der Datum > als eine Woche ist ...
			if (diff.Days > 7)
			{
				//Der Datensatz ist in der DB noch nicht verändert worden!
				//Kopiere den Datensatz (per SQL) == letzter Statusbericht
				StringBuilder sb = new StringBuilder();
				sb.Append("INSERT INTO t_PROJEKTE_STATUS ( ");
				sb.Append("SELECT * FROM t_PROJEKTE_STATUS WHERE ID = ");
				sb.Append(e.Row[0]);
				sb.Append(")");

				//=> Schicke SQL-Code an meine SQL-Klasse (SQL-Code ausführen)
				OracleToolBox otb = new OracleToolBox();
				otb.RunSqlCommand(sb.ToString());


				/* Um Parallelitätsverletzung zu vermeiden bekommt der aktuelle  
				 * Datensatz das aktuelle Datum erst nach nach dem Commit!
				 * Deshalb merken!
				 */
				MakeDate = true; //Schalter ein!
			}
		}
		if (e.Action.ToString() == "Commit")
		{
			if (MakeDate)
			{
				//Der bestehende Datensatz bekommt das aktuelle Datum (per SQL)
				StringBuilder sb = new StringBuilder();
				sb.Append("UPDATE t_PROJEKTE_STATUS SET ERSTELLUNGSDATUM = SYSDATE ");
				sb.Append("WHERE ID = ('");
				sb.Append(e.Row[0]);
				sb.Append("')");

				//=> Schicke SQL-Code an meine SQL-Klasse (SQL-Code ausführen)
				OracleToolBox otb = new OracleToolBox();
				otb.RunSqlCommand(sb.ToString());

				MakeDate = false; //Schalte aus!
			}
		}
	}
}