PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Trigger (http://www.selfphp.de/forum/showthread.php?t=25339)

Jabberwocky 28.07.2014 12:27:44

Trigger
 
Hallo zusammen
Ich bin an einer Datenbank für ein ERP System dran (Schulprojekt)
Jetzt möchte ich mittels Trigger automatisch eine Bestellung auslösen, wenn der Mindestbestand des Artikels erreicht wird. So weit so gut.
Der Trigger wird vor einem Update der Tabelle Artikel ausgelöst. In der Tabelle Bestellung gibt es das Attribut "ArtikelID"
Kurzes Beispiel
Bestellung(ID, ArtikelID, Menge) values (@ID, ?, 10) ID und Menge sind nicht das Problem, sondern die ArtikelID. Ich möchte die ID des Artikels setzen, welcher den Trigger ausgelöst hat. So in der Art this.ID oder so ähnlich.
Leider habe ich nichts gefunden was mir weiterhilft.
Liebe Grüsse
Jabberwocky

pguser 28.07.2014 17:18:11

AW: Trigger
 
Zitat:

Zitat von Jabberwocky (Beitrag 146759)
Leider habe ich nichts gefunden was mir weiterhilft.
Liebe Grüsse
Jabberwocky

NEW.* und OLD.* enthalten in TRIGGER-Funktionen die Spalten.

Jabberwocky 31.07.2014 09:31:25

AW: Trigger
 
Mit NEW.* und OLD.* werden doch Bedingungen gesetzt sowie Einträge in der Tabelle geändert? Ich sehe hier den Zusammenhang zu meinem Problem nicht ganz.

Das Attribut ArtikelID ist ein Foreign Key welcher zur ID des Artikels verweist. Diese ändert sich ja nicht, da eine neue Bestellung des entsprechenden Artikels gemacht werden muss.

pguser 31.07.2014 14:09:23

AW: Trigger
 
Zitat:

Zitat von Jabberwocky (Beitrag 146771)
Mit NEW.* und OLD.* werden doch Bedingungen gesetzt sowie Einträge in der Tabelle geändert? Ich sehe hier den Zusammenhang zu meinem Problem nicht ganz.

Das Attribut ArtikelID ist ein Foreign Key welcher zur ID des Artikels verweist. Diese ändert sich ja nicht, da eine neue Bestellung des entsprechenden Artikels gemacht werden muss.

Was willst Du machen? Du hast eine Tabelle mit den Artikeln. Da wird der Bestand reduziert, wenn was rausgenommen wird, oder? Und Du willst, wenn der Bestand unter Mindestbestand fällt, in einer anderen Tabelle die Artikel-ID einwerfen, oder?

Jabberwocky 02.08.2014 15:30:47

AW: Trigger
 
Ganz genau. Ich habe eine Tabelle mit Artikeln, wenn ein Artikel unter den Mindestbestand fällt gibt es einen neuen Datensatz in der Tabelle Bestellung. Dort wird die Artikel-ID des Artikels benötigt, welcher die Bestellung auslöst.

pguser 02.08.2014 15:52:28

Genau. Und dazu kannst Du NEW.* verwenden.

Code:

test=# create table artikel (id int primary key, anzahl int, mindestbestand int);
CREATE TABLE                                                                   
Time: 101,304 ms                                                               
test=*# create table bestellung (artikel int references artikel, menge int);   
CREATE TABLE                                                                   
Time: 26,043 ms
test=*# create or replace function neue_bestellung() returns trigger as $$begin insert into bestellung values (new.id, new.mindestbestand); return new; end; $$ language plpgsql;
CREATE FUNCTION
Time: 24,496 ms
test=*# create trigger trg_bestellung after update on artikel for each row when (new.anzahl < new.mindestbestand) execute procedure neue_bestellung();
CREATE TRIGGER
Time: 23,752 ms
test=*# insert into artikel values (1, 12, 10);
INSERT 0 1
Time: 0,514 ms
test=*# select * from bestellung;
 artikel | menge
---------+-------
(0 rows)

Time: 0,334 ms
test=*# update artikel set anzahl = anzahl - 4;
UPDATE 1
Time: 11,364 ms
test=*# select * from bestellung;
 artikel | menge
---------+-------
      1 |    10
(1 row)

Selbsterklärend, oder?

PS.: um zu verhindern, daß bei der nächsten Abbuchung noch einmal bestellt wird, einfach in der bestellen-Tabelle einen Unique Index auf Artikel-ID.

Jabberwocky 03.08.2014 19:09:58

AW: Trigger
 
Alles klar, jetzt verstehe ich was du meinst. Ich werde das morgen gleich mal versuchen. Vielen Dank für deine Hilfe

Jabberwocky 16.08.2014 12:26:23

AW: Trigger
 
Vielen Dank nochmal für eure Hilfe. Das Script wird jetzt ohne Fehler ausgeführt.
Jetzt stehe ich jedoch an einem anderen Problem.
Ich habe dem Trigger gesagt, er soll eine Bestellung ausführen, sobald der Bestand des Artikels kleiner als 5 ist. Blöderweise ist es jetzt nicht mehr möglich den Bestand eines Artikels unter 5 zu setzen. Leider leuchtet mir nicht ein worin genau der Fehler besteht.
Ich vermute jedoch das meine if abfrage das Problem verursacht.
if old.lagerbestand <> new.lagerbestand and new.lagerbestand < 5 then

Vielen Dank für eure Hilfe

pguser 16.08.2014 14:27:45

AW: Trigger
 
In meinem Beispiel funktioniert das.


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:32:33 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.