Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie behandelt Interbase SELECT INTO abfragen? (https://www.delphipraxis.net/53880-wie-behandelt-interbase-select-into-abfragen.html)

mojo777 24. Sep 2005 13:48

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:
SELECT KND_ID FROM TRANSACTION WHERE EINZAHLUNG>1000 INTO :KND_ID;
EXECUTE PROCEDUERE UPDATE_KND_PRIVILEGIEN(:KND_ID);
suspend;
so...
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

jensw_2000 24. Sep 2005 14:07

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:

mojo777 24. Sep 2005 14:10

Re: Wie behandelt Interbase SELECT INTO abfragen?
 
schade... :-(

gibts da schleifen???

Hansa 24. Sep 2005 14:15

Re: Wie behandelt Interbase SELECT INTO abfragen?
 
Zitat:

Zitat von mojo777
Kann das jetzt leider noch sehr schlecht testen, weil das sql-programm noch in einer sehr rohen phase ist :-(

Welches Programm ? :shock: Für so was gibts IBExpert. Da kann man kinderleicht die 2 Zeilen testen. Entweder geht es so nicht, oder es wird der erste bzw. letzte Wert, der der WHERE Klausel entspricht in die Variable gespeichert. Weiß es jetzt selber nicht genau und würde das auch testen, bevor ich groß im Nebel stochere oder umständlich suche. Aber was soll ein Trigger da machen ? Wenn ich mirs nochmal überlege, so wird eine Ergebnismenge gefunden und deshalb wirds mit einem Wert kaum gehen. Wie sollte denn das gehen und wozu überhaupt ?

mojo777 24. Sep 2005 14:25

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:
UPDATE TABLE1 SET F1='bla' WHERE <cond>
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....
oder? :-D


ist aber krasses gefusche! ;-)

Hansa 24. Sep 2005 14:36

Re: Wie behandelt Interbase SELECT INTO abfragen?
 
SQL-Code:
UPDATE TABLE1 SET F1='bla' WHERE F2>1000
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.

mojo777 24. Sep 2005 14:59

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:

imp 24. Sep 2005 16:37

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:
FOR SELECT a, b FROM d INTO :value DO
BEGIN
  // Mache was mit :value
END
Schönen Gruß,
Frank

Hansa 24. Sep 2005 19:24

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.

jensw_2000 24. Sep 2005 20:53

Re: Wie behandelt Interbase SELECT INTO abfragen?
 
Zitat:

Zitat von jensw_2000
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:

Entschuldige,
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 20:25 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz