Announcement

Collapse
No announcement yet.

Frage an SQL-Firebird Profis

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

  • Frage an SQL-Firebird Profis

    Halle,

    habe folgenden Sachverhalt.
    Ich arbeite für ein Taxiunternehmen. Bei der Auftragsvergabe für Krankenfahrten wird für das durchführende Fahrzeug automatisch die Entfernung der Fahrtstrecke vom Patienten zum Bahndlungsort gebucht. Das Tarifsystem der Krankenkassen für die Abrechnung ist eine Staffelung, d.h. für den 1-50. km wird z.b. 0,80 EUR/km gezahlt.

    Ich habe nun folgende Tabellen

    Patient: Felder ID, Nachname, Krankenkasse, Entfernung
    Auftrag: ID, Patient_ID, ..., Entfernung
    Krankenkasse: ID, Name
    Kassentarif: ID, Kassen_ID, von_km, bis_km, Betrag_pro_km

    Die Berechnung der Betrages erfolgt folgendermaßen: Entfernung 125,00 km

    <p> 0 .. 50 km 0,80EUR/km 40,00 EUR </p>
    <p> 51 ..100 km 0,65EUR/km 32,50 EUR </p>
    <p>101 ..200 km 0,50EUR/km 12,50 EUR </p>

    macht einen Gesamtbetrag von 85,00 EUR.

    Ich möchte diesen Vorgang in einer Procedure durchführen. Bei Kilometerwerten im unteren Kilometerbereich gibt es natürlich keine Problemen. Aber bei weiteren Staffelungen komme ich nicht weiter.
    Die einzelnen Staffelabschnitte in der Tariftabelle sind einzelne Datensätze die nur dirch die eindeutige ID der Krankenkasse verbunden sind.

    Für eure Hilfe vielen Dank,

    cu Jan

  • #2
    Hallo Jan,
    <br><br>
    eine Selectable Stored Procedure könnte in etwa so aussehen:
    <pre>
    SET TERM ^^ ;
    CREATE PROCEDURE PRO_FAHRTSTRECKE_BETRAG (
    KASSEN_ID Integer,
    FAHRTSTRECKE Integer)
    returns (
    BETRAG Numeric(15,2))
    AS
    declare variable von_km Integer;
    declare variable bis_km Integer;
    declare variable betrag_pro_km Numeric(15,2);
    begin
    betrag = 0;
    for select
    von_km, bis_km, betrag_pro_km
    from
    KASSENTARIF
    where
    KASSEN_ID = :kassen_id
    and (von_km <= :fahrtstrecke)
    order by
    von_km
    into
    :von_km, :bis_km, :betrag_pro_km
    do
    begin
    if (fahrtstrecke >= bis_km) then
    begin
    betrag = betrag + (bis_km - (von_km - 1)) * betrag_pro_km;
    end else begin
    betrag = betrag + (fahrtstrecke - (von_km - 1)) * betrag_pro_km;
    end
    end
    suspend;
    end
    ^^
    SET TERM ; ^^
    </pre>
    Bei den erfassten Werten in Kassentarif muss man allerdings etwas vorsichtig sein. Bei den beiden ersten erfassten Intervallen soll es sich um 50km Intervalle handeln, richtig? Dann sollte allerdings der erste Eintrag (damit dieser konsistent zum zweiten ist) mit 1 und nicht mit 0 beginnen. In der Stored Procedure wird dann von "von_km" immer 1 abgezogen, damit man letztendlich auf die vollen 50 oder 100km (letzter Datensatz) Intervall kommt. Du solltest mit meiner Selectable Stored Procedure zumindest eine Idee bekommen, wie man so etwas macht. Verwendet wird diese SP dann mit:
    <pre>
    select betrag from PRO_FAHRTSTRECKE_BETRAG(1, 125)
    </pre>
    wobei der erste Parameter die Kassen_ID definiert.
    <br>
    Du könnest das ganze auch als Executable SP machen, dann fällt das SUSPEND am Schluß weg und die Verwendung ist wie folgt:
    <pre>
    EXECUTE PROCEDURE PRO_FAHRTSTRECKE_BETRAG (1, 125) RETURNING_VALUES ...
    </pre>
    Der Vorteil von der Selectable SP ist allerdings, dass man diese auch als Inline-Select in einem normalen SELECT verwenden kann.
    <br><br>
    Schöne Grüße,
    <br><br>
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo,

      danke für die schnelle Anwort. Auf die Idee mit einem "For Select"-Vorgang zu arbeiten, hätte ich ja auch selber kommen können.

      Es gibt natürlich noch mehrere Faktoren die zur Auswahl des Tarifes nötig sind z.B. die Gültigkeitsdauer. Hierbau muss dann auch das Datum des Auftrages übertragen werden. Aber dieses in die Where-Klausel einzutragen dürfte nicht das Problem sein.

      Nochmals vielen Dank

      cu Ja

      Comment

      Working...
      X