Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Wo ist der Fehler in der Funktion?

  1. #1
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard 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?


    Code:
    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

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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

  3. #3
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    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

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    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
    Hier ist nicht erkennbar, was das alles soll. Wie wird Tabelle Aufschlag mit den Daten verknüpft?

    [quote]

    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:

    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)
    Vielleicht hilft das ja schon.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    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

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    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
    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    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

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen

    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:
    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:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    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

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    genau so was suche ich =)

    verdammt wo bekommt man denn diese Ideen immer her? Also diese ganze tiefergehende Syntax?
    Glaskugel.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 13.02.2012, 16:18
  2. Fehler abfangen - Funktion richtig beenden
    Von dodo im Forum PL/pgSQL
    Antworten: 11
    Letzter Beitrag: 12.03.2011, 01:09
  3. Fehler auf dem Mac 10.6.4
    Von Gargantua im Forum Konfiguration
    Antworten: 0
    Letzter Beitrag: 14.10.2010, 20:30
  4. Fehler bei Distanztest
    Von Imon im Forum PostGIS
    Antworten: 4
    Letzter Beitrag: 07.12.2007, 09:34
  5. Syntax-Fehler
    Von Pegasus0211 im Forum Programmierung
    Antworten: 4
    Letzter Beitrag: 17.10.2006, 13:37

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum