• # Réponse collective

    Posté par (site web personnel, Mastodon) . En réponse au message Sous requêtes et alias. Évalué à 1.

    Merci pour les commentaires et suggestions.

    Notamment à https://linuxfr.org/users/abriotde qui a proposé une réponse explicite à la demande de requête (et qui fonctionne sous sqlite).

    En ce qui concerne la question table d'états mise à jour à chaque mouvement ou requête qui synthétise les états à chaque demande, je m'étais posé cette question, et j'avais effectivement pris en compte les performances et fait le choix d'une table des états.

    Mais je ne vous ai pas tout dit, en réalité c'est la faute de https://sql-page.com/ qui m'a motivé à bricoler ce truc, et au départ j'avais donc soigneusement mitonné des triggers lors des insertions/màj/suppression sur la table Mouvements et cela fonctionnait correctement. Mais lors de l'implémentation des pages sqlpage, je me suis inspiré des bouts de code trouvés sur internet et j'ai voulu utiliser la syntaxe INSERT OR REPLACE et là évidemment, j'ai eu des surprises. Et après quelques heures de recherche, j'ai fini par envisager cette solution de la requête systématique, en me basant sur l'idée que les dimension seraient de l'ordre de moins d'une centaine de produit, moins d'une vingtaine d'emplacements et moins de 500 mouvements par an (pour mon cas d'usage, l'objectif étant de faire tourner le bazar sur raspberry pi 2B).

    Pour le moment, et en prenant en compte les échanges ici, j'ai fini par modifier mes pages sqlpage et gérer une table des états mise à jour à chaque modification de la table.

    Exemple des triggers dans la définition de la base :

    CREATE TABLE
     Bilans (
     emplacement INTEGER NOT NULL REFERENCES Emplacements (id),
     produit INTEGER NOT NULL REFERENCES Produits (id),
     nombre INTEGER NOT NULL,
     PRIMARY KEY (emplacement, produit)
     );
    CREATE TRIGGER maj_bilans_insert AFTER INSERT ON Mouvements BEGIN
    INSERT INTO
     Bilans (emplacement, produit, nombre)
    VALUES
     (NEW.origine, NEW.produit, - NEW.qte_mvmt) ON CONFLICT (emplacement, produit) DO
    UPDATE
    SET
     nombre = nombre - NEW.qte_mvmt;
    INSERT INTO
     Bilans (emplacement, produit, nombre)
    VALUES
     (NEW.destination, NEW.produit, NEW.qte_mvmt) ON CONFLICT (emplacement, produit) DO
    UPDATE
    SET
     nombre = nombre + NEW.qte_mvmt;
    END;
    CREATE TRIGGER maj_bilans_delete AFTER DELETE ON Mouvements BEGIN
    UPDATE Bilans
    SET
     nombre = nombre - OLD.qte_mvmt
    WHERE
     (
     Bilans.emplacement = OLD.destination
     AND Bilans.produit = OLD.produit
     );
    UPDATE Bilans
    SET
     nombre = nombre + OLD.qte_mvmt
    WHERE
     (
     Bilans.emplacement = OLD.origine
     AND Bilans.produit = OLD.produit
     );
    END;
    CREATE TRIGGER maj_bilans_update BEFORE
    UPDATE ON Mouvements BEGIN
    UPDATE Bilans
    SET
     nombre = nombre - OLD.qte_mvmt
    WHERE
     (
     Bilans.emplacement = OLD.destination
     AND Bilans.produit = OLD.produit
     );
    UPDATE Bilans
    SET
     nombre = nombre + OLD.qte_mvmt
    WHERE
     (
     Bilans.emplacement = OLD.origine
     AND Bilans.produit = OLD.produit
     );
    INSERT INTO
     Bilans (emplacement, produit, nombre)
    VALUES
     (NEW.origine, NEW.produit, - NEW.qte_mvmt) ON CONFLICT (emplacement, produit) DO
    UPDATE
    SET
     nombre = nombre - NEW.qte_mvmt;
    INSERT INTO
     Bilans (emplacement, produit, nombre)
    VALUES
     (NEW.destination, NEW.produit, NEW.qte_mvmt) ON CONFLICT (emplacement, produit) DO
    UPDATE
    SET
     nombre = nombre + NEW.qte_mvmt;
    END;