- Beiträge: 2
Parameterdatei speichern mit mehreren Feldern
- Matthias Peter
- Autor
- Offline
- Benutzer
Weniger
Mehr
7 Jahre 4 Monate her #3253
von Matthias Peter
Parameterdatei speichern mit mehreren Feldern wurde erstellt von Matthias Peter
Hallo Robert,
ich benötige die Möglichkeit, bei div. Tabellen mit einem zusammengesetzten Primary Key, nur die geänderten Datensätze zu übermitteln.
d.h. es müssten die Primary Key Information der letzten Übertragung gespeichert werden, so dass beim nächsten Nachtlauf diese gespeicherte Information verglichen werden können. In der gleichen Abfrage sollen die übertragen werden mit dem Änderungsdatum >=getdate()-5.
Gruß Matthias Peter
purSoftware GmbH
ich benötige die Möglichkeit, bei div. Tabellen mit einem zusammengesetzten Primary Key, nur die geänderten Datensätze zu übermitteln.
d.h. es müssten die Primary Key Information der letzten Übertragung gespeichert werden, so dass beim nächsten Nachtlauf diese gespeicherte Information verglichen werden können. In der gleichen Abfrage sollen die übertragen werden mit dem Änderungsdatum >=getdate()-5.
Gruß Matthias Peter
purSoftware GmbH
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
7 Jahre 4 Monate her - 7 Jahre 4 Monate her #3254
von FlowHeater-Team
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
FlowHeater-Team antwortete auf Parameterdatei speichern mit mehreren Feldern
Hallo Matthias,
wenn deine Datenbasis einen Auto Inkrement Zähler oder aber eine Datumsfeld mit dem Erzeugungsdatum des Datensatzes hat ist das relativ einfach über FlowHeater Parameter und einem dynamischen SQL Statement auf der READ Seite umzusetzen.
z.B. SELECT * FROM tabellen_name WHERE ID > $LASTID$
so werden nur die seit der letzten Ausführung hinzugekommen Datensätze exportiert und verarbeitet.
So wie ich deine Frage verstehe ist bei Dir das aber nicht der Fall. Das unterstützt der FlowHeater noch nicht direkt, hierzu müsste ein kleines Skript für den .NET Script Heater verwendete werden.
Das Skript merkt sich die bereits verarbeiteten Datensätze anhand der dem Heater übergeben Eingangswerte. Diese Werte werden als Primary Key interpretiert und für die weitere Verwendung in einer separaten Textdatei (=Name = Name der Definition + Dateiendung .key) permanent gespeichert.
Wird die Definition ausgeführt liest das Skript diese Datei in eine interne HashTable ein um die bereits verarbeiteten Primary Key Werte zu erhalten. Pro Datensatz prüft dann das Skript ob dieser Schlüssel bereits verarbeitet wurde. Falls ja wird der Datensatz mittels des Filter Heater gefiltert, falls nein wird der Schlüssel in die Key/Schlüsseldatei für die weitere Verwendung weggeschrieben und der Datensatz wird anschließend ganz normal verarbeitet (nicht gefiltert).
Hinweis: Über diesen Mechanismus werden/müssen immer aller Daten der READ Seite verarbeitet werden. Besser bzw. performanter wäre es die Datenmenge bereits am SQL Server einzuschränken. Das ist natürlich nicht immer möglich!
Getestet wurde das Skript mit 1.000.000 Datensätzen auf der READ Seite. Die initiale Verarbeitung aller 1.000.000 Datensätze dauerte ca. eine Stunde. Ein anschließendes hinzufügen lediglich eines Datensatzes lief dann innerhalb einer Minute durch!
Im Anhang findest du eine kleines Beispiel, hier allerdings nicht SQL-Server bezogen sondern mit einfachen CSV Textdateien realisiert.
C# Skript um nur neue hinzugekommene Datensätze zu verarbeiten
wenn deine Datenbasis einen Auto Inkrement Zähler oder aber eine Datumsfeld mit dem Erzeugungsdatum des Datensatzes hat ist das relativ einfach über FlowHeater Parameter und einem dynamischen SQL Statement auf der READ Seite umzusetzen.
z.B. SELECT * FROM tabellen_name WHERE ID > $LASTID$
so werden nur die seit der letzten Ausführung hinzugekommen Datensätze exportiert und verarbeitet.
So wie ich deine Frage verstehe ist bei Dir das aber nicht der Fall. Das unterstützt der FlowHeater noch nicht direkt, hierzu müsste ein kleines Skript für den .NET Script Heater verwendete werden.
Das Skript merkt sich die bereits verarbeiteten Datensätze anhand der dem Heater übergeben Eingangswerte. Diese Werte werden als Primary Key interpretiert und für die weitere Verwendung in einer separaten Textdatei (=Name = Name der Definition + Dateiendung .key) permanent gespeichert.
Wird die Definition ausgeführt liest das Skript diese Datei in eine interne HashTable ein um die bereits verarbeiteten Primary Key Werte zu erhalten. Pro Datensatz prüft dann das Skript ob dieser Schlüssel bereits verarbeitet wurde. Falls ja wird der Datensatz mittels des Filter Heater gefiltert, falls nein wird der Schlüssel in die Key/Schlüsseldatei für die weitere Verwendung weggeschrieben und der Datensatz wird anschließend ganz normal verarbeitet (nicht gefiltert).
Hinweis: Über diesen Mechanismus werden/müssen immer aller Daten der READ Seite verarbeitet werden. Besser bzw. performanter wäre es die Datenmenge bereits am SQL Server einzuschränken. Das ist natürlich nicht immer möglich!
Getestet wurde das Skript mit 1.000.000 Datensätzen auf der READ Seite. Die initiale Verarbeitung aller 1.000.000 Datensätze dauerte ca. eine Stunde. Ein anschließendes hinzufügen lediglich eines Datensatzes lief dann innerhalb einer Minute durch!
Im Anhang findest du eine kleines Beispiel, hier allerdings nicht SQL-Server bezogen sondern mit einfachen CSV Textdateien realisiert.
C# Skript um nur neue hinzugekommene Datensätze zu verarbeiten
Code:
string keyfile = String.Empty;
Hashtable keys = new Hashtable();
public object DoWork()
{
if (keyfile.Length == 0)
{
// KeyFile anlegen, gleicher Dateiname wie Definition, Dateiendung = .key
keyfile = Path.GetFileNameWithoutExtension(AdapterRead.Definition.Flow.FileName) + ".key";
// bereits vorhandene Schlüssel einlesen
if (File.Exists(keyfile))
{
StringReader reader = new StringReader(File.ReadAllText(keyfile));
while(true)
{
string line = reader.ReadLine();
if (line == null)
break;
keys.Add(line, null);
}
}
}
// Key/Schlüssel zusammenbauen
string key = String.Empty;
for (int i = 0; i < InValues.Length; i++)
{
if (key.Length != 0)
key += " | ";
if (InValues[i].GetValue() == null || InValues[i].GetValue() == DBNull.Value)
key += "-null-";
else
key += (string)InValues[i].GetString();
}
// Prüfen ob Key/Schlüssel bereits verarbeitet wurde
if (!keys.ContainsKey(key))
{
// Key/Schlüssel noch nicht vorhanden, in Keyliste aufnehmen
keys.Add(key, null);
// nicht im Testmodus an Datei anfügen!
if (!TestMode)
File.AppendAllText(keyfile, key + Environment.NewLine);
// noch nicht vorhanden, dieser Datensatz muss verarbeitet werden
return false;
}
// Diesen Datensatz filtern
return true;
}
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
Anhänge:
Letzte Änderung: 7 Jahre 4 Monate her von FlowHeater-Team.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
Ladezeit der Seite: 0.261 Sekunden