Message posté par : Kiecane
----------------------------------------
Bonjour,
Je vous ai mis en pièce jointe la partie de mon MCD qui est utile pour répondre à ma
question. Pour faciliter sa compréhension, j'ai coloré en bleu les entités
correspondant aux protocoles qui sont mis en place pour trouver les individus des espèces
d'intérêt (ce sont les 4 espèces A, B, C et D apparentées). Les entités en jaune
correspondent quant à elles aux entités en lien avec les entités bleues (num_espece est
aussi en lien avec individu coloré en rose). J'ai mis le reste en orange. Enfin,
l'entité rose correspond à l'entité "centrale" où sont répertoriées tous
les individus rencontrés avec les différents protocoles et leurs caractéristiques.
-----------------
Citation :
ça ne peut pas fonctionner ici car vous recherchez une ligne qui n'existe pas encore
dans la base car elle est nouvelle (NEW).
-----------------
Ok, merci, du coup j'imagine qu'il faut utiliser le NEW à un autre endroit que
dans le SELECT pour que cela fonctionne ? Dans quelle partie de ma fonction faudrait-il
que je le place dans ce cas svp ?
-----------------
Citation :
- pour l'espèce il va falloir écrire une requête qui va récupérer cette information
- AAAA : c'est l'année en cours ?, il va y avoir une reprise des données des
années précédentes ?
- n° : il va falloir se baser sur des séquences
Dans un premier temps il faut vous attarder sur la récupération des 3eres lettres du
libelle de l'espèce de la table num_espece. IL faut écrire une requête qui stocke
l'info dans une nouvelle variable de votre fonction
-----------------
- espece : du coup, il faut que je récupère l'information de la clé étrangère
fk_num_espece pour chaque protocole lorsqu'il y a capture d'une espèce
d'intérêt. Autrement dit, il faut que je récupère fk_num_espece quand fk_num_espece =
A ou B ou C ou D
- AAAA : c'est l'année de capture de l'animal (il y a des années très
anciennes), autrement dit, il y aura bien une reprise des données des années précédentes,
ces dernières étant stockées dans cette base de données
- n° : je n'ai jamais fait ça, pourriez-vous m'indiquer la démarche à suivre svp ?
J'ai vu sur internet qu'il existait CREATE SEQUENCE, est-ce que c'est ça dont
vous parlez ? Sinon, je me demande si je ne pourrais pas utiliser les dates : pour une
année x, pour une espèce d'intérêt donnée, si le jour/mois_1 est inférieur au
jour/mois_2 alors on attribue un numéro inférieur pour le jour/mois_1 ??? Et du coup on
pourrait utiliser cette méthode pour les vieilles données à incorporer dans la base, et
pour les nouvelles données, on incrémenterait automatiquement le bon numéro de manière
semblable ?
CREATE FUNCTION creation_identifiant() RETURNS TRIGGER AS $BODY$
DECLARE
prem_espece VARCHAR(3) ;
annee VARCHAR(4) ;
numero INTEGER ;
BEGIN
SELECT substr(num_espece.libelle, 1, 3) INTO prem_espece, substr(individu.date_ind, 7, 4)
INTO annee, ? INTO numero
FROM num_espece, individu ;
IF num_espece.libelle==A OR num_espece.libelle==B OR num_espece.libelle==C OR
num_espece.libelle== D
THEN concat(espece, annee, numero) AS id_espece_interet ;
END IF ;
RETURN concat(espece, annee, numero) AS id_espece_interet ;
END ;
$BODY$
LANGUAGE 'plpgsql'
Et après j'ai un nouveau soucis : il faudrait créer un déclencheur associé à cette
fonction tout le temps (autrement dit pas de déclencheur....) ou alors modifier les
données que je mets dans la base de données puis créer cette fonction et l'associer à
:
CREATE TRIGGER creation_identifiant AFTER INSERT OR UPDATE ON (capture_piege_type1 OR
capture_piege_type2 OR donnees_observations OR individu)
FOR EACH ROW EXECUTE PROCEDURE creation_identifiant();
J'ai mis en italiques car à mon avis ça ne va pas.....
Et pour le ? plus haut dans le SELECT de la fonction, c'est le problème de séquence
qui m'embête : je crois avoir trouvé comment faire pour avoir la date la plus récente
:
SELECT *
FROM individu,
(SELECT pk_individu, max(date_ind) AS max_date
FROM individu
GROUP BY rien
) individu_max
WHERE (individu.fk_espece= individu_max.fk_espece AND individu.substr(individu.date_ind,
7, 4) = individu_max.substr(individu.date_ind, 7, 4 AND
individu.date_ind=individu_max.max_date)
mais ensuite il faudrait utiliser CREATE SEQUENCE pour que la valeur la plus récente
présente le numéro le plus élevé de séquence, et aussi créer une boucle pour comparer les
valeurs une à une. Pour créer une boucle, j'ai vu qu'il existait :
LOOP <instruction>
CONTINUE WHEN <prédicat> ;
END LOOP
mais je ne vois pas comment compiler tout ça ensemble......
Excusez-moi pour toute cette longueur, mais je voulais vous montrer toutes les recherches
que j'ai faites pour essayer de m'en sortir par moi-même (même si je suis
clairement loin d'avoir réussi...).
Merci pour votre aide:)
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=352860#p352860
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net