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 |
16.07.2014, 14:35:59
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
Rechnen
Hallo Community
Mein Name ist Andy und ich bin im 4. Semester von einem Studiengang zum Systemtechniker. Nun haben wir auch Datenbank als Fach und lernen MySQL was mir erstaunlicherweise ziemlich spass macht :-D (Programmieren ist nicht so mein Ding)
Wir haben die Aufgabe bekommen eine Datenbank zu einem ERP System aufzubauen, wobei so viel Intelligenz wie möglich in der Datenbank stecken muss. Nun stehe ich leider vor einem kleine Problem, zudem ich irgendwie noch keine mir behilfliche Lösung gefunden habe. Ich versuche das mal so gut wie möglich zu erklären ;-)
Ich möchte ein View erstellen der die Artikel und deren Lagerbestände aufzeigt. In der Tabelle Artikel habe ich jedoch kein Attribut für den Lagerbestand, sondern möchte den Lagerbestand durch die Tabelle Beleg, welche die Typen Wareneingang und Warenausgang haben können, berechnen. Um es ganz einfach auszudrücken:
select * from artikel
union
select (Wareneingang - Warenausgang) as Lagerbestand
Nun sehe ich irgendwie den Wald vor lauter Bäumen nicht und komme nicht mehr weiter. Ist dies ohne Trigger überhaupt zu lösen?
Ich hoffe ich konnte mir einigermassen deutlich ausdrücken (ist nicht so meine Stärke)
Liebe Grüsse und vielen Dank für eure Hilfe
|
16.07.2014, 16:44:36
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Rechnen
Zitat:
Zitat von Jabberwocky
Warenausgang haben können, berechnen. Um es ganz einfach auszudrücken:
select * from artikel
union
select (Wareneingang - Warenausgang) as Lagerbestand
|
Du suchst einen Join und kein UNION. Das erst mal als ganz grobe Orientierung.
|
17.07.2014, 07:05:41
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
AW: Rechnen
Natürlich, war wohl bereits ein wenig durch den Wind.
select a.nummer as Artikelnummer, a.bezeichung as Bezeichnung, a.vkpreis as Verkaufspreis, sum(b.menge - c.menge) ...
Bei diesem Punkt bin ich dann steckengeblieben. a bezieht sich auf die Tabelle Artikel und b, c beziehen sich beide auf die Tabelle Beleg. Wobei ein Beleg den Ausgang darstellt und der andere dein Eingang.
|
17.07.2014, 07:34:42
|
Anfänger
|
|
Registriert seit: Jul 2014
Alter: 37
Beiträge: 8
|
|
AW: Rechnen
Ich bin nochmal einen Schritt weiter gekommen, jedoch erscheint ein Syntax Fehler und ich weiss nicht wieso.
create view v_Lagerbestand as
select a.nummer, a.bezeichnung, a.vkpreis, sum(b.menge - c.menge) as Lagerbestand from artikel a
inner join belegposition b on a.id = b.artikelid
inner join belegposition c on a.id = c.artikelid
inner join belegkopf e on e.id = c.belegkopfid where e.belegtypid = 2
inner join belegkopf d on d.id = b.belegkopfid where d.belegtypid = 5
Habe noch gesehen dass die Tabelle Belegkopf unverzichtbar ist, da dort bestimmt wird welcher Typ der Beleg hat. 2 bezieht sich hier auf den Ausgang und 5 auf den Eingang.
Der Fehler bezieht sich auf die letzte Linie, egal in welcher Reihenfolge ich die letzten beiden joins habe. Irgendwie stören sie sich gegenseitig, ich weiss jedoch nicht wieso :-/
|
17.07.2014, 08:28:18
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Rechnen
Zitat:
Zitat von Jabberwocky
Ich bin nochmal einen Schritt weiter gekommen, jedoch erscheint ein Syntax Fehler und ich weiss nicht wieso.
create view v_Lagerbestand as
select a.nummer, a.bezeichnung, a.vkpreis, sum(b.menge - c.menge) as Lagerbestand from artikel a
inner join belegposition b on a.id = b.artikelid
inner join belegposition c on a.id = c.artikelid
inner join belegkopf e on e.id = c.belegkopfid where e.belegtypid = 2
inner join belegkopf d on d.id = b.belegkopfid where d.belegtypid = 5
Habe noch gesehen dass die Tabelle Belegkopf unverzichtbar ist, da dort bestimmt wird welcher Typ der Beleg hat. 2 bezieht sich hier auf den Ausgang und 5 auf den Eingang.
Der Fehler bezieht sich auf die letzte Linie, egal in welcher Reihenfolge ich die letzten beiden joins habe. Irgendwie stören sie sich gegenseitig, ich weiss jedoch nicht wieso :-/
|
Ich denke mal, du brauchst belegkopf nur einmal zu joinen und dann je nach Typ die Menge positiv oder negativ in die Berechnung nehmen.
Davon abgesehen hast Du einen massiven SQL-Fehler: in Abfragen mit Aggregationen (sum() ist eine) müssen alle Spalten des Resultaes entweder aggregiert oder gruppiert werden. MySQL ist die dümmste DB auf diesem Planeten, weil sie diesen Fehler nicht bemerkt und irgend etwas macht, was oft dann nicht das ist, was man eigentlich will.
Falls da signifikant viele Datensätze mit der Zeit kommen wäre der Einsatz eines TRIGGERS oder einer materialized View aber überlegenswert.
|
17.07.2014, 09:33:09
|
Junior Member
|
|
Registriert seit: Apr 2014
Alter: 57
Beiträge: 186
|
|
AW: Rechnen
Zitat:
Zitat von pguser
Ich denke mal, du brauchst belegkopf nur einmal zu joinen und dann je nach Typ die Menge positiv oder negativ in die Berechnung nehmen.
|
Um Dir noch etwas zu helfen:
Du hast in etwa dies hier:
Code:
test=*# select * from b_header ;
id | vz
----+----
1 | 1
2 | -1
(2 rows)
Time: 0,152 ms
test=*# select * from b_detail ;
b_id | art | wert
------+-----+------
1 | 1 | 10
1 | 2 | 20
2 | 2 | 5
(3 rows)
Beleg-Header und -Detail, die ID ist die Beleg-ID, vz das Vorzeichen, hier mal vereinfacht 1 und -1. Falls da 3 und 5 bei Dir ist oder so geht das ja noch immer mit case... zu regeln.art ist die Artikel-Nummer, wert ist klar.
Code:
test=*# select art, sum(vz*wert) as bestand from (select * from b_header left join b_detail on b_header.id=b_detail.b_id) foo group by art;
art | bestand
-----+---------
1 | 10
2 | 15
(2 rows)
Dein aktueller Bestand.
|
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 13:00:54 Uhr.
|