Dynamischer Daten Import / Export

datenbank

weil Einfach - produktiver ist
Mit der Freeware Version können bis zu 100.000 Datensätze verarbeitet werden!
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
Willkommen im FlowHeater Support Forum!

Hier werden Fragen zum Umgang mit dem FlowHeater beantwortet.
  • Seite:
  • 1

THEMA: Parameterdatei speichern mit mehreren Feldern

Parameterdatei speichern mit mehreren Feldern 4 Monate 2 Wochen her #3253

  • Matthias Peter
  • Matthias Peters Avatar Autor
  • Offline
  • New Member
  • New Member
  • Beiträge: 2
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

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Parameterdatei speichern mit mehreren Feldern 4 Monate 2 Wochen her #3254

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Administrator
  • Beiträge: 1248
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 allerding nicht SQL-Server bezogen sondern mit einfachen CSV Textdateien realisiert.

C# Skript um nur neue hinzugekommene Datensätze zu verarbeiten
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;
}

Dateianhang:

Dateiname: nur-neue-datensaetze-verarbeiten.zip
Dateigröße: 3 KB
Anhang:

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

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.
Letzte Änderung: von FlowHeater-Team.
  • Seite:
  • 1
Moderatoren: FlowHeater-Team
Ladezeit der Seite: 0.090 Sekunden