Datenbankabfragen entwerfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankabfragen entwerfen

    Hallo,

    nicht nur neu im Forum, auch komplett Newbie in php und mysql will (und muß) ich nun doch mal anfangen mich mit dieser Materie zu beschäftigen. Bisher war ich mit css und html "ausgelastet", doch das reicht nun nicht mehr.
    Das Problem: ich muß in einem onlineshop Versandregeln erarbeiten.
    Nun kann es ein, das ich hier vollkommen falsch bin, dann bitte nicht meckern, einfach ignorieren
    Also die verwendete Software ist shopware 3.5.6 wem das was sagt.
    Die einfachen Regeln dort über Gewicht, Anzahl, Artikelpreis sind nicht verwendbar, doch die Option "eigene Berechnung" soll es bringen.
    Jedenfalls ist die zu erstellende Formel ziemlich komplex, da einige Bedingungen umgesetzt werden müssen.
    Bei den Shop-Artikeln lassen sich Attribute (Datenbankfelder) mit den Feldtypen boolean, text und textarea erstellen, die dann in der Berechnung abgefragt werden.

    Um die Gestalt der Formel zu verstehen, erkläre ich am besten konkret anhand dem was da rauskommen soll:
    Es gibt insgesamt vier Versandkostenpreise (diese dann noch in drei Länderzonen), wobei im Falle des Kombinationskaufs der höchste Preis je nach Artikelgruppe bezahlt werden soll. Allerdings mit einer Ausnahme die die ganze Sache verkompliziert.
    Also, für die Länderzone1 soll gelten:
    Artikelgruppe 1 - 2,50€
    Artikelgruppe 2 - 6,50€
    Artikelgruppe 2** ebenfalls 6,50€
    Artikelgruppe 3 - 9,50€ und jetzt kommt die Ausnahme:
    Alle Artikel lassen sich gemeinsam verschicken, nur Artikel der Artikelgruppe 2** lassen sich nicht zusammen mit den Artikeln aus Gruppe 3 versenden und es kommt zwangsläufig zu zwei zu versendenden Paketen. Das wiederum führt zum Versandpreis 13,00€
    Allerdings Artikelgruppe 2 und Artikelgruppe 2**gehen gemeinsam, auch Artikelgruppe 1 und Artikelgruppe 2** gehen gemeinsam.

    ein paar Beispiele:
    Artikelgruppe 1 + Artikelgruppe 2 = 6,50€
    Artikelgruppe 1 + Artikelgruppe 3 = 9,50€
    Artikelgruppe 1 + Artikelgruppe 2 + Artikelgruppe 2** = 6,50€
    Artikelgruppe 3 + Artikelgruppe 2** = 13,00€

    Hinzugefügt sei, dass jede Länderzone eine eigene Versandart darstellt und damit eine eigene Formel erhält, die sich nur in den eingefügten Preisen unterscheidet (denke ich jedenfalls )

    Nun habe ich mir gedacht, dass man das mit einer logischen Formel verknüpfen kann.
    Doch ich weiß nicht, lassen sich logische sql-Befehle und die Preise in eine Formel gemeinsam hineinschreiben?
    Vorausgesetzt, das geht, dann würden die anzulegenden Attribute (Datenbankfelder) vom Typ "boolean" sein müssen und den Artikelgruppen s.o. entsprechen.
    Bei der Anlage eines neuen Artikels bekäme er dann bei dem für ihn zutreffenden Attribut den Haken in die Checkbox.

    Die Formel müßte vom Aufbau her wahrscheinlich zwei Hauptteile haben und vielleicht logisch so ungefähr aussehen:
    im ersten Teil der Formel wird ermittelt welches ist der höchste Preis der Kombination, der wird erstmal genommen, in der Art "Artikelgruppe1 UND Artikelgruppe2 UND Artikelgruppe3 -->DANN 9,50€ und im zweiten Teil müßte die Sonderbedingung abgefragt werden: "WENN Artikelgruppe3 UND Artikelgruppe2** -->DANN 13,00€"

    Nun hoffe ich auf Hilfe, bitte nicht zu sehr insidermäßig antworten, ich stehe wirklich am Anfang in dieser Materie.
    Schonmal vielen Dank im voraus ,

    Cora

  • #2
    Wie es aussieht, ist mein Thema wohl nicht richtig aufgehoben in dieser Rubrik.
    Vielleicht hat jemand einen Tipp, wie ich an die Lösung herangehen könnte, oder wer da evtl. ein kompetenter Helfer sein könnte.

    Kommentar


    • #3
      Hallo Cora,

      ich hoffe ich habe dein Problem verstanden und eine passende Lösung für dich parat, denn solch eine Anforderung mussten wir bislang noch nicht umsetzen.

      Zuerst einmal, wie speicherst du die Artikelgruppe? Sind das Kategorien oder ein eigenes Artikel Attributsfeld ?
      Ich gehe jetzt mal von einem eigens angelegten Attributsfeld mit dem Datenbanknamen attr1 aus.

      Dieses Feld kann folgende Werte annehmen:

      1: für Artikel aus Gruppe 1
      2: für Artikel aus Gruppe 2
      4: für Artikel aus Gruppe 2*
      8: für Artikel aus Gruppe 3

      Dies hat den Grund, dass sich damit recht leicht binär rechnen lässt.

      Nun zur Regel. Da gibt es bestimmt eine einfachere/elegantere Lösung, aber folgende sollte funktionieren.

      Ich bin her gegangen und hab mir überlegt, welche Kombinationen zu stande kommen können. Folgende sollten alle Fälle abdecken:

      nur aus Gruppe 1 = 2,50
      aus (Gruppe 2 oder Gruppe 2*), aber nicht 3 = 6,50
      aus Gruppe 3, aber nicht 2* = 9,50
      aus Gruppe 2* und Gruppe 3

      Ich weiß nicht wieviel Ahnung du von Aussagenlogik hast, aber das sollte (sofern ich hoffentlich nichts vergessen habe) alles abdecken.

      Es sind so wenig Gruppen, da z.B. Gruppe 1 bis auf den Fall das im Warenkorb nur Artikel aus dieser Gruppe sind vollkommen irrelevant ist.

      Nun lässt sich in der Berechnungsregel mit SUM(at.attr1) die Summe aus den Gruppen bekommen. Machen wir ein Beispiel wir haben im Warenkorb folgende Artikel:

      Gruppe 1 und Gruppe 3 = 1 + 8 = 9 = (binär) 1001
      oder
      Grupp 2* und Gruppe 3 und Gruppe 2 = 2 + 4 + 8 = 14 = (binär) 1110

      Man sieht an den Binären stellen also sofort welche Artikelgruppen enthalten sind.

      Jetzt kann man mit einem bitweisen AND prüfen ob eine Artikelgruppe enthalten ist. Ich bilde also einfach alle oben genannten fälle ab:

      Code:
      IF(SUM(at.attr1) = 1, 2.5, 
      	IF((SUM(at.attr1)&2 OR SUM(at.attr1)&4) AND !(SUM(at.attr1)&8), 6.5,
      		IF((SUM(at.attr1)&8) AND !(SUM(at.attr1)&4), 9.5,
      			IF(SUM(at.attr1)&4 AND SUM(at.attr1)&8, 13, 99)
      		)
      	)
      )
      Die 99 gilt als Fallback Lösung, die eigentlich nicht eintreten sollte, nur wenn ich einen Fehler gemacht habe

      Für andere Länder würde ich einfach eine zweite Versandart anlegen, die nur in dem entsprechenden Land gilt und andere Zahlenwerte enthält.


      So nun hab ich doch schon die ausführliche Antwort geschrieben, wollte dich eigentlich auf morgen vertrösten weil es doch schon recht spät ist, aber hat mich selbst interessiert

      Gruß Danny
      Zuletzt geändert von hostbar_danny; 27.01.2012, 00:55.
      hostbar - Full Service Internet Agentur

      Kommentar


      • #4
        Hallo Danny,
        ui, das ist ja schon ein ganz schöner Schritt. Find ich klasse, dass du dich so hineingedacht hast und bei dieser wohl nicht so einfachen Sache helfen willst.

        Du hast das ganze Problem sehr gut verstanden.,

        Das zusätzliche Attributfeld wird in den Artikeleinstellungen hinzugefügt, nach deiner Beschreibung habe ich als Feldtyp "text" gewählt.
        Die 1 - 2 - 4 - 8 leuchtet mir ein, inwieweit dann die logischen Verknüpfungen alles abdecken, soweit reichts bei mir nicht, aber zumindest verstehe ich das Prinzip.

        Nun habe ich bereits alles wie ich es verstehe entsprechend konfiguriert, als Versandpreis erscheint allerdings immer 0.

        Was ich also getan habe:
        Zuerst das Attribut angelegt, vorn stehen die Auswahlfelder, dahinter was ich eingetragen bzw. ausgewählt habe.
        Eindeutiger Name (attr[1] bis attr[20]): attr[6]
        Standardwert:
        Typ des Feldes (boolean, text, textarea) : text
        Name des Feldes: Danny
        Auswahl erzwingen: Nein
        Position:: 0
        Datenbank-Feld (attr1 bis attr20): attr6
        Eingabe für Varianten möglich: 1
        Hilfetext Eingabe:
        Multilanguage: ja

        Das Attribut #6 habe ich genommen, da bereits 1 - 5 existieren.

        Danach habe ich eine Versandart angelegt, Typ "eigene Berechnung", dort habe ich bei den "erweiterten Einstellungen" im Feld "eigene Versandkostenberechnung" deinen code reinkopiert, dabei von Attribut #1 auf #6 geändert.
        Dann habe ich bei vier Artikeln im neuen Attribut jeweils die 1 - 2 - 4 - 8 eingetragen.
        Siehst du auf Anhieb einen Fehler?
        Würde mich freuen, du würdest noch weiter dranbleiben können, ich glaube es ist schon ziemlich weit was die Lösung angeht.

        Grüße
        Cora

        Kommentar

        Lädt...
        X