- Beiträge: 14
Untercheiden Update/Insert je Satz
- Guido Worch
- Autor
- Offline
- Benutzer
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
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Guido Worch
- Autor
- Offline
- Benutzer
- Beiträge: 14
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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
dann bräuchte ich ein paar mehr Informationen.
- Ist das Feld PHYSID gleichzeitig der Primary Key der Tabelle? Wenn ja gibt es evtl. noch ein anderes eindeutiges Kriterium?
- 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 )?
- Wenn möglich posten Sie bitte mal die erstellte Definition so kann ich mir ein von dem Tabellenschema der WRITE Seite machen.
- 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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Guido Worch
- Autor
- Offline
- Benutzer
- Beiträge: 14
FlowHeater schrieb: Hallo Herr Worch,
dann bräuchte ich ein paar mehr Informationen.
- Ist das Feld PHYSID gleichzeitig der Primary Key der Tabelle? Wenn ja gibt es evtl. noch ein anderes eindeutiges Kriterium?
Es ist nicht per Primkey
- 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 )?
Es ist eine Sequence(formatiert) die per SQL gelesen und in das Feld geschriebenen wird.
- Wenn möglich posten Sie bitte mal die erstellte Definition so kann ich mir ein von dem Tabellenschema der WRITE Seite machen.
Werde ich öffentlich nicht machen, kann ich aber gerne per E-Mail senden, wenn Sie mir eine Adresse mitteilen.
- 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
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
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.
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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Guido Worch
- Autor
- Offline
- Benutzer
- Beiträge: 14
Fehler: Die angegebene Umwandlung ist ungültig.
Was ist wohl gemeint, wie debuggen?
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Guido Worch
- Autor
- Offline
- Benutzer
- Beiträge: 14
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 heißt 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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
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.
Zwei Dinge könnten theoretisch noch das Problem verursachen.
- 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, …)
- 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.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Guido Worch
- Autor
- Offline
- Benutzer
- Beiträge: 14
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 ...
Bitte Anmelden oder Registrieren um der Konversation beizutreten.