Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mettre résultat d'une requête dan un fichier texte

Sujet résolu
    5 février 2020 à 15:37:19

    Pourquoi stocker deux fois l'id dans la table article ? unit_id et unit_po_id ?

    Tu peux avoir deux valeurs différentes là ? Genre une unité de commande et une unité de stockage ?

    Sinon tu peux déjà partir comme ceci :

    CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
    DECLARE v_unit_id INTEGER;
    BEGIN
        -- Recherche si unité existe
        SELECT INTO v_unit_id id
        FROM unite
        WHERE designation = NEW.id_po_unite;
         
        -- si existe pas
        IF v_unit_id IS NULL
            -- on crée une nouvelle unité
            INSERT INTO Unite ( id, nom, designation )
            VALUES ( nextval('Unite_id_seq'), NEW.unit_id, NEW.unit_po_id );
            -- et on récupère son id
            SET v_unit_id = currval( 'Unite_id_seq' );
        END IF;
         
        -- on affecte id à NEW
        SET NEW.unit_po_id = v_unit_id;
        SET NEW.unit_id = v_unit_id;
         
        RETURN NULL;
    END;
    $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
    CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON Article
    FOR EACH ROW
    EXECUTE PROCEDURE ajout_uinte_ou_pas();
    • Partager sur Facebook
    • Partager sur Twitter
    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
      5 février 2020 à 17:36:18

      Oui c'est ça mais c'est les deux même valeurs dans la vrai table unite

      J'ai cette erreur et je ne vois pas comment l'enlever

      ajou_unit152e.sql:24: ERREUR: erreur de syntaxe sur ou près de « ( »
      LINE 27: SET v_unit_id = currval( 'Unit_id_seq' )

      -
      Edité par VictorLcmt 5 février 2020 à 17:37:32

      • Partager sur Facebook
      • Partager sur Twitter
        5 février 2020 à 18:20:26

        Je ne suis pas sûr de moi, mais remplace :

        SET v_unit_id = currval( 'Unite_id_seq' );

        Par :

        v_unit_id := currval( 'Unite_id_seq' );
        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          6 février 2020 à 9:50:38

          Je veux bien mais comment vous faites en python pour faire la même chose je ne vois pas

          Du coup on peut faire qu'une unité écrite de différentes manière peut être la même si Unité est écrit UNITÉ c'est la même unité mais l'utilisateur l'a écrite en maj alors qu'il ne voulait pas il faut aussi que je gère ça en plus du reste 

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2020 à 13:32:13

            VictorLcmt a écrit:

            Je veux bien mais comment vous faites en python pour faire la même chose je ne vois pas

            Je ne comprends pas ta question ... Mon dernier message te proposait de corriger l'erreur dans la procédure SQL ajout_uinte_ou_pas, et là tu reparles de Python ... De quoi parles-tu du coup ?

            VictorLcmt a écrit:

            Du coup on peut faire qu'une unité écrite de différentes manière peut être la même si Unité est écrit UNITÉ c'est la même unité mais l'utilisateur l'a écrite en maj alors qu'il ne voulait pas il faut aussi que je gère ça en plus du reste 

            Tu pourrais par exemple forcer en minuscule et sans accent la valeur donnée avec LOWER et TRANSLATE :

            CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
            DECLARE v_unit_id INTEGER;
            BEGIN
            	-- Recherche si unité existe
            	SELECT INTO v_unit_id id
            	FROM unite
            	WHERE designation = LOWER( TRANSLATE( NEW.unit_po_id, 'àéè', 'aee' ) );
            	  
            	-- si existe pas
            	IF v_unit_id IS NULL
            		-- on crée une nouvelle unité
            		INSERT INTO Unite ( id, nom, designation )
            		VALUES ( nextval('Unite_id_seq'), LOWER( TRANSLATE( NEW.unit_id, 'àéè', 'aee' ) ), LOWER( TRANSLATE( NEW.unit_po_id ), 'àéè', 'aee' ) );
            		-- et on récupère son id
            		v_unit_id := currval( 'Unite_id_seq' );
            	END IF;
            	  
            	-- on affecte id à NEW
            	SET NEW.unit_po_id = v_unit_id;
            	SET NEW.unit_id = v_unit_id;
            	  
            	RETURN NULL;
            END;
            $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
            CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON Article
            FOR EACH ROW
            EXECUTE PROCEDURE ajout_uinte_ou_pas();

            -
            Edité par Benzouye 6 février 2020 à 13:32:29

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              6 février 2020 à 19:16:02

              Ok je vais regarder ca merci
              • Partager sur Facebook
              • Partager sur Twitter
                13 février 2020 à 10:40:20

                Est ce que cela est possible d'automatiser un INSERT INTO SELECT car je me suis rendu compte que le trigger n'étais pas adapter au fonctionnent de la base de données ça me met des erreurs donc j'ai pensé à une autre solution, de faire ça dans un script et de lancer le script après
                • Partager sur Facebook
                • Partager sur Twitter
                  13 février 2020 à 10:55:14

                  VictorLcmt a écrit:

                  je me suis rendu compte que le trigger n'étais pas adapter au fonctionnent de la base de données

                  C'est à dire ? En l'état c'est une bonne solution ...

                  VictorLcmt a écrit:

                  ça me met des erreurs

                  Lesquelles ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    13 février 2020 à 11:05:42

                    En l'état c'est bon, ca me mets des erreurs sur le  logiciels qu'ils utilisent mais sinon pas d’erreurs 

                    Du coup est ce qu'on peut faire un script shell qui fera un insert into select  

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 février 2020 à 11:22:00

                      Si j'essaye de reprendre ce que l'on a appris de ton projet :

                      • tu pars d'un fichier CSV (apparemment environ 5 000 lignes)
                      • un programme en Python récupère ce fichier, le transforme en XML et fait une boucle sur chaque noeud pour insérer dans ta base de données des produits
                      • un TRIGGER BEFORE INSERT permet de contrôler si l'unité existe, si elle n'existe pas on la crée et on insère le produit
                      • un TRIGGER AFTER INSERT permet de sauvegarder dans une autre table les insertions faites

                      Maintenant tu parles d'un autre logiciel qui exploite apparemment les données en base précédemment insérées ...

                      Et en quoi le fait de changer le traitement ci-dessus avec un INSERT INTO SELECT changerait les erreurs côté logiciel ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        18 février 2020 à 19:32:58

                        Bonjour je reprend le sujet de zéro,

                        Je voudrais savoir comment faire afin de récupérer des valeurs id que je connais car ces id sont déjà renseigner car les valeurs sont déjà dans les tables

                        Il y a une table principale ou tout. ce passe qui est la table product_template ou j'insère une requête comme celle-ci :

                        INSERT INTO "public"."product_template" ("id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id\
                        ","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","track\
                        ing","purchase_method","purchase_line_warn")
                            VALUES (nextval('product_template_id_seq'::regclass),'Tournevis',1,'product',FALSE,2.20.2.9,1.13,0,0.00,TRUE,TRUE,'UNITE','UNITE',2,TRUE\
                        ,'6rtl9',2,NOW(),2,NOW(),'manual','no-message','no','order',2,0,'none','receive','no-message');

                        Moi ce que je voudrais faire c'est récupérer l'id de la table product_category et le mettre à la place de '2.20.2.9', et j'aimerais faire la m^me chose avec les champ nom_id et uom_po_id récupérer la valeur de la table uom_uom et le mettre à la place de 'UNITE'

                        C'est à dire avoir une ligne comme celle-ci après insertion 

                        J'ai déjà tester ce trigger la avec des currval() mais ca ne fonctionne pas :

                        INSERT INTO "public"."product_template" ("id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id\
                        ","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","track\
                        ing","purchase_method","purchase_line_warn")
                            VALUES (nextval('product_template_id_seq'::regclass),'Tournevis',1,'product',FALSE,98,1.13,0,0.00,TRUE,TRUE,5432,5432,2,TRUE\
                        ,'6rtl9',2,NOW(),2,NOW(),'manual','no-message','no','order',2,0,'none','receive','no-message');


                        Où l'id de UNITE dans la table uom_uom est 5432 et l'id de 2.20.2.29 dans la table product_category est 98

                        Le trigger que j'ai tester est celui-là 

                        CREATE OR REPLACE FUNCTION recup_all() RETURNS TRIGGER AS $recup_all$
                        BEGIN
                            INSERT INTO "public"."product_template" ("name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn") 
                            VALUES (
                                NEW.name,
                                NEW.sequence,
                                NEW.type,
                                NEW.rental,
                                currval( 'product_category_id_seq' ),
                                NEW.list_price,
                                NEW.volume,
                                NEW.weight,
                                NEW.sale_ok,
                                NEW.purchase_ok,
                                currval( 'uom_uom_id_seq' ),
                                currval( 'uom_uom_id_seq' ),
                                NEW.company_id,
                                NEW.active,
                                NEW.default_code,
                                NEW.create_uid,
                                NEW.create_date,
                                NEW.write_uid,
                                NEW.write_date,
                                NEW.service_type,
                                NEW.sale_line_warn,
                                NEW.expense_policy,
                                NEW.invoice_policy,
                                NEW.responsible_id,
                                NEW.sale_delay,
                                NEW.tracking,
                                NEW.purchase_method,
                                NEW.purchase_line_warn
                            );
                        
                            RETURN NULL;
                        END;
                        $recup_all$ LANGUAGE plpgsql;
                        
                        CREATE TRIGGER recup_all AFTER INSERT OR UPDATE ON product_template
                        FOR EACH ROW
                        EXECUTE PROCEDURE recup_all();

                        Mais je ne sais pas ce qui ne va pas, pouvez-vous m'aider



                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 février 2020 à 20:52:25

                          On repart donc sur les mêmes absurdités...

                          Tu ne sais pas ce que tu fais et tu n'utilises pas ce qui t'a été montré plus tôt. 

                          Ici ton trigger est cafter insert or update, mais tu fais un insert à l'intérieur donc boucle infinie donc erreur ...

                          Réponds aux questions ci-dessus et valide la reformulation proposée de ton projet...

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            18 février 2020 à 21:28:23

                            Si je sias ce que je fais mais je n'arrive pas récupérer les valeurs que j'aimerais récupérer 

                            Vous voulez que je réponde aux questions à partir de quand car j'ai des question ou je n'ai plus les réponses

                            Ok je vais voir ce qui à été fais plus haut mais pouvez vous m'aidez cette fonctionnalité est crucial pour la suite de mon projet 

                            EN plus j'ai pris le risque de m'être les valeurs des vrais champs de la base de données de l'entreprise, je ne sais pas si j'ai le droit 

                            Que dois-je faire, j'ai essayé de détailler au mieux et ca ne va toujours pas que dois-je faire pour que tout aille pour le mieux, et j'ai mis un exemple de ce que j'avais tester, et j'aimerais savoir comment faire ce traitement, si il n'est pas possible, comment faire pour le rendre possible 

                            -
                            Edité par VictorLcmt 18 février 2020 à 22:00:35

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 février 2020 à 9:13:29

                              VictorLcmt a écrit:

                              Que dois-je faire, j'ai essayé de détailler au mieux et ca ne va toujours pas

                              Nous ne savons pas exactement ce que tu as vraiment mis en place. Commence par répondre aux questions ce-dessus.

                              VictorLcmt a écrit:

                              Vous voulez que je réponde aux questions à partir de quand

                              Regarde simplement ce message juste au dessus, et confirme-nous quel est le fonctionnement précis actuel de ton programme, avec le code des requêtes en place (procédure ou trigger), et ce à quoi tu veux arriver, pas "comment tu veux y arriver" mais vraiment le résultat attendu.

                              VictorLcmt a écrit:

                              j'ai pris le risque de m'être les valeurs des vrais champs de la base de données de l'entreprise

                              On sait maintenant que tu travailles pour une entreprise qui gère des tournevis ... Ce que l'on sait depuis plusieurs jours maintenant ... Rien de très confidentiel non ?

                              Pour résumer, ton prochain message devra expliquer les étapes précises de ton programme Python actuel, la structure de ta base de données (au moins les tables en jeu : produit, unité, catégorie, product_update), et les procédures ou trigger en place. Et après nous dire le résultat que tu veux obtenir au final.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                19 février 2020 à 9:27:56

                                Benzouye a écrit:

                                Si j'essaye de reprendre ce que l'on a appris de ton projet :

                                • tu pars d'un fichier CSV (apparemment environ 5 000 lignes)
                                • un programme en Python récupère ce fichier, le transforme en XML et fait une boucle sur chaque noeud pour insérer dans ta base de données des produits
                                • un TRIGGER BEFORE INSERT permet de contrôler si l'unité existe, si elle n'existe pas on la crée et on insère le produit
                                • un TRIGGER AFTER INSERT permet de sauvegarder dans une autre table les insertions faites

                                Maintenant tu parles d'un autre logiciel qui exploite apparemment les données en base précédemment insérées ...

                                Et en quoi le fait de changer le traitement ci-dessus avec un INSERT INTO SELECT changerait les erreurs côté logiciel ?

                                Oui je par d'un fichier CSV, qui me le transforme en XML, ensuite j'utilise en template XSL qui permet de transformer mon XML en SQL 

                                La création de l'unité je l'ai fait en amont donc il me reste juste de récupérer l'id de l'unité qui à été crée et de mettre cette id à la place d'une chaîne de caractère, j’aimerais le faire avec un TRIGGER BEFORE INSERT

                                Le logiciel en question est un ERP se nommant odoo, mais j'ai trouvé une solution pour cette partie, comme j'ai trouvé une solution, je réponds quand même à la question, le fait de changer de traitement c'était pour voir si il y avait la même erreur dans odoo, mais comme je vous ai dit j'ai trouvé une solution pour cette partie

                                Les bases en jeu sont celle de ce message la :

                                VictorLcmt a écrit:

                                Bonjour je reprend le sujet de zéro,

                                Je voudrais savoir comment faire afin de récupérer des valeurs id que je connais car ces id sont déjà renseigner car les valeurs sont déjà dans les tables

                                Il y a une table principale ou tout. ce passe qui est la table product_template ou j'insère une requête comme celle-ci :

                                INSERT INTO "public"."product_template" ("id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id\
                                ","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","track\
                                ing","purchase_method","purchase_line_warn")
                                    VALUES (nextval('product_template_id_seq'::regclass),'Tournevis',1,'product',FALSE,2.20.2.9,1.13,0,0.00,TRUE,TRUE,'UNITE','UNITE',2,TRUE\
                                ,'6rtl9',2,NOW(),2,NOW(),'manual','no-message','no','order',2,0,'none','receive','no-message');

                                Moi ce que je voudrais faire c'est récupérer l'id de la table product_category et le mettre à la place de '2.20.2.9', et j'aimerais faire la même chose avec les champ nom_id et uom_po_id récupérer la valeur de la table uom_uom et le mettre à la place de 'UNITE'

                                C'est à dire avoir une ligne comme celle-ci après insertion 

                                J'ai déjà tester ce trigger la avec des currval() mais ca ne fonctionne pas :

                                INSERT INTO "public"."product_template" ("id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id\
                                ","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","track\
                                ing","purchase_method","purchase_line_warn")
                                    VALUES (nextval('product_template_id_seq'::regclass),'Tournevis',1,'product',FALSE,98,1.13,0,0.00,TRUE,TRUE,5432,5432,2,TRUE\
                                ,'6rtl9',2,NOW(),2,NOW(),'manual','no-message','no','order',2,0,'none','receive','no-message');


                                La table uom_uom qui est la table des unité ou je voudrais récupérer l'id de l'unité qui est ici l'unite UNITE

                                La table product_category qui est la table des catégorie ou je voudrais récupérer l'id de la catégorie qui est ici la catégorie 2.20.2.9

                                Faut-il plus de détail ou j'ai assez détaillé

                                Ce qui est   en gras c'est ce que j'ai répondu 







                                -
                                Edité par VictorLcmt 19 février 2020 à 9:29:34

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 février 2020 à 14:17:15

                                  VictorLcmt a écrit:

                                  La création de l'unité je l'ai fait en amont donc il me reste juste de récupérer l'id de l'unité qui à été crée et de mettre cette id à la place d'une chaîne de caractère, j’aimerais le faire avec un TRIGGER BEFORE INSERT

                                  Pourquoi ? Nous avons vu ensemble le TRIGGER pour le faire !

                                  Encore une fois c'est juste au-dessus : https://openclassrooms.com/forum/sujet/mettre-resultat-dune-requete-dan-un-fichier-texte?page=2#message-93647960

                                  VictorLcmt a écrit:

                                  La table uom_uom qui est la table des unité ou je voudrais récupérer l'id de l'unité qui est ici l'unite UNITE

                                  La table product_category qui est la table des catégorie ou je voudrais récupérer l'id de la catégorie qui est ici la catégorie 2.20.2.9

                                  Là encore, le même TRIGGER donné plus haut (cf. lien précédent) répond à cette question ... Il suffit juste de dupliquer la partie pour l'unité et de l'adapter pour la catégorie ...

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    19 février 2020 à 15:04:00

                                    Car je devais avancer, et je l'ai fait en amont

                                    J'ai tester ca 

                                    CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
                                    DECLARE v_unit_id INTEGER;
                                    BEGIN
                                        -- Recherche si unité existe
                                        SELECT INTO v_unit_id id
                                        FROM uom_uom
                                        WHERE name = NEW.unit_po_id,
                                           
                                        -- si existe pas
                                        IF v_unit_id IS NULL
                                            -- on crée une nouvelle unité
                                            INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ("id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date") 
                                            VALUES ( nextval('uom_uom_id_seq'),NEW.uom_id,NEW.uom_po_id);
                                            -- et on récupère son id
                                            v_unit_id := currval( 'uom_uom_id_seq' );
                                        END IF;
                                           
                                        -- on affecte id à NEW
                                        SET NEW.uom_id = v_unit_id;
                                        SET NEW.uom_po_id = v_unit_id;
                                           
                                        RETURN NULL;
                                    END;
                                    $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
                                    CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON product_template
                                    FOR EACH ROW
                                    EXECUTE PROCEDURE ajout_uinte_ou_pas();
                                    
                                     INSERT INTO "public"."product_template" ("id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn") 
                                    
                                        VALUES (nextval('product_template_id_seq'::regclass),'Tournevis',1,'product',FALSE,2.20.2.9,1.13,0,0.00,TRUE,TRUE,'UNITE','UNITE',2,TRUE,'AFF15RG',2,NOW(),2,NOW(),'manual','no-message','no','orde
                                    
                                    

                                    E ca me retounrne : 

                                    psql:/home/lifenum/lifenum/essai.sh:24: ERREUR:  « THEN » manquant à la fin de l'expression SQL

                                    LIGNE 13 : ...ALUES ( nextval('uom_uom_id_seq'),NEW.uom_id,NEW.uom_po_id);

                                                                                                             ^

                                    psql:/home/lifenum/lifenum/essai.sh:27: ERREUR:  la fonction ajout_uinte_ou_pas() n'existe pas

                                    psql:/home/lifenum/lifenum/essai.sh:32: ERREUR:  erreur de syntaxe sur ou près de « .2 »

                                    LIGNE 2 : ...6CM ROUGEAFFAITEAU NANTAIS',1,'product',FALSE,2.20.2.9,1.13,...

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 février 2020 à 15:21:26

                                      VictorLcmt a écrit:

                                      ERREUR:  « THEN » manquant à la fin de l'expression SQL

                                      Oui ... c'est une erreur de ma part, que tu pourrais avoir le courage de corriger par toi-même en recherchant un peu quelle est la syntaxe du bloc IF ... (indice IF ... THEN ... ELSE ... END IF;) ...

                                      VictorLcmt a écrit:

                                      Car je devais avancer, et je l'ai fait en amont

                                      Et du coup tu recules maintenant ... Je pense que ce n'est pas prudent d'alimenter en amont la table des unités et des catégories ... Je pense qu'il est plus judicieux de traiter cela dans ton TRIGGER BEFORE INSERT ON product_template.

                                      Pour reprendre. Je te conseille de :

                                      • partir de ton fichier XML qui construit ta requête SQL et ses INSERT INTO avec les valeurs contenues dans le XML
                                      • mettre en place seulement le TRIGGER BEFORE INSERT ON product_template . Ce trigger vérifiera si l'unité et la catégorie existe, si non il les crée et récupère l'id avec currval, si oui il récupère juste l'id

                                      Les grandes lignes de ce TRIGGER sont là, tu as toutes les billes pour y arriver, avec juste un peu de réflexion.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                        19 février 2020 à 15:34:44

                                        Oui c'est vrai je l'ai corriger est ce que vous penser que comme cela c'est bien

                                        CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
                                        DECLARE v_unit_id INTEGER;
                                        BEGIN
                                        	-- Recherche si unité existe
                                        	SELECT INTO v_unit_id id
                                        	FROM uom_uom
                                        	WHERE name = NEW.unit_po_id;
                                        		   
                                        	-- si existe pas
                                        	IF v_unit_id IS NULL THEN
                                        		-- on crée une nouvelle unité
                                        		INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ("id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date") 
                                        		VALUES ( nextval('uom_uom_id_seq'),NEW.uom_id,NEW.uom_po_id);
                                        		-- et on récupère son id
                                        		v_unit_id := currval( 'uom_uom_id_seq' );
                                        	ELSE;
                                        	END IF;
                                        		   
                                        	-- on affecte id à NEW
                                        	SET NEW.uom_id = v_unit_id;
                                        	SET NEW.uom_po_id = v_unit_id;
                                        		   
                                        	RETURN NULL;
                                        END;
                                        $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
                                        CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON product_template
                                        FOR EACH ROW
                                        EXECUTE PROCEDURE ajout_uinte_ou_pas();
                                        

                                        J'ai ajouter le then et le le else

                                        A l'ecution du script j'ai cette erreur :

                                        db_test-abitabio=> \i /home/lifenum/lifenum/essais.sh

                                        CREATE FUNCTION

                                        CREATE TRIGGER

                                        psql:/home/lifenum/lifenum/essais.sh:31: ERREUR:  syntaxe en entrée invalide pour l'entier : « UNITE »

                                        LIGNE 2 : ...ANTAIS',1,'product',FALSE,2,1.13,0,0.00,TRUE,TRUE,'UNITE','U...

                                                                                                       ^

                                        psql:/home/lifenum/lifenum/essais.sh:34: NOTICE:  DROP cascade sur trigger ajout_uinte_ou_pas sur table product_template

                                        DROP FUNCTION

                                        -
                                        Edité par VictorLcmt 19 février 2020 à 15:46:00

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 février 2020 à 16:13:28

                                          VictorLcmt a écrit:

                                          est ce que vous penser que comme cela c'est bien

                                          Oui, mais il faut également gérer la catégorie dans le TRIGGER, sur le même principe que l'unité ...

                                          VictorLcmt a écrit:

                                          J'ai ajouter le then et le le else

                                          Tu peux te passer du ELSE.

                                          VictorLcmt a écrit:

                                          ERREUR:  syntaxe en entrée invalide pour l'entier : « UNITE »

                                          Concernant cette erreur, ne comprend pas ... Apparemment une variable ou une colonne nommée UNITE demande un entier (integer) et reçoit autre chose ... Mais je ne vois pas où, en tout cas pas dans le code ci-dessus ...

                                          As-tu une variable ou une colonne nommé UNITE quelque part ?

                                          Et pourquoi passes-tu par un script shell (essais.sh) ?



                                          -
                                          Edité par Benzouye 19 février 2020 à 16:15:07

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            19 février 2020 à 16:22:16

                                            Dans mon champ qui s'appelle uom_id,  uom_po_id les valeurs dans mon fichier en entrée sont des VARCHAR qui après ce trigger doit passer à l'id de l’unité UNITÉ dans la table uom_uom 

                                            Je le fais dans un script pour une fois avoir créer ce que je voulais je supprimer le trigger c'est une demande de mon maître de stage

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 février 2020 à 17:12:35

                                              Ah oui ... On tourne vraiment en rond ! J'avais oublié ce point, mais :

                                              https://openclassrooms.com/forum/sujet/mettre-resultat-dune-requete-dan-un-fichier-texte#message-93646854

                                              Je te disais dans ce message déjà de passer par une procédure et non par un TRIGGER ...

                                              Donc je me répète, transforme ta boucle Python pour qu'elle génère plutôt ceci (au lieu des INSERT INTO) :

                                              CALL ma_procedure_insertion ('5g8hj','Tournevis','5,10',1,1);
                                              CALL ma_procedure_insertion ('6r9tl','Marteau','8,20',3,3);
                                              CALL ma_procedure_insertion ('5d6ft','peinture','50,10',2,2);
                                              CALL ma_procedure_insertion ('7ja3t','Vis 12*12,25','500,001',m,m);

                                              Et crée la procédure en question dans PostGreSQL à l'image du TRIGGER vu ensemble.

                                              Cette procédure va prendre en paramètre d'entrée tous les champs de ton INSERT INTO (y compris les VARCHAR).

                                              Elle va ensuite :

                                              • chercher l'id de l'unité ou la créer le cas échéant (cf. trigger existant)
                                              • chercher l'id de la catégorie ou la créer le cas échéant (de la même façon que c'est fait pour les unités)
                                              • exécuter INSERT INTO en utilisant cette fois directement les id nécessaires
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                19 février 2020 à 17:32:23

                                                Benzouye a écrit:

                                                Je te disais dans ce message déjà de passer par une procédure et non par un TRIGGER ...

                                                Donc je me répète, transforme ta boucle Python pour qu'elle génère plutôt ceci (au lieu des INSERT INTO) :

                                                CALL ma_procedure_insertion ('5g8hj','Tournevis','5,10',1,1);
                                                CALL ma_procedure_insertion ('6r9tl','Marteau','8,20',3,3);
                                                CALL ma_procedure_insertion ('5d6ft','peinture','50,10',2,2);
                                                CALL ma_procedure_insertion ('7ja3t','Vis 12*12,25','500,001',m,m);

                                                Et crée la procédure en question dans PostGreSQL à l'image du TRIGGER vu ensemble.

                                                Cette procédure va prendre en paramètre d'entrée tous les champs de ton INSERT INTO (y compris les VARCHAR).

                                                Elle va ensuite :

                                                • chercher l'id de l'unité ou la créer le cas échéant (cf. trigger existant)
                                                • chercher l'id de la catégorie ou la créer le cas échéant (de la même façon que c'est fait pour les unités)
                                                • exécuter INSERT INTO en utilisant cette fois directement les id nécessaires


                                                D'accord je vais est le call_ma_procedure c'est le nom que je vais donner à ma procédure c'est ca 

                                                Mais comment dire qe faire ca apres insertion 

                                                Est ce que vous pouvez me donnez l'exemple de la procédure à écrire pour les unités s'il vous plait mon stage se termine vendredi et il me reste ce dernier point à réaliser et j'aimerais bien le faire 

                                                -
                                                Edité par VictorLcmt 19 février 2020 à 17:33:56

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 février 2020 à 18:13:46

                                                  VictorLcmt a écrit:

                                                  D'accord je vais est le call_ma_procedure c'est le nom que je vais donner à ma procédure c'est ca

                                                  CALL c'est la commande SQL pour lancer une procédure, vient derrière le nom de la procédure.

                                                  Quand tu ne connais pas, cherche ... La doc : https://www.postgresql.org/docs/12/sql-createprocedure.html

                                                  Donc il faut faire un CREATE PROCEDURE qui va ressembler étrangement au TRIGGER vu ensemble, sauf qu'à la fin de cette procédure tu auras un INSERT INTO product_template ...

                                                  VictorLcmt a écrit:

                                                  Est ce que vous pouvez me donnez l'exemple de la procédure à écrire pour les unités s'il vous plait mon stage se termine vendredi et il me reste ce dernier point à réaliser et j'aimerais bien le faire 

                                                  Tu te rends compte que mon message sur les procédures date du 5 février ? Deux semaines à tourner en rond ...

                                                  • Regarde la documentation en lien pour avoir la syntaxe pour créer ta procédure.
                                                  • Crée la procédure (cf. ébauche de code ci-dessous) avec autant de paramètre d'entrée que de données provenant de ton XML
                                                  • Modifie ton code Pyhton pour qu'il fasse des CALL le_nom_de_ta_procedure au lieu de faire des INSERT INTO

                                                  Cela pourrait ressembler à ceci :

                                                  CREATE OR REPLACE PROCEDURE insertion_product_from_xml (
                                                  	p_id,
                                                  	p_name,
                                                  	p_sequence,
                                                  	p_type,
                                                  	p_rental,
                                                  	p_categ_id,
                                                  	p_list_price,
                                                  	p_volume,
                                                  	p_weight,
                                                  	p_sale_ok,
                                                  	p_purchase_ok,
                                                  	p_uom_id,
                                                  	p_uom_po_id,
                                                  	p_company_id,
                                                  	p_active,
                                                  	p_default_code,
                                                  	p_create_uid,
                                                  	p_create_date,
                                                  	p_write_uid,
                                                  	p_write_date,
                                                  	p_service_type,
                                                  	p_sale_line_warn,
                                                  	p_expense_policy,
                                                  	p_invoice_policy,
                                                  	p_responsible_id,
                                                  	p_sale_delay,
                                                  	p_tracking,
                                                  	p_purchase_method,
                                                  	p_purchase_line_warn
                                                  )
                                                  DECLARE v_unit_id INTEGER;
                                                  DECLARE v_categ_id INTEGER;
                                                  BEGIN
                                                  	-- Recherche si unité existe
                                                  	SELECT INTO v_unit_id id
                                                  	FROM uom_uom
                                                  	WHERE name = p_uom_id;
                                                  			
                                                  	-- si existe pas
                                                  	IF v_unit_id IS NULL THEN
                                                  		-- on crée une nouvelle unité
                                                  		INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ( "id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date" )
                                                  		VALUES ( nextval('uom_uom_id_seq'), p_uom_id, p_uom_po_id );
                                                  		-- et on récupère son id
                                                  		v_unit_id := currval( 'uom_uom_id_seq' );
                                                  	END IF;
                                                  	
                                                  	-- Recherche si catégorie existe
                                                  	SELECT INTO v_categ_id id
                                                  	FROM table_categorie
                                                  	WHERE name = p_categ_id;
                                                  			
                                                  	-- si existe pas
                                                  	IF v_categ_id IS NULL THEN
                                                  		-- on crée une nouvelle catégorie
                                                  		INSERT INTO uom_uom INSERT INTO "public".table_categorie (...)
                                                  		VALUES ( nextval('..._id_seq'), p_categ_id, ... );
                                                  		-- et on récupère son id
                                                  		v_categ_id := currval( '..._id_seq' );
                                                  	END IF;
                                                  	
                                                  	INSERT INTO "public"."product_template" ( "id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn")
                                                      VALUES (nextval('product_template_id_seq'), p_id, p_name, p_sequence, p_type, p_rental, v_categ_id, p_list_price, p_volume, p_weight, p_sale_ok, p_purchase_ok, v_unit_id, v_unit_id, p_company_id, p_active, p_default_code, p_create_uid, p_create_date, p_write_uid, p_write_date, p_service_type, p_sale_line_warn, p_expense_policy, p_invoice_policy, p_responsible_id, p_sale_delay, p_tracking, p_purchase_method, p_purchase_line_warn);
                                                  END;
                                                  • Il faut vérifier la liste des paramètres et leur donner un type cohérent (cf. doc.)
                                                  • Il faut ajuster les colonnes de l'insert de l'unité ligne 44
                                                  • Il faut ajuster le nom de la table catégorie ligne 51
                                                  • Il faut ajuster les colonnes et le nom de la séquence de cette table dans le INSERT INTO ligne 57, 58 et 60
                                                  • Il faut ajuster les colonnes du dernier INSERT de la table product_template

                                                  En gros j'ai tout fait, tu n'as fait guère d'effort en 15 jours, j'espère que j'aurais mon pseudo et commentaire dans ton code ...

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                    19 février 2020 à 18:53:47

                                                    Très bien merci, j'ai cherché ce que voulais dire call mais je n'étais pas sur de moi

                                                    J'ai plein d'erreur, la première est celle ci :

                                                    ERROR: syntax error at or near "DECLARE" LINE 32: DECLARE v_unit_id INTEGER;


                                                    Et je ne comprend pas



                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      20 février 2020 à 9:00:00

                                                      Encore et toujours la documentation : https://docs.postgresql.fr/8.1/plpgsql-declarations.html

                                                      C'est de ma faute encore, un seul declare ...

                                                      Au moins, as-tu compris ce que fait la procédure ?

                                                      CREATE OR REPLACE PROCEDURE insertion_product_from_xml (
                                                          p_id,
                                                          p_name,
                                                          p_sequence,
                                                          p_type,
                                                          p_rental,
                                                          p_categ_id,
                                                          p_list_price,
                                                          p_volume,
                                                          p_weight,
                                                          p_sale_ok,
                                                          p_purchase_ok,
                                                          p_uom_id,
                                                          p_uom_po_id,
                                                          p_company_id,
                                                          p_active,
                                                          p_default_code,
                                                          p_create_uid,
                                                          p_create_date,
                                                          p_write_uid,
                                                          p_write_date,
                                                          p_service_type,
                                                          p_sale_line_warn,
                                                          p_expense_policy,
                                                          p_invoice_policy,
                                                          p_responsible_id,
                                                          p_sale_delay,
                                                          p_tracking,
                                                          p_purchase_method,
                                                          p_purchase_line_warn
                                                      )
                                                      DECLARE
                                                      	v_unit_id INTEGER;
                                                      	v_categ_id INTEGER;
                                                      BEGIN
                                                          -- Recherche si unité existe
                                                          SELECT INTO v_unit_id id
                                                          FROM uom_uom
                                                          WHERE name = p_uom_id;
                                                                   
                                                          -- si existe pas
                                                          IF v_unit_id IS NULL THEN
                                                              -- on crée une nouvelle unité
                                                              INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ( "id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date" )
                                                              VALUES ( nextval('uom_uom_id_seq'), p_uom_id, p_uom_po_id );
                                                              -- et on récupère son id
                                                              v_unit_id := currval( 'uom_uom_id_seq' );
                                                          END IF;
                                                           
                                                          -- Recherche si catégorie existe
                                                          SELECT INTO v_categ_id id
                                                          FROM table_categorie
                                                          WHERE name = p_categ_id;
                                                                   
                                                          -- si existe pas
                                                          IF v_categ_id IS NULL THEN
                                                              -- on crée une nouvelle catégorie
                                                              INSERT INTO uom_uom INSERT INTO "public".table_categorie (...)
                                                              VALUES ( nextval('..._id_seq'), p_categ_id, ... );
                                                              -- et on récupère son id
                                                              v_categ_id := currval( '..._id_seq' );
                                                          END IF;
                                                           
                                                          INSERT INTO "public"."product_template" ( "id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn")
                                                          VALUES (nextval('product_template_id_seq'), p_id, p_name, p_sequence, p_type, p_rental, v_categ_id, p_list_price, p_volume, p_weight, p_sale_ok, p_purchase_ok, v_unit_id, v_unit_id, p_company_id, p_active, p_default_code, p_create_uid, p_create_date, p_write_uid, p_write_date, p_service_type, p_sale_line_warn, p_expense_policy, p_invoice_policy, p_responsible_id, p_sale_delay, p_tracking, p_purchase_method, p_purchase_line_warn);
                                                      END;



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                        20 février 2020 à 9:29:42

                                                        Oui j'ai compris ce que fais la procédure, mais j'ai encire des erreurs quand je rentre ca :

                                                        CREATE OR REPLACE PROCEDURE insertion_product_from_xml (
                                                            p_id,
                                                            p_name,
                                                            p_sequence,
                                                            p_type,
                                                            p_rental,
                                                            p_categ_id,
                                                            p_list_price,
                                                            p_volume,
                                                            p_weight,
                                                            p_sale_ok,
                                                            p_purchase_ok,
                                                            p_uom_id,
                                                            p_uom_po_id,
                                                            p_company_id,
                                                            p_active,
                                                            p_default_code,
                                                            p_create_uid,
                                                            p_create_date,
                                                            p_write_uid,
                                                            p_write_date,
                                                            p_service_type,
                                                            p_sale_line_warn,
                                                            p_expense_policy,
                                                            p_invoice_policy,
                                                            p_responsible_id,
                                                            p_sale_delay,
                                                            p_tracking,
                                                            p_purchase_method,
                                                            p_purchase_line_warn
                                                        )
                                                        DECLARE
                                                            v_unit_id INTEGER;
                                                            v_categ_id INTEGER;
                                                        BEGIN
                                                            -- Recherche si unité existe
                                                            SELECT INTO v_unit_id id
                                                            FROM uom_uom
                                                            WHERE name = p_uom_id;
                                                        
                                                            -- si existe pas
                                                            IF v_unit_id IS NULL THEN
                                                                -- on crée une nouvelle unité
                                                                INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ( "id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date" )
                                                                VALUES ( nextval('uom_uom_id_seq'), p_name,1,1,0.01,TRUE,'reference','unit',1,NOW(),1,NOW() );
                                                                -- et on récupère son id
                                                                v_unit_id := currval( 'uom_uom_id_seq' );
                                                            END IF;
                                                        
                                                            -- Recherche si catégorie existe
                                                            SELECT INTO v_categ_id id
                                                            FROM^product_category
                                                            WHERE name = p_categ_id;
                                                        
                                                            -- si existe pas
                                                            IF v_categ_id IS NULL THEN
                                                                -- on crée une nouvelle catégorie
                                                                INSERT INTO "public"."product_category" ("id","parent_path","name","complete_name","create_uid","create_date","write_uid","write_date")
                                                                VALUES ( nextval('product_category_id_seq'),p_patent_path,'Libelle à définir','Libelle à définir',40,NOW(),40,NOW())
                                                                -- et on récupère son id
                                                                v_categ_id := currval( 'product_category_id_seq' );
                                                            END IF;
                                                        
                                                            INSERT INTO "public"."product_template" ( "id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date",\
                                                        "write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn")
                                                            VALUES (nextval('product_template_id_seq'), p_id, p_name, p_sequence, p_type, p_rental, v_categ_id, p_list_price, p_volume, p_weight, p_sale_ok, p_purchase_ok, v_unit_id, v_unit_id, p_company_id, p_active, p_default_code, p_create_u\
                                                        id, p_create_date, p_write_uid, p_write_date, p_service_type, p_sale_line_warn, p_expense_policy, p_invoice_policy, p_responsible_id, p_sale_delay, p_tracking, p_purchase_method, p_purchase_line_warn);
                                                        END;
                                                        
                                                         CALL insertion_product_from_xml (nextval('product_template_id_seq'::regclass),'Marteau',1,'product',FALSE,2.20.2.9,1.13,0,0.00,TRUE,TRUE,'UNITE','UNITE',2,TRUE,'AFF15RG',2,NOW(),2,NOW(),'manua\
                                                        l','no-message','no','order',2,0,'none','receive','no-message');

                                                        Ca me met ces message d'erreurs :

                                                        psql:/home/lifenum/lifenum/procedure.sql:33: ERREUR:  erreur de syntaxe sur ou près de « DECLARE »

                                                        LIGNE 32 : DECLARE

                                                                   ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:34: ERREUR:  erreur de syntaxe sur ou près de « v_categ_id »

                                                        LIGNE 1 : v_categ_id INTEGER;

                                                                  ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:39: ERREUR:  erreur de syntaxe sur ou près de « SELECT »

                                                        LIGNE 3 :     SELECT INTO v_unit_id id

                                                                      ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:45: ERREUR:  erreur de syntaxe sur ou près de « IF »

                                                        LIGNE 1 : IF v_unit_id IS NULL THEN

                                                                  ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:47: ERREUR:  erreur de syntaxe sur ou près de « v_unit_id »

                                                        LIGNE 1 : v_unit_id := currval( 'uom_uom_id_seq' );

                                                                  ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:48: ERREUR:  erreur de syntaxe sur ou près de « IF »

                                                        LIGNE 1 : END IF;

                                                                      ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:53: ERREUR:  erreur de syntaxe sur ou près de « id »

                                                        LIGNE 1 : SELECT INTO v_categ_id id

                                                                                         ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:61: ERREUR:  erreur de syntaxe sur ou près de « IF »

                                                        LIGNE 1 : IF v_categ_id IS NULL THEN

                                                                  ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:62: ERREUR:  erreur de syntaxe sur ou près de « IF »

                                                        LIGNE 1 : END IF;

                                                                      ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:64: commande \ invalide

                                                        psql:/home/lifenum/lifenum/procedure.sql:66: commande \ invalide

                                                        psql:/home/lifenum/lifenum/procedure.sql:67: ERREUR:  erreur de syntaxe sur ou près de « id »

                                                        LIGNE 4 : id, p_create_date, p_write_uid, p_write_date, p_service_type...

                                                                  ^

                                                        psql:/home/lifenum/lifenum/procedure.sql:68: ATTENTION:  aucune transaction en cours

                                                        COMMIT

                                                        psql:/home/lifenum/lifenum/procedure.sql:71: ERREUR:  erreur de syntaxe sur ou près de « .2 »

                                                        LIGNE 1 : ...d_seq'::regclass),'Marteau',1,'product',FALSE,2.20.2.9,1.13,...

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          20 février 2020 à 11:29:15

                                                          Je ne suis pas trop à l'aise avec la syntaxe de PostGreSQL, mais je lis la documentation ...

                                                          D'ailleurs le lien donné plus haut https://www.postgresql.org/docs/12/sql-createprocedure.html te donne la réponse ... L'exemple donné dans la doc donne la structure d'une déclaration de procédure avec PostGreSQL, il manque en effet des choses dans ma proposition : LANGUGA, AS et le délimiteur $$ ...

                                                          https://www.postgresql.org/docs/12/sql-createprocedure.html#SQL-CREATEPROCEDURE-EXAMPLES

                                                          Donc c'est encore moi qui fais les recherches à ta place ... soit tu ne sais pas ce que tu fais, soit tu es fénéant ...

                                                          Je proposerais cette correction :

                                                          CREATE OR REPLACE PROCEDURE insertion_product_from_xml (
                                                          	p_id,
                                                          	p_name,
                                                          	p_sequence,
                                                          	p_type,
                                                          	p_rental,
                                                          	p_categ_id,
                                                          	p_list_price,
                                                          	p_volume,
                                                          	p_weight,
                                                          	p_sale_ok,
                                                          	p_purchase_ok,
                                                          	p_uom_id,
                                                          	p_uom_po_id,
                                                          	p_company_id,
                                                          	p_active,
                                                          	p_default_code,
                                                          	p_create_uid,
                                                          	p_create_date,
                                                          	p_write_uid,
                                                          	p_write_date,
                                                          	p_service_type,
                                                          	p_sale_line_warn,
                                                          	p_expense_policy,
                                                          	p_invoice_policy,
                                                          	p_responsible_id,
                                                          	p_sale_delay,
                                                          	p_tracking,
                                                          	p_purchase_method,
                                                          	p_purchase_line_warn
                                                          )
                                                          LANGUAGE SQL
                                                          AS $$
                                                          DECLARE
                                                          	v_unit_id INTEGER;
                                                          	v_categ_id INTEGER;
                                                          BEGIN
                                                          	-- Recherche si unité existe
                                                          	SELECT INTO v_unit_id id
                                                          	FROM uom_uom
                                                          	WHERE name = p_uom_id;
                                                           
                                                          	-- si existe pas
                                                          	IF v_unit_id IS NULL THEN
                                                          		-- on crée une nouvelle unité
                                                          		INSERT INTO uom_uom INSERT INTO "public"."uom_uom" ( "id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date" )
                                                          		VALUES ( nextval('uom_uom_id_seq'), p_name,1,1,0.01,TRUE,'reference','unit',1,NOW(),1,NOW() );
                                                          		-- et on récupère son id
                                                          		v_unit_id := currval( 'uom_uom_id_seq' );
                                                          	END IF;
                                                           
                                                          	-- Recherche si catégorie existe
                                                          	SELECT INTO v_categ_id id
                                                          	FROM^product_category
                                                          	WHERE name = p_categ_id;
                                                           
                                                          	-- si existe pas
                                                          	IF v_categ_id IS NULL THEN
                                                          		-- on crée une nouvelle catégorie
                                                          		INSERT INTO "public"."product_category" ("id","parent_path","name","complete_name","create_uid","create_date","write_uid","write_date")
                                                          		VALUES ( nextval('product_category_id_seq'),p_patent_path,'Libelle à définir','Libelle à définir',40,NOW(),40,NOW())
                                                          		-- et on récupère son id
                                                          		v_categ_id := currval( 'product_category_id_seq' );
                                                          	END IF;
                                                           
                                                          	INSERT INTO "public"."product_template" ( "id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date",\
                                                          "write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn")
                                                          	VALUES (nextval('product_template_id_seq'), p_id, p_name, p_sequence, p_type, p_rental, v_categ_id, p_list_price, p_volume, p_weight, p_sale_ok, p_purchase_ok, v_unit_id, v_unit_id, p_company_id, p_active, p_default_code, p_create_u\
                                                          id, p_create_date, p_write_uid, p_write_date, p_service_type, p_sale_line_warn, p_expense_policy, p_invoice_policy, p_responsible_id, p_sale_delay, p_tracking, p_purchase_method, p_purchase_line_warn);
                                                          END;
                                                           
                                                           	CALL insertion_product_from_xml (nextval('product_template_id_seq'::regclass),'Marteau',1,'product',FALSE,2.20.2.9,1.13,0,0.00,TRUE,TRUE,'UNITE','UNITE',2,TRUE,'AFF15RG',2,NOW(),2,NOW(),'manua\
                                                          l','no-message','no','order',2,0,'none','receive','no-message');
                                                          $$;

                                                          -
                                                          Edité par Benzouye 20 février 2020 à 11:30:24

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                            20 février 2020 à 19:49:37

                                                            A l'exécution de la procédure suivante :

                                                            CREATE OR REPLACE PROCEDURE insertion_product_from_xml (
                                                                p_name character varying,
                                                                p_sequence integer,
                                                                p_type character varying,
                                                                p_rental boolean,
                                                                p_categ_id character varying,
                                                                p_list_price numeric,
                                                                p_volume double precision,
                                                                p_weight numeric,
                                                                p_sale_ok boolean,
                                                                p_purchase_ok boolean,
                                                                p_uom_id character varying,
                                                                p_uom_po_id character varying,
                                                                p_company_id integer,
                                                                p_active boolean,
                                                                p_default_code character varying,
                                                                p_create_uid integer,
                                                                p_write_uid integer,
                                                                p_service_type character varying,
                                                                p_sale_line_warn character varying,
                                                                p_expense_policy character varying,
                                                                p_invoice_policy character varying,
                                                                p_responsible_id integer,
                                                                p_sale_delay double precision,
                                                                p_tracking character varying,
                                                                p_purchase_method character varying,
                                                                p_purchase_line_warn character varying
                                                            )
                                                            LANGUAGE PLPGSQL
                                                            AS $$
                                                            DECLARE
                                                             v_unit_id INTEGER;
                                                                v_categ_id INTEGER;
                                                            BEGIN
                                                                -- Recherche si unité existe
                                                                SELECT INTO v_unit_id id
                                                                FROM uom_uom
                                                                WHERE name = p_uom_id;
                                                                
                                                                -- si existe pas
                                                                IF v_unit_id IS NULL THEN
                                                                    -- on crée une nouvelle unité
                                                                    INSERT INTO "public"."uom_uom" ( "id","name","category_id","factor","rounding","active","uom_type","measure_type","create_uid","create_date","write_uid","write_date" )
                                                                    VALUES ( nextval('uom_uom_id_seq'), p_uom_id,1,1,0.01,TRUE,'reference','unit',1,NOW(),1,NOW() );
                                                                    -- et on récupère son id
                                                                    v_unit_id := currval( 'uom_uom_id_seq' );
                                                                END IF;
                                                                
                                                                -- Recherche si catégorie existe
                                                                SELECT INTO v_categ_id id
                                                                FROM product_category
                                                                WHERE name = p_categ_id;
                                                                
                                                                -- si existe pas
                                                                IF v_categ_id IS NULL THEN
                                                                    -- on crée une nouvelle catégorie
                                                                    INSERT INTO "public"."product_category" ("id","parent_path","name","complete_name","create_uid","create_date","write_uid","write_date")
                                                                    VALUES ( nextval('product_category_id_seq'),p_categ_id,'Libelle à définir','Libelle à définir',2,NOW(),2,NOW());
                                                                    -- et on récupère son id
                                                                    v_categ_id := currval( 'product_category_id_seq' );
                                                                END IF;
                                                                
                                                                INSERT INTO "public"."product_template" ( "id","name","sequence","type","rental","categ_id","list_price","volume","weight","sale_ok","purchase_ok","uom_id","uom_po_id","company_id","active","default_code","create_uid","create_date","write_uid","write_date","service_type","sale_line_warn","expense_policy","invoice_policy","responsible_id","sale_delay","tracking","purchase_method","purchase_line_warn")
                                                                VALUES (nextval('product_template_id_seq'), p_name, p_sequence, p_type, p_rental, v_categ_id, p_list_price, p_volume, p_weight, p_sale_ok, p_purchase_ok, v_unit_id, v_unit_id, p_company_id, p_active, p_default_code, p_create_uid, NOW(), p_write_uid, NOW(), p_service_type, p_sale_line_warn, p_expense_policy, p_invoice_policy, p_responsible_id, p_sale_delay, p_tracking, p_purchase_method, p_purchase_line_warn);
                                                            
                                                            
                                                                INSERT INTO product_product ("default_code","active","product_tmpl_id","volume","weight","create_uid","create_date","write_uid","write_date")
                                                                VALUES (p_default_code,p_active,currval( 'product_template_id_seq' ),p_volume,p_weight,p_create_uid, NOW(), p_write_uid, NOW());
                                                            
                                                                 INSERT INTO ir_attachment (name,res_name,res_model,res_model_name,res_field,res_id,company_id,type,store_fname,file_size,checksum,mimetype,index_content,active,create_uid,create_date,write_uid,write_date)
                                                                VALUES ('image_medium','[p_default_code ] p_name','product.template','Modèle d''article','image_medium',currval( 'product_template_id_seq' ),1,'binary','87/87a18769527837c4ace79b3337636eb1f61d85f9',12109,'7a18769527837c4ace79b3337636eb1f61d85
                                                            f9','image/png','image',TRUE,1,NOW(),1,NOW());
                                                            
                                                                INSERT INTO ir_attachment (name,res_name,res_model,res_model_name,res_field,res_id,company_id,type,store_fname,file_size,checksum,mimetype,index_content,active,create_uid,create_date,write_uid,write_date)
                                                                VALUES('image_small','[p_default_code ] p_name','product.template','Modèle d''article','image_small',currval( 'product_template_id_seq' ),1,'binary','e7/e7306de1a6766d3ca6c698db595edd7f099497f9',3545,'e7306de1a6766d3ca6c698db595edd7f099497f9'
                                                            ,'image/png','image',TRUE,1,NOW(),1,NOW());
                                                            
                                                                INSERT INTO ir_attachment (name,res_name,res_model,res_model_name,res_field,res_id,company_id,type,store_fname,file_size,checksum,mimetype,index_content,active,create_uid,create_date,write_uid,write_date)
                                                                VALUES('image','[p_default_code ] p_name','product.template','Modèle d''article','image',currval( 'product_template_id_seq' ),1,'binary','6b/6bec80842f1621b05f3f64c766151f359c978bcd',204268,'6bec80842f1621b05f3f64c766151f359c978bcd','image/png','image',TRUE,1,NOW(),1,NOW());
                                                                
                                                            END;
                                                            $$;
                                                            
                                                            CALL insertion_product_from_xml ('Test 2',1,'product',FALSE,'2.20.5.9',16.95,0,0.00,TRUE,TRUE,'UN','UN',1,TRUE,'TE02ST',2,2,'manual','no-message','no','order',2,0,'none','receive','no-message');
                                                            
                                                            DROP PROCEDURE insertion_product_from_xml CASCADE;
                                                            



                                                            Ca me recrée la catégorie alors qu'elle existe déjà

                                                            J'avis un problème sur la création d'unité mais j'ai réussi à la réglé, de par moi même, j'i juste le problème de la catégorie, et ca fait pour une catégorie déjà crée un catégorie crée, a chaque nouvelle insertion la catégorie se recrée

                                                            Le terme libelle à definir, je l'ai mis comme cela pour l'instant car ce n'est pas a moi de le gérer, pour l'instant

                                                            -
                                                            Edité par VictorLcmt 27 février 2020 à 12:08:01

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              20 février 2020 à 20:58:47

                                                              LANGUAGE PLPGSQL

                                                              Et attention tu as un accent circonflexe ligne 54.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                                                              Mettre résultat d'une requête dan un fichier texte

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown