![]() |
Insert oder Update ?
Hi,
ich sammele Eingaben in einem Stringgrid. Diese sollen zum Schluß in eine Interbase-DB rein. Nun weiß ich aber nicht, ob die entsprechenden Datensätze bereits vorhanden sind oder nicht. Um dies herauszufinden müßte ich versuchen die einzelnen Datensätze nochmals zu lesen. Kommt als Ergebnis IsEmpty müßte ich ein Insert machen, ansonsten ein Update. Für die Eingabe in das Stringgrid muß ich ihn aber auch schon lesen. Das kommt mir etwas zu viel des guten vor. Geht das auch anders ? Das einzige, was mir dazu noch einfällt ist, immer ein insert oder update zu machen und im Fehlerfall, das entsprechend andere. Aber irgendwie, weiß net. :( |
Re: Insert oder Update ?
Zitat:
|
Re: Insert oder Update ?
Hai Sharky,
nein fülle ich nicht. Das wären zu viele. Es geht um Rechnungen, Preise usw. D.h. ich prüfe z.B. bei der Eingabe, ob ein entsprechender Artikel vorhanden ist. Dann gebe ich den dazu gehörigen Preis ein oder die Menge. Soll das ganze zum Schluß gespeichert werden, so sollen noch ein paar andere Tabellen aktualisiert werden. |
Re: Insert oder Update ?
Hai Hansa,
als erstes würde mir einfallen die über das BeforPost Ereigniss zu machen. Dann musst Du allerdings immer selber prüfen ob eien Datensatz schon vorhanden ist. Als alternative wäre es vielleicht möchglich mit einem INSERT Trigger zu arbeiten. Wenn Du in diesem dann die Prüfung machst könntest Du den vorhanden Datensatz vorher löschen. Oder eventuell sogag das INSERT in ein UPDATE umwandeln? Ich habe noch nicht viel mit Triggern gemacht, darum bin ich mir da nicht sicher. |
Re: Insert oder Update ?
Sharky ist da wie es aussieht ziemlich nah dran, aber das hier ist wahrscheinlich die Lösung :
Zitat:
|
Re: Insert oder Update ?
Zitat:
Eine View ist ja nichts anderes als eine (Servergespeicherte) Joing. Solltest Du in dieser z.B eine 1:n Verbindung haben und löschst jetzt die Referenz sind auch alle anderen Tabellen betroffen. Darum war ja mein Vorschlag dies über einen Trigger zu versuchen. |
Re: Insert oder Update ?
Meine Sicht auf die Views wird zwar langsam konkreter. Aber nur langsam. :mrgreen: Aber wie es aussieht, wird doch mit Hilfe eines Views eine Art Hilfstabelle aufgebaut, die Spalten aus mehreren Tabellen eben in einem View zusammenführt. Und dieser View läßt sich mit select, insert, update usw. genau so behandeln, wie eine normale Tabelle. Wieso soll das so schlecht sein ?
Was ich aber nicht verstehe, wenn das hier überhaupt so stimmt: was ist bei 20 Tabellen, die in einem View gemeinsam behandelt werden sollen und 10 davon brauchen ein Insert und die übrigen ein Update :?: [Vermutung]Das könnte auf so was wie SELECT * FROM SELECT * FROM... hinauslaufen[/Vermutung] |
Re: Insert oder Update ?
Ob man einen View updaten kann, hängt zum Einen von der Art des Views ab, zum Anderen von der Datenbank.
Viele Systeme erlauben Update- und Insert-Operationen nur auf Views, welche nur auf einer einzelnen Tabelle basieren. Bei Access kannst Du auch in Views schreiben, welche aus mehreren Tabellen zusammengesetzt sind. Bedingung ist dabei natürlich, dass sich die Felder eindeutig zuordnen lassen. Das heisst, bei einer 1:n-Verknüpfung kannst Du nur Updates auf die Felder der Tabelle durchführen, welche eindeutig sind. Access prüft das allerdings nicht so streng, so dass man unter Umständen böse Überraschungen erleben kann :wall: Bei Oracle sind NUR VIews editierbar, deren Daten aus lediglich einer Tabelle entstammen. So vermeidet die Datenbank Performance-schluckende Überprüfungen, ob die Daten gefahrlos geändert werden können. In dem Borland-Zitat steht auch ausdrücklich drin, dass die eigentliche Insert/Update-Operation durch einen Trigger erledigt werden soll. Vermutlich bezieht sich die Erklärung auf Interbase. Das geht aber mit jeder DB, welche Trigger beherrscht. Bei Access usw. muß man den Trigger "zu Fuß" mit einer Ereignisprozedur in Delphi nachbilden. In beiden Fällen wird dann die Schreiboperation nicht auf den View, sondern auf die zugrundeliegende Tabelle ausgeführt. :coder: |
Re: Insert oder Update ?
Zitat:
|
Re: Insert oder Update ?
Moin, Moin Hansa,
Die Views lasse ich mal raus, das sind vorbereitete Abfragen um die ganzen Select-Statements nicht jedesmal neu schicken zu müssen... Habe sowas ähnliches mal auf folgendem Weg gelöst
Delphi-Quellcode:
Im 'PID_Feldname' Feld der Datenbank wird hier ein eindeutiger Index erwartet.if DataLink.DataSet.Locate( 'PID_Feldname', 'Mein_Wert' ,[] ) then DataLink.DataSet.Edit else DataLink.DataSet.Append; Bei 'Mein_Wert' könntest Du auch auf die Zeilen Deinse StringGrids zugriefen. Zum Beispiel die eindeutige Artikelnummer, die sich in der Datenbank im PID_Fieldname# Feld befindet. Grüße aus dem etwas unterkühlten Norden // Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz