gelöst Abgleich der Stückzahl von Hauptartikel und Varianten möglich?

Thema wurde von bambam3108, 23. August 2024 erstellt.

  1. bambam3108

    bambam3108 Mitglied

    Registriert seit:
    16. Dezember 2019
    Beiträge:
    18
    Danke erhalten:
    2
    Danke vergeben:
    7
    Hallo.
    Ich nutze Gambio in Verbindung mit Dreamrobot, komme aber beim Mengenabgleich bei Artikel mit Varianten nicht weiter.

    Und zwar lege ich einen Artikel an, dieser Artikel hat die Varianten "Farbe rot" und "Farbe blau", beide Farben sind zu je 100 Stück verfügbar. Nun müsste sich der Gesamtbestand aus beiden Varianten automatisch ergeben, also 200 Stück.
    Dies funktioniert aber bei Gambio nicht da ich beim Hauptartikel (Parent) selbst auch noch eine Stückzahl eingeben werden muss was total unlogisch ist.

    Gibt es eine Möglichkeit das sich der Gesamtbestand vom Hauptartikel automatisch aus den Variantenbeständen ergibt, ggfs. über ein Modul oder eine Umprogrammierung?
    Hat das evtl. jemand schonmal umgesetzt?

    VG
    Steff
     
  2. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.902
    Danke erhalten:
    621
    Danke vergeben:
    114
    Was genau ist hier das Problem?

    Was möchtest Du hier genau erreichen?

    Ja, gibt es. Aber: Vielleicht ist dies gar nicht notwendig!?

    Viele Grüße
     
  3. Dominik Späte

    Dominik Späte Erfahrener Benutzer

    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.089
    Danke erhalten:
    938
    Danke vergeben:
    338
    Dieser Trigger aktualisiert bei Änderung eines Variantenbestands den Bestand des Hauptartikels auf die Summe der Variantenbestände des jeweiligen Artikels:

    Code:
    DELIMITER $$
    
    CREATE TRIGGER update_products_quantity
    AFTER UPDATE ON products_properties_combis
    FOR EACH ROW
    BEGIN
        DECLARE total_quantity DECIMAL(10,2);
    
        -- Berechne die Summe der combi_quantity für die jeweilige products_id
        SELECT SUM(combi_quantity) INTO total_quantity
        FROM products_properties_combis
        WHERE products_id = NEW.products_id;
    
        -- Aktualisiere den Bestand in der products-Tabelle
        UPDATE products
        SET products_quantity = total_quantity
        WHERE products_id = NEW.products_id;
    END$$
    
    DELIMITER ;
    
     
  4. bambam3108

    bambam3108 Mitglied

    Registriert seit:
    16. Dezember 2019
    Beiträge:
    18
    Danke erhalten:
    2
    Danke vergeben:
    7
     
  5. bambam3108

    bambam3108 Mitglied

    Registriert seit:
    16. Dezember 2019
    Beiträge:
    18
    Danke erhalten:
    2
    Danke vergeben:
    7
    @Dominik Späte
    Vielen Dank für den Trigger, das wäre die Lösung wenn sich bei Änderung eines Variantenbestands automatisch auch der Bestand des Hauptartikels auf die Summe der Variantenbestände ändert.
    Den Trigger muss ich unter Toolbox -> SQL ausführen, ist das richtig?
    Danke und viele Grüße
     
  6. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.768
    Danke erhalten:
    934
    Danke vergeben:
    302
    Du legst damit den Trigger an.
    Dr läuft dann dauerhaft direkt in der Datenbank und wird automatisch ausgeführt wenn die Bedingung eintritt. In diesem Fall wenn sich irgendwas in products_properties_combis ändert. Also bei den Varianten.
     
  7. Dominik Späte

    Dominik Späte Erfahrener Benutzer

    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.089
    Danke erhalten:
    938
    Danke vergeben:
    338
    Ja, richtig. Leider klappt es da aber nicht immer. Dann müsstest Du auf z.B. phpMyAdmin ausweichen. Anschließend kannst Du z.B. damit kontrollieren, ob das Anlegen geklappt hat:
    Code:
    SHOW TRIGGERS WHERE `Trigger` = 'update_products_quantity'
    Ja, völlig richtig. Und mich stört dieses "irgendwas". Wenn sich der Variantenbestand nicht ändert, brauchen wir auch den Bestand des Hauptartikels nicht neu berechnen und "ändern". Deshalb hier nochmal etwas effizienter:

    Code:
    DROP TRIGGER IF EXISTS update_products_quantity;
    
    DELIMITER $$
    
    CREATE TRIGGER update_products_quantity
    AFTER UPDATE ON products_properties_combis
    FOR EACH ROW
    BEGIN
        DECLARE total_quantity DECIMAL(10,2);
    
        -- Nur ausführen, wenn sich combi_quantity geändert hat
        IF NEW.combi_quantity != OLD.combi_quantity THEN
            -- Berechne die Summe der combi_quantity für die jeweilige products_id
            SELECT SUM(combi_quantity) INTO total_quantity
            FROM products_properties_combis
            WHERE products_id = NEW.products_id;
    
            -- Aktualisiere den Bestand in der products-Tabelle
            UPDATE products
            SET products_quantity = total_quantity
            WHERE products_id = NEW.products_id;
        END IF;
    END$$
    
    DELIMITER ;
    
     
  8. bambam3108

    bambam3108 Mitglied

    Registriert seit:
    16. Dezember 2019
    Beiträge:
    18
    Danke erhalten:
    2
    Danke vergeben:
    7
    @Dominik Späte
    Vielen Dank. Hab es nun über phpMyAdmin versucht, kann den Trigger aber nicht erstellen da ich eine Fehlermeldung erhalte, siehe Screenshots:


    2.JPG



    1.JPG
     
  9. Dominik Späte

    Dominik Späte Erfahrener Benutzer

    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.089
    Danke erhalten:
    938
    Danke vergeben:
    338
    #9 Dominik Späte, 24. August 2024
    Zuletzt bearbeitet: 24. August 2024
    @bambam3108 Den Code einfach nur als SQL-Befehl ausführen und fertig.

    sql.png
     
  10. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    15. Mai 2017
    Beiträge:
    735
    Danke erhalten:
    148
    Danke vergeben:
    188
    Hinweis zu Triggern:
    Diese soillten man sich als Script auch zusätzlich abspeichern, da diese bei´einer Gambio Datenbanksicherung aus dem Admin Backend nicht (!) mit gesichert werden, also auch bei einer Wiederherstellung über den Gambio Admin nicht wieder erstellt werden. Diese müssten dann über phpadmin wieder neu angelegt werden.
     
  11. Dominik Späte

    Dominik Späte Erfahrener Benutzer

    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.089
    Danke erhalten:
    938
    Danke vergeben:
    338
    Stimmt! Krass… danke für den Hinweis!
     
  12. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.768
    Danke erhalten:
    934
    Danke vergeben:
    302
    Deshalb besser mit mysqldump auf der Console sichern oder direkt als lokaler Cronjob. Da kommt alles mit. Auch Trigger und Events.
     
  13. Jan Brodowsky

    Jan Brodowsky Erfahrener Benutzer

    Registriert seit:
    20. Juni 2012
    Beiträge:
    255
    Danke erhalten:
    28
    Danke vergeben:
    135
    @Dominik Späte: Ich packe also nur deinen Code aus Post #7 in SQL rein und schon stimmt die Artikel Gesamtanzahl anhand der Summe der Varianten?! Da krieg ich ja gleich feuchte Augen

    @Christian Mueller: Kannst du mir einen Hilfs Input geben bitte, wie ich einen Cronjob mit diesem SQL Befehl erschaffe
     
  14. Dominik Späte

    Dominik Späte Erfahrener Benutzer

    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.089
    Danke erhalten:
    938
    Danke vergeben:
    338
    Nein. Und ohne Christian vorgreifen zu wollen: Du brauchst keinen CronJob, weil der Trigger sich live darum kümmert.

    Um einmalig (bzw. initial) die Bestände der Hauptartikel auf die Summe der Variantenbestände des jeweiligen Artikels zu aktualisieren, kannst Du das hier verwenden:

    Code:
    UPDATE products p
    JOIN (
        SELECT products_id, SUM(combi_quantity) AS total_quantity
        FROM products_properties_combis
        GROUP BY products_id
    ) c ON p.products_id = c.products_id
    SET p.products_quantity = c.total_quantity;
    
     
  15. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.768
    Danke erhalten:
    934
    Danke vergeben:
    302
    ich meinte Du solltest mit mysqldump per Cronjob sichern.

    Dafür brauchst du Zugriff auf die Shell/Console.Hat aber den Vorteil, daß das dann ohne PHP dazwischen läuft und keine PHP-Beschränkungen greifen. Daher gibt es da auch keine Timeouts.

    Wie das mit einem einfachen Shell-Script geht, habe ich mal vor Urzeiten beschrieben:

    Automatische Sicherung der Dateien