Wo ist der Fehler in der Funktion?

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;

Gruß BoOnOdY

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?

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,4920%)
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?

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)

Vielleicht hilft das ja schon.


Andreas

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



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)

Andreas

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.

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 =(

Vielleicht suchst Du nur einfach sowas:

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)

Andreas

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

Glaskugel.

Andreas

dann werde ich gleich mal den Glaser meines Vertrauens aufsuchen :wink:

Also sorry die Frage habe ich undeutlich formuliert:

1121 50
112120 50
11213 1
112121 1
1121213 1

Ausgabe der abfrage soll sein

1121 50
11213 1
112121 1


Einen substring muss man ja immer auf eine bestimmte Zeichenlänge einstellen … sorry das ich nicht genau war.

Gruß BoOnOdY

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.

Etwas anderes fällt mir grad nicht ein.

Andreas

Ja okay genau das hab ich auch gemacht.

ich habe Den Befehl geloopt und hab dann nach ähnlichen aritkelnummern aber gleichen Preisen gesucht.

Trozdem danke =)

Gruß BoOnOdY