Announcement

Collapse
No announcement yet.

Preismatrix auflösen als Stored Proc

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Preismatrix auflösen als Stored Proc

    Hallo ich habe folgende Tabellen:

    Preislisten
    LID;Bezeichnung;BasisLID
    Index = LID

    Artikelpreise
    LID;Artikelnummer;abMenge;Preis;AID
    Index = AID Index2 = LID;Artikelnummer;abMenge

    Die Preislisten sind miteinander verkettet über das Feld BasisLID das immer auf die darüber liegende Preisliste zeigt. Der Einsprungspunkt ist quasi die unterste gültige Preisliste für den Kunden.

    Preisliste1 (Standard; enthält alle Artikel mit Standardpreisen)
    Preisliste2 (besondere Kunden; enthält niedrigere Preise)
    Preisliste3 (ganz besondere Kunden; ....)
    Preisliste4 .....

    Wenn ich einen Preis suchen soll dann habe ich zur Verfügung die Preislisten -Id LID (der Startpunkt der Suche) die Artikelnummer und eine Artikelmenge.

    Also gehe ich in die Preisliste merke mir die Basis-PreislistenID (BasisLID) für den Fall das der Artikel nicht in der Artikelpreisliste enthalten ist.

    Dann gehe ich in die Artikelpreisliste mit der LID und suche den Artikel und die Menge. Da fängt schon die erste Schwierigkeit an:

    LID;Artikelnummer;abMenge;Preis
    1;10;0;13.50
    1;10;400;13.30
    1;10;600;13.20

    Nehmen wir an ich suche die Menge 450 also möchte ich den Preis 13.30 zurückbekommen. Und wenn es den Artikel nicht gibt unter der LID dann soll er über die gemerkte BasisLID in die Preislisten gehen und dort sich eine ev. vorhandene neue BasisLID merken und wieder von vorne anfangen.

    Bisher hab ich das mit mehreren SQL Statements und Programm-Code erledigt der einfach die Artikelpreisliste abfragt findet er keinen Artikel hohlt er sich die nächste Liste.
    Findet er einen dann frägt er die Datenmenge ab und sucht im Programm den letzten Datensatz das ist dann hier z.B. 13.30.

    Nun ist das ganze doch recht langsam vorallem wenn da gleich mal 6 und mehr Preislisten verkettet werden. Schließlich muß das ganze ja ständig zum Client geschickt werden der dann prüft und das nächste SQL-Statement generiert.

    Habt Ihr vielleicht eine Idee wie ich das ganze nur mit SQL machen kann. Laufen soll das ganze auf einem MS SQL-Server 7.0

    LG
    Peter

  • #2
    Hallo!<br>
    Transact SQL kann mit Rekursionen umgehen!<br>
    Das Ganze mal als Funktion (aus unserem System entliehen und leicht umgeschrieben):<br>
    Die Tabellen:<br>
    CREATE TABLE [P1liste] (<br>
    [ID] [int] NULL , [PListeID] [int] NULL , [Artikel] [int] NULL ,
    [abmenge] [int] NULL , [Preis] [float] NULL <br>
    ) ON [PRIMARY]<br>
    <br>
    CREATE TABLE [PListe] (<br>
    [ID] [int] NULL , [Bezeichnung] [char] (30), [basisID] [int] NULL <br>
    ) ON [PRIMARY]<br>
    <br>
    Die Funktion:<br>
    create function PreisByListe ( <br>
    @Pliste integer, @Artikel integer, @menge integer )<br>
    returns float<br>
    as<br>
    begin<br>
    declare @back as float<br>
    declare @Vaterliste as integer<br>
    <br>
    set @back = 0<br>
    select @back = Preis from P1Liste where artikel = @Artikel and PlisteID = @pliste
    and AbMenge =
    (Select max(AbMenge) from P1Liste where
    artikel = @Artikel and PlisteID = @pliste and AbMenge <= @Menge)<br>

    if @back = 0 begin<br>
    select @vaterliste = basisID from pliste where id = @pliste<br>
    if @vaterliste = 0 begin<br>
    select @back = 0<br>
    end<br>
    else begin<br>
    set @back = dbo.PreisByListe ( @vaterliste, @Artikel, @Menge )<br>
    end<br>
    end<br>
    return @back<br>
    end<br>
    <br>
    Muß man jetzt nur noch an die benötigten Tabellen und Spaltennamen anpassen und bei Bedarf in eine StoredProc einbinden.<br>
    ACHTUNG Bedingung ist: Es darf keine "echten Preise" mit Wert 0 geben!<br>
    BYE BERND<br&gt

    Comment


    • #3
      Hallo Bern,

      Das Grundprinzip der Function habe ich verstanden und nach einigem herumbsteln hab ich jetzt eine StoredProc zusammenbekommen.
      Muß schon sagen hätte nicht gedacht das es so einfach ist.
      "In der Kürze liegt hier ganz bestimmt die Würze"

      Danke für die prompte Antwort

      LG
      Peter

      P.S. Du beschäftigst dich nicht zufällig mit Delphi?
      Hab da nämlich eine wirklich interessante Aufgabenstellung die
      ich auch nur zum Teil für mich zufriedenstellend gelöst habe

      Comment


      • #4
        Hallo!<br>
        Doch ich bin definitiv ein Delphianer!<br>
        Aber im SQL Forum bin ich eher selten.<br>
        Nur wenn ich selbst ein Problem habe ;-)<br>
        Die Frage vielleicht im Delphi Forum posten?<br>
        Da gibt es die echten Delphi Gurus wie Kosch und Hagen etc.... <br>
        BYE BERN

        Comment

        Working...
        X