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?
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?
Hier ist nicht erkennbar, was das alles soll. Wie wird Tabelle Aufschlag mit den Daten verknüpft?
Suche ob der Artikel vereinbart ist und wenn nicht dann schlage nach der Regel in Aufschlagtabelle den Preis auf.
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:
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)
Du könntest in einer Funktion diese Tabelle nach der ArtNummer sortiert untersuchen, ob jeweil der Vorgänger ein Teilstring des aktuellen Datensatzes ist. Also, schematisch: select art_nummer, preis from tabelle loop und in der Schleife die art_nummer und den Preis in einer Variablen speichern. Wenn die dort gespeicherte Nummer in der neuen steht UND der Preis gleich ist, dann diese NICHT ausgeben.