Dynamischer Daten Import / Export

datenbank

weil Einfach - produktiver ist
Mit der Freeware Version können bis zu 10.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.

THEMA: Untercheiden Update/Insert je Satz

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1962

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
Hallo
Bisher gefällt mir FH sehr gut, Kompliment.
Eines konnte ich bisher aber nicht rausfinden:

Wie kann ich zwischen Update und Insert unterscheiden?
Einige Sätze werden inserted, da soll in gewissen Feldern so was wie ein Key generiert werden, aber wenn der gleiche Satz nächstes mal updated wird, soll der Key bestehen bleiben.

Wie macht man das?

Gruss
Guido Worch
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1963

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Beiträge: 1099
Hallo Herr Worch,

wenn Sie im Datenbank Adapter auf der WRITE Seite Inserts und Updates aktivieren kümmert sich der FlowHeater darum automatisch. Anhand des definierten Primary Key (Eindeutiges Kriterium) prüft der FlowHeater ob ein Datensatz bereits existiert oder nicht und führt die dementsprechende SQL Aktion aus.

Hier finden Sie ein Beispiel inkl. kleiner Access Datenbank wie das funktioniert: CSV Import MS Access, vorhandene Datensätze werden aktuallisiert
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: 1 Jahr 6 Monate her von FlowHeater-Team.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1966

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
Hallo
Das ist nicht was ich meine.
Ich übertrage Sätze von A nach B.
Es gibt ein Feld PHYSID.
Jeder Satz, der in B angelegt wird, braucht eine neue PHYSID,
welche per SQL Skript ermittelt wird.
Beim Update müssen das Feld PHYSID aber intakt bleiben, darf nicht mit
PHYSID von A überschrieben werden.

Also
If INSERT then B.PHYSID = (SQL)
Else keine Aktion.

Ich möchte verhindern, zwei Definitionen zu unterhalten.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1969

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Beiträge: 1099
Hallo Herr Worch,

dann bräuchte ich ein paar mehr Informationen.
  1. Ist das Feld PHYSID gleichzeitig der Primary Key der Tabelle? Wenn ja gibt es evtl. noch ein anderes eindeutiges Kriterium?

  2. Was meinen Sie mit wird per SQL gesetzt. Wird das Feld per Auto Inkrement von der Datenbank (z.B. Access, SQL Server, MySQL) oder aber Verwenden Sie hierfür einen Datenbanktrigger oder aber eine SEQUENCE (z.B. ORACLE, PostgreSQL)?

  3. Wenn möglich posten Sie bitte mal die erstellte Definition so kann ich mir ein von dem Tabellenschema der WRITE Seite machen.

  4. Ein paar mehr Hintergrundinformationen wären ggf. ebenfalls hilfreich.

PS: Wenn das Feld nicht der Primary Key der Tabelle ist und das Feld von der Datenbank Automatisch gesetzt wird reicht es aus wenn Sie dem Feld keinen Wert zuweisen = kein Feld mit diesem Verbinden.
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.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1971

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
FlowHeater schrieb:
Hallo Herr Worch,

dann bräuchte ich ein paar mehr Informationen.
  1. Ist das Feld PHYSID gleichzeitig der Primary Key der Tabelle? Wenn ja gibt es evtl. noch ein anderes eindeutiges Kriterium?

  2. Es ist nicht per Primkey

  3. Was meinen Sie mit wird per SQL gesetzt. Wird das Feld per Auto Inkrement von der Datenbank (z.B. Access, SQL Server, MySQL) oder aber Verwenden Sie hierfür einen Datenbanktrigger oder aber eine SEQUENCE (z.B. ORACLE, PostgreSQL)?

  4. Es ist eine Sequence(formatiert) die per SQL gelesen und in das Feld geschriebenen wird.

  5. Wenn möglich posten Sie bitte mal die erstellte Definition so kann ich mir ein von dem Tabellenschema der WRITE Seite machen.
  6. Werde ich öffentlich nicht machen, kann ich aber gerne per E-Mail senden, wenn Sie mir eine Adresse mitteilen.

  7. Ein paar mehr Hintergrundinformationen wären ggf. ebenfalls hilfreich.

