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:
    19
    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:
    3.144
    Danke erhalten:
    716
    Danke vergeben:
    127
    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.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    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:
    19
    Danke erhalten:
    2
    Danke vergeben:
    7
     
  5. bambam3108
    bambam3108 Mitglied
    Registriert seit:
    16. Dezember 2019
    Beiträge:
    19
    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.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    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.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    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:
    19
    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.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    #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:
    823
    Danke erhalten:
    183
    Danke vergeben:
    208
    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.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    Stimmt! Krass… danke für den Hinweis!
     
  12. Christian Mueller
    Christian Mueller Beta-Held
    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    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:
    289
    Danke erhalten:
    39
    Danke vergeben:
    155
    @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.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    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.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    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
     
  16. Jan Brodowsky
    Jan Brodowsky Erfahrener Benutzer
    Registriert seit:
    20. Juni 2012
    Beiträge:
    289
    Danke erhalten:
    39
    Danke vergeben:
    155
    wie kann ich denn nur die positiven Werte zählen lassen? Ich arbeite viel mit Vorbestellungen und wenn bei einem Artikel noch 3 lagernd sind in Option A, aber in Option B 25 vorbestellt schaut der Bestand von -22 im Artikel nicht gut aus.
    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;
     
  17. Dominik Späte
    Dominik Späte Erfahrener Benutzer
    Registriert seit:
    16. Oktober 2018
    Beiträge:
    1.251
    Danke erhalten:
    1.141
    Danke vergeben:
    391
    Code:
    UPDATE products p JOIN ( SELECT products_id, SUM(combi_quantity) AS total_quantity FROM products_properties_combis WHERE combi_quantity>0 GROUP BY products_id ) c ON p.products_id = c.products_id SET p.products_quantity = c.total_quantity;
     
  18. peter 4189
    peter 4189 Aktives Mitglied
    Registriert seit:
    26. September 2011
    Beiträge:
    34
    Danke erhalten:
    4
    Danke vergeben:
    3
    Hallo,
    ich habe den Trigger ( Dominik Späte, 24. August 2024 ) unter Toolbox -> SQL ausgeführt und erhalte folgende Fehlermeldung : Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$ CREATE TRIGGER update_products_quantity AFTER UPDATE ON products_p' at line 1
    Ich nutze :
    Gambio Version: v4.9.6.1
    mysqlversion":"5.7.44-log
    Jemand eine Idee was ich tun kann ?
    Vielen Dank schonmal
     
  19. Christian Mueller
    Christian Mueller Beta-Held
    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    Die SQL-Konsole in Gambio versteht DELIMITER nicht und sendet das Skript in Häppchen an den SQL-Server. Es müsste aber komplett geschickt werden. Das macht der DELIMITER.

    SQL-Clients wie phpMyAdmin oder DBeaver, Heidi-SQL oder Adminer verstehen diesen Befehl.


    In der SQL-Konsole in Gambio müsstest Du es mit einem Trigger versuchen, der keinen Delimiter im Code enthält.

    Nach Update:
    Zuerst löschen wir einen bereits bestehenden Trigger (kann beim ersten Mal übersprungen werden.
    Code:
    DROP TRIGGER IF EXISTS update_products_quantity_au;
    Dann der eigentliche Trigger:
    Code:
    CREATE TRIGGER update_products_quantity_au
    AFTER UPDATE ON products_properties_combis
    FOR EACH ROW
      UPDATE products p
      JOIN (
        SELECT COALESCE(SUM(combi_quantity), 0) AS total_quantity
        FROM products_properties_combis
        WHERE products_id = NEW.products_id
      ) s ON p.products_id = NEW.products_id
      SET p.products_quantity = s.total_quantity
      WHERE NOT (NEW.combi_quantity <=> OLD.combi_quantity);
    Der Trigger ändert die Mengen nur, wenn sich etwas ändert. Wenn ein neuer Artikel angelegt wird, passiert nichts. Auch nicht wenn etwas gelöscht wird. Dafür kann man hier zwei weitere Trigger anlegen.

    Nach Insert:
    Wieder erst löschen, falls man was geändert hat:

    Code:
    DROP TRIGGER IF EXISTS update_products_quantity_ai;
    
    Dann der eigentliche Trigger:
    Code:
    CREATE TRIGGER update_products_quantity_ai
    AFTER INSERT ON products_properties_combis
    FOR EACH ROW
      UPDATE products p
      JOIN (
        SELECT COALESCE(SUM(combi_quantity), 0) AS total_quantity
        FROM products_properties_combis
        WHERE products_id = NEW.products_id
      ) s ON p.products_id = NEW.products_id
      SET p.products_quantity = s.total_quantity;
    
    Nach Delete:

    Wieder erst löschen, falls schon einer existiert:
    Code:
    DROP TRIGGER IF EXISTS update_products_quantity_ad;
    
    Code:
    CREATE TRIGGER update_products_quantity_ad
    AFTER DELETE ON products_properties_combis
    FOR EACH ROW
      UPDATE products p
      JOIN (
        SELECT COALESCE(SUM(combi_quantity), 0) AS total_quantity
        FROM products_properties_combis
        WHERE products_id = OLD.products_id
      ) s ON p.products_id = OLD.products_id
      SET p.products_quantity = s.total_quantity;
    
    Kontrolle:
    Um sich anzeigen zu lassen, welche Trigger existieren, nutzt man:
    Code:
    SHOW TRIGGERS;
     
  20. peter 4189
    peter 4189 Aktives Mitglied
    Registriert seit:
    26. September 2011
    Beiträge:
    34
    Danke erhalten:
    4
    Danke vergeben:
    3
    Vielen Dank Christian für die schnell Antwort. Ich habe es mal eingegeben und warte mal ab wie es sich verhält wenn einige Bestellungen durch sind.