SQL - OpenEdge: Denkanstoß Gültig ab - Gültig bis

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    SQL - OpenEdge: Denkanstoß Gültig ab - Gültig bis

    Hi,

    ich brauch glaube ich mal nen Denkanstoß.
    Ich habe ne Tabelle:
    ID
    Kundennummer
    Rabattgruppe
    Gültig ab
    Gültig bis (kann leer sein)
    Rabatt (kann leer sein)

    Ich möchte nun alle gültigen Datensätze haben.
    Hierbei ist zu beachten dass ein neueres Gültig ab immer vorrang hat, auch wenn ein Gültig bis bei gleichem Kunden und Rabatt vorhanden ist, welches noch nicht verstrichen ist.
    Es kann sein dass bei einer Rabattgruppe 0% enthalten ist... Diese Felder möchte ich auslassen.

    Wie krieg ich das über einen haufen. Ich komm mir gerade bisl aufm Schlauch vor...
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    huhu

    versuchs mal damit

    VB.NET-Quellcode

    1. Dim ts_gültigkeitsdifferenz As TimeSpan = DateTime.op_Subtraction(Gültig bis, Gültig ab)


    ts_gültigkeitsdifferenz negativ ist dann weiste das gültigkeit abgelaufen ist

    rest kannste dann mittels ts_gültigkeitsdifferen.milliseconds dann nach größe sotieren

    lg
    Hi,

    das ist nett gemeint, aber ich benötige eine richtige logische Klausel. Es handelt sich um eine SQL Abfrage an eine OpenEdge Datenbank. Da geht sowas schönes leider nicht ;)

    Mein Versuch ist aktuell bei:

    SQL-Abfrage

    1. SELECT gueltig_ab, gueltig_bis, Kunde, Rabattgruppe, Rabatt[1] AS Rabatt1, Rabatt[2] AS Rabatt2, Rabatt[3] AS Rabatt3
    2. FROM PUB.S_KunARabStaffel
    3. WHERE ((gueltig_ab < Curdate() Or gueltig_ab IS NULL) AND
    4. (gueltig_bis > Curdate() Or gueltig_bis IS NULL))
    5. ORDER BY Kunde, Rabattgruppe, gueltig_ab DESC , gueltig_bis


    Aber so ganz ist das noch nicht das Wahre
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Select * From <TAbelle> Where



    SELECT * FROM myTable WHERE (Gültig bis) < DATE(NOW()) sorted by (Gültig bis)


    so besser ?

    solltest evtl. schreiben das ne sql abfrage brauchst tabellen können au datagridviews sein ;)

    lg
    Hi,

    ja da hast du wohl recht ;)
    Ich denke immer irgendwie zu datenbänkerisch.
    Mit der Abfrage oben kriege ich alle Datensätze die es so gibt, welche ne Gültigkeit haben.
    Aber ich kriege nicht raus gefiltert, wenn hier unsere Tippfaulen kein gültig bis setzen...
    Sprich ich möchte eigentlich nur den gültigen Datensatz pro Rabattgruppe und pro Kunde haben.
    Mit der Klausel oben kriege ich aber alle die nicht ungültig sind...

    Beispiel:
    Kunde; Gruppe; Gültig ab; Gültig bis; Rabatt
    1;AB;01.01.1999;31.11.2003;12
    1;AB;01.12.2003;;15
    1;AB;01.01.2013;;11

    Da will ich nu den letzten Datensatz haben.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    sprich auf gut deutsch du willst den 2ten datensatz ignorieren weil der am 31.12.2012 eig. theoretisch gesehen abgelaufen ist und seit 1.1.2013 der neue gültig ist?

    dan musste auf gut deutsch erstmal ne abfrage machen welche gültig sind oder nichts drin stehen haben und dann den größten gültig ab rausziehen

    verstehe ich dich richtig?
    Genau,

    aber da ich diese Daten alle einlese und es sind ne ganze Menge Daten... möchte ich das die Datenbank filtern lassen. Die braucht dafür kaum Zeit. Aber wenn ich so die Abfrage ins Programm hole wie sie oben ist, dauerts mal geschmeidige 18 Sekunden...
    (Will die Daten nicht auf eine Rabattgruppe und Kunden begrenzt, sondern ALLE gültigen).

    Es geht hier um ne Update-Routine für nen Offline-V.I.S. Tool und da brauch ich einfach nen Spiegel der Datenbank... Aber bitte nur die gültigen Daten ;)
    Und da hier fast nie ein gültig bis gepflegt ist, sinds viel zu viele Datensätze.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    schon mit variable max versucht?


    Beispiel:

    Kunde; Gruppe; Gültig ab; Gültig bis; Rabatt

    1;AB;01.01.1999;31.11.2003;12

    1;AB;01.12.2003;;15

    1;AB;01.01.2013;;11


    SQL-Abfrage

    1. Select MAX("gültig ab"), Kunde,Rabatt,Gruppe From MeineTabelle Where
    2. "Gültig bis" <= DATE(NOW()) or "Gültig bis"=NULL


    sodala hoffe habe keinen denkfehler gerade der würde von deinem beispiel das letzte glaube ich rausziehen
    Er müsste das Max ja immer Kunden-Teilegruppe-Bezogen machen. Wenn ich nur nen Max auf die Abfrage mache, dann krieg ich ja nicht mehr alle gültigen Datensätze.

    Sprich:
    1;AB;01.01.1999;31.11.2003;12
    1;AB;01.12.2003;;15
    1;AB;01.01.2013;;11
    2;AB;01.01.1999;;6
    2;AB;01.12.2003;23.06.2005;4
    2;AB;01.01.2013;;6
    1;AC;01.01.1999;31.11.2003;13
    1;AC;01.12.2003;;11
    1;AC;01.01.2013;;14

    Da muss er mir ja raus hauen
    1;AB;01.01.2013;;11
    2;AB;01.01.2013;;6
    1;AC;01.01.2013;;14
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich kenn das "OpenEdge" nicht. Aber mach eine Abfrage wo du einfach nach gültig ab sortierst descending (absteigend).
    Abgefragt werden nur diese wo gültig bis > jetzt order null ist

    SQL-Abfrage

    1. select * from Table where ("gültig bis" > getdate() or "gültig bis" is null) order by Kunde, "gültig ab" desc


    dies wär im "normalen" sql so.

    btw: niemals Spaltennamen mit Sonderzeichen oder leerzeichen bennenen. Macht nur Probleme.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    SQL-Abfrage

    1. Select Kunde, Rabatt, Gruppe, MAX("gültig ab")
    2. From MeineTabelle
    3. Where "Gültig bis" <= DATE(NOW()) or "Gültig bis"=NULL
    4. Group By Kunde AND Gruppe



    ich weis nicht ob des geht versuch aba mal :S
    hi fichz

    Also nochmal meine Abfrage von oben welche noch nicht genug filtert!!! (da sie hier wohl jeder ignoriert^^)

    VB.NET-Quellcode

    1. SELECT gueltig_ab, gueltig_bis, Kunde, Rabattgruppe, Rabatt[1] AS Rabatt1, Rabatt[2] AS Rabatt2, Rabatt[3] AS Rabatt3
    2. FROM PUB.S_KunARabStaffel
    3. WHERE ((gueltig_ab < Curdate() Or gueltig_ab IS NULL) AND
    4. (gueltig_bis > Curdate() Or gueltig_bis IS NULL))
    5. ORDER BY Kunde, Rabattgruppe, gueltig_ab DESC , gueltig_bis

    Hier gibt es keine Sonderzeichen in den Tabellen... Rabatt ist ein Array ;)

    Ich möchte diese abfrage noch weiter filtern... Und zwar immer nur den letzten gültigen Datensatz je Kunde<->Rabattgruppe... Ich weiß aber nicht wie ich das hin kriege.

    @datspeed moment ich muss mir das mal in der Abfrage ansehen ;)
    Checked!!! Danke dir... Manchmal sieht man den Wald vor lauten Bäumen nicht XD
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Ein gültiger Datensatz heißt:
    1. Rabatt > 0
    2. Gültig ab NOT NULL
    3. Gültig ab < Aktuelles Datum
    4. Gültig bis > Aktuelles Datum oder NULL
    5. Es gibt keinen Datensatz mit aktuellerem Gültig ab bei kleiner Rabattgruppe<->Kunden Zuordnung
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Jap, funktionuckelt wunderbar ;)

    Vielen Dank.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D