Ich habe viele Tabellen, welche bei identischem Layout von einem Schema zu einem anderen synchronisiert werden sollen (beide Seiten Oracle, selbe DB).
An den Daten sollen natürlich Veränderungen vorgenommen werden beim Transfer.
Alle Tabellen haben einen Primärkey, das automatische Insert/Update Handling funktioniert gut. Nun gibt es in jeder Tabelle ein Feld, welches mit dem Wert einer Schema-spezifischen Sequence gefüllt werden muss.
In der Quelltabelle steht die Sequence vom Quellmandanten, diese darf im Ziel nicht verwendet werden. Wenn Datensätze im Ziel eingefügt werden, dann wird mit einem simplen SQL-Befehl die Sequenz eingelesen und formatiert, alles gut.
Stand heute wird dies aber auch bei jedem Update getan, und das ist schlecht.
Ich könnte zwei Definitionen machen, eine welche nur inserts macht, mit Sequence, eine welche nur Updates macht, ohne Sequence, aber dann muss ich zwei Defintionen pflegen und es wird komplizierter.
Ich sollte ganz einfach während der Verarbeitung unterscheiden können, ob der aktuelle Satz bei Schreiben ein Insert oder ein Update macht.
Ich könnte das auch per SQL ermitteln, aber FH ist ja dafür da die Menge an SQL zu reduzieren.

PS: Ein Multi-If (So wie Case x when 'A' then 123 when 'B' then 134 else '999') wäre ganz praktisch.

Gruss
G. Worch
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1975

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Beiträge: 1099
Hallo Herr Worch,

das einfachste wäre es in diesem Fall die SEQUNCE nicht per SQL zu ermitteln sondern dem Feld einen Standardwert über die Oracle Datenbank zuzuweisen. Im FlowHeater darf dem Feld dann kein Wert zugewiesen werden, so wird der Standardwert von der Oracle Datenbank zugewiesen, der natürlich bei einem Update nicht erneut gesetzt wird.
Wenn das nicht möglich ist, über den .NET Script Heater „fast“ alles möglich :-)

Hier mal ein Beispiel Skript, das als Eingangsparameter den Wert des Primary Keys benötigt.

public object DoWork()
{
  if (InValues.Length != 1)
    throw new Exception("1 Eingangsparameter erwartet!");

  // Ersten Eingangsparameter holen = where
  // Achtung: evtl Wert über FlowHeater formatieren bei Zeichenketten 'flowheater' Anführungszeichen nicht vergessen!
  string where = (string)InValues[0].GetString();

  DatabaseAdapter adapter = (DatabaseAdapter)AdapterWrite;

  // hier ggf. den SQL anpassen (Tabelle und Feld)
  // es wird geprüft ob der Datensatz bereits existiert
  int count = (int)adapter.Execute("select count(*) from t_IhreTabelle where IhrFeld = " + where, true);

  // wenn der Datensatz noch nicht existiert dann SEQUENCE holen
  if (count == 0)
  {
    // nextval der SEQUENCE holen (ORACLE)
    return adapter.Execute("SELECT seq_name.nextval FROM dual", true);
  }
  else
  {
    //das Feld nicht aktuallisiert!
    return null;
  }
}

Das Skript prüft ob der Datensatz bereits existiert. Wenn nicht wird der nächste Wert der SEQUENCE zurückgegeben. Existiert der Datensatz bereits wird „null“ (nicht DBNULL) zurückgegeben. In diesem Fall wird der Wert dieses Feldes nicht verändert!
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.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1978

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
So sieht das jetzt aus, aber ergibt einen Fehler:
// Diese Funktion ist zwingend erforderlich!
public object DoWork()
{
 if (InValues.Length != 1)
 throw new Exception("1 Eingangsparameter erwartet!");

// Ersten Eingangsparameter holen = where
 // Achtung: evtl Wert über FlowHeater formatieren bei Zeichenketten 'flowheater' Anführungszeichen nicht vergessen!
 string where = (string)InValues[0].GetString();

DatabaseAdapter adapter = (DatabaseAdapter)AdapterWrite;

// hier ggf. den SQL anpassen (Tabelle und Feld)
// es wird geprüft ob der Datensatz bereits existiert
 int count = (int)adapter.Execute("select count(*) from paws where paws_artikel_nr = '" + where + "'", true);

// wenn der Datensatz noch nicht existiert dann SEQUENCE holen
 if (count == 0)
 {
 // nextval der SEQUENCE holen (ORACLE)
 return adapter.Execute("select to_char(stco.paws200id.nextval, '00000000000000000000000') from dual", true);
 }
 else
 {
 //das Feld nicht aktuallisiert!
 return null;
 }
}

Fehler: Die angegebene Umwandlung ist ungültig.
Was ist wohl gemeint, wie debuggen?
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1980

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Beiträge: 1099
Hallo Herr Worch,

