CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
28.07.2014, 12:27:44
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
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
|
28.07.2014, 17:18:11
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Trigger
Zitat:
Zitat von Jabberwocky
Leider habe ich nichts gefunden was mir weiterhilft.
Liebe Grüsse
Jabberwocky
|
NEW.* und OLD.* enthalten in TRIGGER-Funktionen die Spalten.
|
31.07.2014, 09:31:25
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
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.
|
31.07.2014, 14:09:23
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Trigger
Zitat:
Zitat von Jabberwocky
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?
|
02.08.2014, 15:30:47
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
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.
|
02.08.2014, 15:52:28
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
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.
|
03.08.2014, 19:09:58
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
AW: Trigger
Alles klar, jetzt verstehe ich was du meinst. Ich werde das morgen gleich mal versuchen. Vielen Dank für deine Hilfe
|
16.08.2014, 12:26:23
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
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
|
16.08.2014, 14:27:45
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Trigger
In meinem Beispiel funktioniert das.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:05:12 Uhr.
|