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();
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
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();
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
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
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
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.
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
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 !
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 ...
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,...
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.
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();
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) ?
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
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
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 ...
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;
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 »
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 $$ ...
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');
$$;
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
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.