hier gibt es leider keinen Debugger, hier müssen wir uns vorhangeln.
Als erstes bitte mal den beide SQL Statements prüfen ob diese gegen die Oracle Datenbank ausgeführt werden. z.B. über den „SQL Developer“.

Wenn das läuft würde ich jetzt mal spontan die Zeile

return adapter.Execute("select to_char(stco.paws200id.nextval, '00000000000000000000000') from dual", true);

für Testzwecke auskommentieren und dafür folgendes verwenden.

// return adapter.Execute("select to_char(stco.paws200id.nextval, '00000000000000000000000') from dual", true);
return „FH Test“;

Wenn Ihnen hier in der Testausführung „FH Test“ in der Spalte angezeigt liegt es irgendwie am verwendeten SQL!
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.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1982

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
Die SQLs habe ich natürlich zuerst manuell geprüpft.
Anderen Wert hardkodiert zurückgeben ändert nichts , die Fehlermeldung bleibt.
Input Parameter hardkodiert, das selbe.

1. Ich bin in VB fit, in C# nicht (obwohl hier ist ja kein Code), aber ich finde keine Doku wie zB der Write Adapter in VB eingesetzt wird. Und heisst der wirklich immer Adapter und nie Adaptor?
2. Ich merke gerade, dass ich die Alpha 7 Version verwende, welche ich testhalber installiert habe. Jetzt kann ich die Definition nicht mehr mit der aktuellen Version öffnen. Ich habe in den letzten Tagen einiges gemacht mit der 4er version, gibt es eine Downgrade Möglichkeit in den Defintionen?

Der Fehler 'Die angegebene Umwandlung ist ungültig' kommt auch in 3.5.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1985

  • FlowHeater-Team
  • FlowHeater-Teams Avatar
  • Offline
  • Administrator
  • Beiträge: 1099
Hallo Herr Worch,

hier mal Ihr Beispiel als VB.NET Code. Es wird immer Adapter verwendet. Ein Doku zum .NET Script Heater steht noch auf der TODO Liste.

Public Function DoWork() As Object
  Dim count As Integer
  Dim where As String

  If InValues.Length <> 1 Then
    Throw New Exception("1 Eingangsparameter erwartet!")
  End If

  ' Ersten Eingangsparameter holen = where
  where = InValues(1).GetString()
  
  count =  AdapterWrite.Execute("select count(*) from paws where paws_artikel_nr = '" + where + "'", True)

  ' wenn der Datensatz noch nicht existiert dann SEQUENCE holen
  If count = 0 Then
    ' nextval der SEQUENCE holen (ORACLE)
     DoWork = AdapterWrite.Execute("select to_char(stco.paws200id.nextval, '00000000000000000000000') from dual", True)
  Else
    ' das Feld nicht aktuallisiert!
    DoWork = Nothing
  End If

End Function


Zwei Dinge könnten theoretisch noch das Problem verursachen.
  1. Verwenden Sie mehr als einen Adapter auf der WRITE Seite? Wenn ja, dann müssten Sie den Oracle Adapter an erster Stelle verwenden oder aber anstatt AdapterWrite.Execute AdaptersWrite(0).Execute (0 = erster Adapter, 1 = zweiter Adapter, …)

  2. Evtl. verursacht die WHERE Klausel im SELECT COUNT das Problem? Ist die Artikelnummer als Zahl angelegt, dann liegt die Ursache in den verwendeten einfachen Hochkommas.

PS: Sie können die Version der Definition zurückstellen wenn Sie die Datei über einen Texteditor öffnen und im Tag <Version> die Version 3.5.3 eintragen. Achtung: Dieses Vorgehen funktioniert nur mit den aktuellen Alpha 4 Versionen, da hier die Struktur der Definition noch nicht verändert wurde!
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: 1 Jahr 6 Monate her von FlowHeater-Team.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Untercheiden Update/Insert je Satz 1 Jahr 6 Monate her #1986

  • Guido Worch
  • Guido Worchs Avatar
  • Offline
  • New Member
  • Beiträge: 12
VB.net bringt 'Der Index war ausserhalb des Arraybereichs' und das bezieht sich auf:
where = InValues(1).GetString()

InValues(0).GetString() funktioniert, somit ist mein Problem gelöst, Danke!

Der .NET Teil bietet viel Potenzial.

Ich werde das Produkt kaufen.
Schön wäre, wenn es schnellere Antworten gäbe, 24h sind jeweils etwas lange.
Und im .net Teil Zeilennummern ...
Der Administrator hat öffentliche Schreibrechte deaktiviert.
Moderatoren: FlowHeater-Team
Ladezeit der Seite: 0.098 Sekunden