![]() |
Datenbank: IB6 • Version: 6 • Zugriff über: stored procedure
Wie behandelt Interbase SELECT INTO abfragen?
Hallo!
Ich sitze gerade vor so einer aufgabe mit stored procedures folgendes zu realisieren:
Delphi-Quellcode:
so...
SELECT KND_ID FROM TRANSACTION WHERE EINZAHLUNG>1000 INTO :KND_ID;
EXECUTE PROCEDUERE UPDATE_KND_PRIVILEGIEN(:KND_ID); suspend; was geschieht da? wird er mir alle kunden "updaten" bei denen EINZAHLUNG>1000 steht? Oder macht der das nur mit dem ersten datensatz? oder passiert gar nichts, weil die procedur UPDATE_KND_PRIVILEGIEN einen Intergerwert erwartet eine Liste dieser aber bekommt? Kann das jetzt leider noch sehr schlecht testen, weil das sql-programm noch in einer sehr rohen phase ist :-( Vielen dank für Eure Tipps! MfG |
Re: Wie behandelt Interbase SELECT INTO abfragen?
Die SP wird nur für den ersten Kunden aufgerufen.
Für diese Aufgabe hilft dir nur ein Trigger, oder do musst garantieren, das dein SELECT immer nur einen Datensatz zurückgibt. Das ist aber eher Gefriemel und wenig professionell ... :hi: |
Re: Wie behandelt Interbase SELECT INTO abfragen?
schade... :-(
gibts da schleifen??? |
Re: Wie behandelt Interbase SELECT INTO abfragen?
Zitat:
|
Re: Wie behandelt Interbase SELECT INTO abfragen?
@hansa :-)
also mit dem programm meine ich nicht ibexpert :-) sondern mein programm. der codeausschnitt ist nur ein stark vereinfachtes beispiel. bei mir hängen viele tabellen von einander ab und wenn sich irgendwo was ändert, sollten die anderen angepasst werden. ok, habs verstanden. ich werde gleich mal nach dem mittagessen versuchen zu testen :-) mit triggern ist es so eine sache... die benutze ich sowieso. aber für ergebnismengen....? hä? naja. egal. hmmm *denk*... joaaaa... ist keine schlechte idee!!!!! wenn ich
Delphi-Quellcode:
ausführe, DANN kann wird doch ein trigger nacheinander aufgerufen... also für jeden eintrag einzeln. und so wäre es doch möglich die ergebnismenge zu teilen....
UPDATE TABLE1 SET F1='bla' WHERE <cond>
oder? :-D ist aber krasses gefusche! ;-) |
Re: Wie behandelt Interbase SELECT INTO abfragen?
SQL-Code:
Damit werden alle F1-Felder der gesamten Tabelle auf 'bla' gesetzt, sofern F2 > 1000 ! Also Vorsicht !Da geht es aber in erster Linie nicht um eine Menge sondern um die Bedingung > 1000. Und die Bedingung >1000 ist genau festgelegt, ebenso wie der neue Wert 'bla'. Ein Update-Trigger nützt insofern etwas, wenn bei vorliegen einer Bedingung eine Aktion automatisch ausgeführt werden soll. Das geht allerdings eventuell mit einer SP sogar besser. Ich verwende z.B. Update-Trigger um festzuhalten, wann der letzte Zugriff auf einen Datensatz war. Das kann die DB selber erledigen und ich habe meine Ruhe. Alles andere was mit speichern zu tun hat : SP.
UPDATE TABLE1 SET F1='bla' WHERE F2>1000
|
Re: Wie behandelt Interbase SELECT INTO abfragen?
was gibt mir denn der letzte zugriff?
ok ich beschreibe mal mein problem im detail. ein kunde kauft regelmäßig ein. dadurch steigt sein wert (menge des bezahlten geldes ;-) ) abhängig von diesem wert wird dem kunden eine gruppe zugewiesen. z.b. gruppe 2. diese gilt für kunden, die mehr als 1000 eur und weniger als 2000 eur eingezahlt haben. so. jetzt so so ein benutzer des programms und sagt: wir müssen den bereich der gruppe 2 verschieben. und zwar auf 1500<x<2500 davon wollen ja alle betroffen werden, die in der 2. gruppe vorher gewesen sind. manche fliegen auch raus und kommen in die 1. gruppe, falls sie <1500 auf dem konto haben. anhängig von der gruppe und für jeden kunden individuell gibts da noch eine angebotstabelle, in der die rabatte etc gespeichert wind.... da muss sich dann auch einiges ändern, falls die gruppe wandelt..... soohh... aber eigentlich ist mir der ansatz jetzt klar! setze mich dann mal davor. :-D :coder: vielen DANK!! :hi: |
Re: Wie behandelt Interbase SELECT INTO abfragen?
Hallo,
du kannst, wie du schon vermutet hast, Schleifen innerhalb der SP programmieren. Die genaue Syntax weiss ich zwar gerade nicht aber es müsste ungefähr so gehen (genaueres kann dir die Doku liefern):
Code:
Schönen Gruß,
FOR SELECT a, b FROM d INTO :value DO
BEGIN // Mache was mit :value END Frank |
Re: Wie behandelt Interbase SELECT INTO abfragen?
Nachdem jetzt endlich klar ist, um was es geht (aber nur im Prinzip !) : es liegt ein Denkfehler vor. 8) Folgendes Beispiel soll nur die Vorgehensweise verdeutlichen : Wie speichert man ein Alter ab, um später einem beim 18. Geburtstag ein Geschenk zu schicken ? Man kann es so machen wie mojo das vorhatte und speichert jetzt 17 als Alter und dann geht man hin und muß immer jeden Tag alle Daten durchgehen und prüfen, ob derjenige Geburtstag hat. Ist das der Fall, dann werden die entsprechenden Alter-Werte auf 18 gesetzt und neu abgespeichert. Es gibt da so Sachen wie Normalform u.ä. Die sind nicht umsonst vorhanden, in der Praxis aber meistens nicht zu 100 % umzusetzen. Zumindest bei dem Beispiel mit dem Alter wäre es doch wohl besser das Geburtsdatum zu speichern, aus dem man sich jederzeit das Alter zu einem bestimmten Tag errechnen kann.
Bei der konkreten Sache siehts ähnlich aus. Der Umsatz muß egal bleiben. Der Kunde bleibt bei Umsatz X. Und in zweiter Tabelle steht drin, daß der Umsatz X in Kategorie 2 fällt oder sonstwas. Wird die Grenze von Kategorie 2 verändert, dann fällt der Kunde dementsprechend in andere Kategorie oder auch nicht. Das Feld mit der Gruppe gehört NICHT in die Daten des Kunden !! P.S.: das hat übrigens noch den großen Nebeneffekt, daß ich mit Änderung eines einzigen Feldes in der Gruppentabelle sämtliche Daten der anderen Tabelle beeinflussen kann. |
Re: Wie behandelt Interbase SELECT INTO abfragen?
Zitat:
das kommt dabei raus wenn man zwischen Tür und Angel noch schnell etwas von sich gibt .. :oops: Ich meinte nicht Trigger sondern einen Cursor ... :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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