Woher sollen wir das bitte schön wissen, wenn wir nicht wissen, was in deiner Tabelle so drin ist oder was an den einzelnen Stellen in der Funktion passiert?
Kannst du nicht ein paar RAISE NOTICE einfügen und etwas Debugging betreiben?
Hy,
kann mir vielleicht bitte jemand helfen und mir sagen was daran falsch ist?
Warum gibt die Funktion keine Werte aus und trägt auch keine in die Tabelle ein?
Gruß BoOnOdYCode:CREATE OR REPLACE FUNCTION "insert_it"(OUT _Artikelnummer text, OUT _Artikel text, OUT _preis float8) RETURNS SETOF record AS $BODY$ declare rec record; vergleich record; prozent record; begin delete from preisliste_aktuell_verkauf where alt=true; update preisliste_aktuell_verkauf set alt = true; for rec in select Artikelnummerliste.Artikelnummer as Artikelnummer, Artikelnummerliste.name as Artikel, Artikelnummerliste.preis as preis from Artikelnummerliste group by Artikelnummerliste.Artikelnummer, Artikelnummerliste.name, Artikelnummerliste.preis loop for vergleich in select preis from vereinbarung where Artikelnummer=rec.Artikelnummer and datum<=current_date order by datum desc limit 1 loop if vergleich.preis=rec.preis then _preis:=vergleich.preis; _Artikel := rec.Artikel; _Artikelnummer := rec.Artikelnummer; insert into preisliste_aktuell_verkauf (Artikelnummer, Artikel, preis) values (_Artikelnummer,_Artikel,_preis); return next; else for prozent in select prozentsatz, fix from aufschlag where rec.preis >= preis order by preis limit 1 loop _preis := (rec.preis *(1+(prozent.prozentsatz/100)))+ prozent.fix ; _Artikel := rec.Artikel; _Artikelnummer := rec.Artikelnummer; insert into preisliste_aktuell_verkauf (Artikelnummer, Artikel, preis) values (_Artikelnummer,_Artikel,_preis); return next; end loop; end if; end loop; end loop; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
Woher sollen wir das bitte schön wissen, wenn wir nicht wissen, was in deiner Tabelle so drin ist oder was an den einzelnen Stellen in der Funktion passiert?
Kannst du nicht ein paar RAISE NOTICE einfügen und etwas Debugging betreiben?
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Also was macht diese Funktion?
Tabelle Artikelnummernliste
Seife 00101 1,49
Seife 001012 1,49
Paprika 1121 2,50
Tabelle Aufschlag
0,00 20
1,00 10
2,00 5
Vereinbarung
00101 1,50
Ausgabewert der Funktion:
Seife 001012 1,49+ (1,49*20%)
Paprika 1121 2,50 + (2,50*5%)
Seife 00101 1,50
Suche ob der Artikel vereinbart ist und wenn nicht dann schlage nach der Regel in Aufschlagtabelle den Preis auf.
Dankeschön
Wenn noch was unklar ist dann einfach frei raus mit.
Gruß BoOnOdY
Hier ist nicht erkennbar, was das alles soll. Wie wird Tabelle Aufschlag mit den Daten verknüpft?
[quote]
Ich hab das mal abgewandelt in: Tabelle Artikel mit Preisen und eine Vereinbarungstabelle. Falls keine extra Vereinbarung besteht, dann gilt der Preis laut Artikel-Tabelle, ansonsten der extra veeinbarte Preis:Suche ob der Artikel vereinbart ist und wenn nicht dann schlage nach der Regel in Aufschlagtabelle den Preis auf.
Vielleicht hilft das ja schon.Code:test=*# select * from art_nummer ; nr | name | preis ---------+---------+------- 1000101 | Seife | 1.49 1001012 | Seife | 1.49 1001121 | Paprika | 1.49 (3 rows) test=*# select * from vereinbarung ; nr | preis ---------+------- 1000101 | 1.50 1001121 | 0.50 (2 rows) test=*# select a.nr, a.name, coalesce(b.preis, a.preis) from art_nummer a left join vereinbarung b using (nr); nr | name | coalesce ---------+---------+---------- 1000101 | Seife | 1.50 1001012 | Seife | 1.49 1001121 | Paprika | 0.50 (3 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Also in der Tabelle aufschlag steht :
Min_Preis Prozentsatz
0,00 20
1,00 10
2,00 5
Also wenn der Preis gleich 0,50 ist dann schlage 20 drauf
wenn der Preis 1,10 dann 10 prozent und so weiter....
Also wenn er keine Vereinbarung findet, dann schlage was auf.
Also
if vereinbarung gefunden
then
preis=vereinbarung
else
preis= preis+ aufschlag
Gruß BoOnOdY
AndreasCode:test=*# select * from vereinbarung ; nr | preis ---------+------- 1000101 | 1.50 1001121 | 0.50 (2 rows) test=*# select * from aufschlag ; preis | aufschlag -------+----------- 0.00 | 0.20 1.00 | 0.10 2.00 | 0.05 (3 rows) test=*# select a.nr, a.name, coalesce(b.preis, a.preis+a.preis*(select aufschlag from aufschlag where preis < a.preis order by 1 desc limit 1)) from art_nummer a left join vereinbarung b using (nr); nr | name | coalesce ---------+-------------+---------- 1 | Testartikel | 6.0000 1000101 | Seife | 1.50 1001012 | Seife | 1.7880 1001121 | Paprika | 0.50 (4 rows)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Ich geh mal pennen und teste es dann aus, wenn das so einfach geht dann ist das ja mal übelst geil. dann hab ich gleich noch eine Frage:
Wenn ich die Liste erstellt habe sieht sie so aus:
1121 50
11212 50
11213 1
Soo wenn jetzt der Preis = ist und die nummer ähnlich, dann soll er es zusammenfassen:
1121 50
11213 1
wäre die ausgabe danach.
Ich mache das im moment mit einer Funktion die alle spalten der Tabelle miteinander vergleich und das dauert 25 minuten =(
Gruß BoOnOdY
Definiere ähnlich. Numerisch gesehen sind sich 1121 und 11212 nicht wirklich ähnlich.
Vielleicht suchst Du nur einfach sowas:1121 50
11213 1
wäre die ausgabe danach.
Ich mache das im moment mit einer Funktion die alle spalten der Tabelle miteinander vergleich und das dauert 25 minuten =(
AndreasCode:test=*# select * from p; n | preis -------+------- 1121 | 10 11212 | 10 1130 | 20 (3 rows) test=*# select distinct substring(n,1,4), preis from p ; substring | preis -----------+------- 1121 | 10 1130 | 20 (2 rows)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
genau so was suche ich =)
verdammt wo bekommt man denn diese Ideen immer her? Also diese ganze tiefergehende Syntax?
Ich steh dann immer mit den einfachsten Mitteln vor so problemen und versuche sie immer zu umgehen, aber lieber direkt als mit großem Umweg.
Gibts da irgendwelche speziellen tutorials? Sonst frag ich mich weiter immer durch das Forum und lerne aus jeder Antwort =)
Learning by asking =P
Gruß BoOnOdY
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen