Vous n'êtes pas identifié(e).
Pages : 1
Bonjour @ tous,
je n'ai pas trouvé la réponse à ma question dans les sujets existant, je me penche donc vers vous.
Voici le problème :
J'utilise l'extension postgis. J'essaie de mettre en place un trigger, qui :
1- J'ai une succession de troncons sur une route avec un ID/troncon (TABLE 2)
2- Je dessine une ligne à cheval sur 2/3/3/4... troncons (TABLE 1)
3- Le trigger entre en jeu, et récupére l'ID des 2/3/4... troncons et je l'intègre dans un champ idtroncon1/idtroncon2/idtroncon3/idtroncon4... (TABLE 1)
Voici mon trigger actuel :
CREATE OR REPLACE FUNCTION touches_test()
RETURNS trigger AS
$BODY$
DECLARE troncon record;
BEGIN
SELECT DISTINCT materiau_cana INTO troncon FROM test_sdf WHERE ST_Overlaps (NEW.wkb_geometry1,test_sdf.wkb_geometry)=TRUE;
NEW.modif=troncon; ----Et là, la question qui, tue, comment je récupère ce qui se trouve dans mon record???
NEW.modif2=troncon;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
ALTER FUNCTION touches_test() OWNER TO postgres;
Au cas ou vous auriez loupé la question caché dans le code :
Et là, la question qui, tue, comment je récupère ce qui se trouve dans mon record???
Merci d'avance!
Geo-x
Hors ligne
Bonjour.
Vous pouvez utiliser troncon.nom_champ pour accéder aux différents champs du record.
Mais si la requête renvoie plus d'un enregistrement ça devrait poser soucis.
Julien.
https://rjuju.github.io/
Hors ligne
Et oui peut être faut-il que je mette en place un count suivit d'un LOOP?
Hors ligne
Cela dépend de ce que vous voulez faire, gérer spécifiquement chacune des lignes ou gérer le fait qu'il y ai au moins une ligne trouvée ?
Un record ne contient par définition qu'un seul enregistrement. Il faut utiliser un curseur pour pouvoir gérer un ensemble d'enregistrement.
Julien.
https://rjuju.github.io/
Hors ligne
Chaque ID de troncon doit être séparé pour pouvoir les traiter derrière. Je n'ai jamais utilisé de curseur dans un trigger je vais regarder comment faire et je reviens pour vous tenir au courant.
Hors ligne
essayons de comprendre le sujet...
1- J'ai une succession de troncons sur une route avec un ID/troncon (table 2)
//donc cette table 2 contient des troncons avec un id ok.
la notion de route on s'en moque semble t il ( simple regroupement de troncon successif)
2- Je dessine une ligne à cheval sur 2/3/3/4... troncons (TABLE 1)
alors... tu dessine un ligne dans la table 1 et cette ligne couperait X troncon....
si c'est ca alors tu dessinerais une ligne en zig-zag et cette ligne couperait ici 1 foi le T2, deux fois le T3, une foi le T4 etc...
bizard mais continuons
3- Le trigger entre en jeu, et récupére l'ID des 2/3/4... troncons et je l'intègre dans un champ idtroncon1/idtroncon2/idtroncon3/idtroncon4...
je dirais plutot que : la ligne coupe tes troncons, tu chercherais donc a recuperer les valeurs des 4 intersections (ce que ne fait pas ton trigger...),
tu peux grouper et compter puisqu'il y a deux foi le troncon n°3 qui est intersecté, tu recupere dans ton example les 3 lignes suivantes
id_dessin : id_troncon : nbdechevauchement
ligne dessiné : coupe t2 : 1 foi
ligne dessiné : coupe t3 : 2 foi
ligne dessiné : coupe t4 : 1 foi
donc ton resultat est a stocker dans une table de relation entre table1 et table 2, cette table contient 2 colonnes qui forment une PK_double (id_dessin+ id_troncon), chacun etant une FK de table 1 et table 2. quant au champ nbdechevauchement, libre a toi de le mettre ou pas.
donc tu obtiens 4 lignes suite a l'intersection ( disons 3 lignes si y'a un group by sur tronçon)
donc ton trigger doit boucler sur ces 3 lignes pour les inserer dans la table de relation :
---------------------
DECLARE meschevauchement RECORD;
FOR meschevauchement IN
SELECT blabla bla WHERE ST_intersect (NEW.wkb_geometry1, test_sdf.wkb_geometry) group by blabla...
LOOP
insert into table_de_realtion values (id_dessin, id_troncon, nbchevauchement)
ou alors c'est EXECUTE 'INSERT INTO ' je sais plus..........
END LOOP;
etc.....
va voir le loop ici par exemple :
http://www.postgresql.org/docs/8.3/inte … URES-LOOPS
bye,
Julien
------------
Hors ligne
Merci Julien pour la réponse,
Le besoin a finalement été modifié, je n'utiliserais donc pas forcément cet code là (cette fois-ci).
Pour info finalement on m'a demande de concaténer l’ensemble des résultat dans un seul champ texte ça donne quelque chose du genre :
SELECT array_to_string(array_agg(id_troncon),' / ') AS id_troncon,COUNT(*) AS nb_id_troncon INTO variable FROM
(SELECT id_troncon FROM diag_route WHERE ST_Overlaps (NEW.wkb_geometry,diag_route.wkb_geometry)=TRUE OR ST_Contains (NEW.wkb_geometry,diag_route.wkb_geometry)=TRUE);
NEW.troncon_trav=variable.id_troncon;
NEW.nb_troncon_trav=variable.nb_id_troncon;
A bientôt et merci pour votre aide!
Hors ligne
@geoetl
Finalement tout le code que vous m'avez donné lors de votre dernier post a finit par me servir sur une toutes autre base et je vous en remercie.
Pour information, il ne faut pas faire EXECUTE avant un insert into dans ce cas là ;-)
Encore merci.
Geo-x
Hors ligne
Pages : 1