Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Homme Profil pro
    chargé d'études
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 50
    Points
    50

    Par défaut Trigger sur 3 tables et une couche externe

    Bonjour,
    je vous expose mon pb :
    Au départ j’ai 3 tables dans une bdd : commune, bâtiment et référence cadastrale (un bâtiment est bâti sur des parcelles cadastrées d'une commune et les bâtiments construits "à cheval" sur plusieurs communes ne sont pas considérés).
    -la table commune contient : PKcom, insee
    -la table cadastre contient : PKref_cadas, Fkbat, section, parcelle
    -la table bâtiment contient : PKbat, FKcom
    et puis j'ai une couche géométrique contenant (presque) toutes les parcelles cadastrées (une parcelle est identifiée par le code commune et la référence cadastrale).

    Pour l’heure, j'arrive à identifier une référence cadastrale donné.
    dans la bdd :
    select UPPER(concat_ws('-',insee, section, parcelle))
    from public.ref_cadas natural join public.bien natural join public.commune
    where bien.pk_bien = ref_cadas.pk_bien and bien.pk_com = commune.pk_com
    dans la couche géoréféncée:
    select (concat_ws ('-', substring (geo_parcelle,5,2)|| substring (geo_parcelle,8,3), substring (geo_parcelle,14,2), substring (geo_parcelle,16,4)))
    from public.geo_parcelle_dist
    Comment pourrais-je procéder pour que le trigger trouve la ou les références cadastrales du nouveau bien et les compare à la liste des ref cadastrales de la couche géométrique et récupère la ou les geométries dans la table ref_cadas*?

    Merci d'avance pour votre aide

  2. #2
    Membre confirmé
    Inscrit en
    mai 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 142
    Points : 575
    Points
    575

    Par défaut

    Si j'ai bien compris tu as une table batiment qui a des nouveaux biens, tu n'indique pas, la table ne contient que les nouveaux batiments ou tu as un champ qui t'indique si c'est nouveau ?
    mais du coup tu dois partir de cette table là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Pkbat, Fkcom, Fkcadas FROM table_batiment as B WHERE condition_nouveau_bat;
    ensuite tu rajoutes les liens pour avoir les données des tables commune et cadastre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT B.Pkbat, B.Fkcom, B.Fkcadas, Com.champs_dont_tu_as_besoin, Cad.champs_dont_tu_as_besoin 
    FROM table_batiment as B 
    INNER JOIN table_commune as Com ON B.FKCom=Com.PKCom
    INNER JOIN table_cadastre as Cad ON B.FKCadas=Cad.PKref_cadas
    WHERE condition_nouveau_bat;
    enfin tu lies avec la requete dans ta base geo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT B.Pkbat, B.Fkcom, B.Fkcadas, Com.champs_dont_tu_as_besoin, Cad.champs_dont_tu_as_besoin 
    FROM table_batiment as B 
    INNER JOIN table_commune as Com ON B.FKCom=Com.PKCom
    INNER JOIN table_cadastre as Cad ON B.FKCadas=Cad.PKref_cadas
    WHERE (condition_nouveau_bat)
    AND UPPER(concat_ws('-',Com.insee, Cad.section, Cad.parcelle)) IN 
        (select (concat_ws ('-', substring (geo_parcelle,5,2)|| substring (geo_parcelle,8,3), substring (geo_parcelle,14,2), substring (geo_parcelle,16,4)))
    from trigger2.geo_parcelle_majic2018_dist  );
    Si j'ai compris à l'envers et que c'est dans la table geo qu'il y a les données dont tu as besoin, tu fait l'inverse, c'est à dire que tu integres la requete sur les tables batiment,commune,cadastre dans une condition avec le IN de ta requete sur la table geo.

  3. #3
    Membre du Club
    Homme Profil pro
    chargé d'études
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 50
    Points
    50

    Par défaut

    bonjour,
    merci virginieh mais j'ai du mal....

    je cherche effectivement à récupérer et à copier la géométrie dans la table cadastre à partir d'un test d'égalité sur un code composé du code insee, de la section et de la parcelle.
    pour l'heure cela ne fonctionne pas du tout et même si cela fonctionnait j'ai le sentiment que le trigger rechercherait passerait en revue toutes les lignes
    (sur ce dernier point : comment puis-je faire fonctionner le trigger uniquement pour la ou les références cadastrales de chaque "nouveaux bâtiments")

    je rappelle que :
    -la table commune contient : PKcom, insee
    -la table cadastre contient : PKcadastre, Fkbat, section, parcelle
    -la table bâtiment contient : PKbat, FKcom
    (la clé primaire PKbat de la table bâtiment est clé étrangère dans la table cadastre car un bâtiment peut être concerné par plusieurs parcelles).
    - la couche géométrique contient (presque) toutes les géométries des parcelles cadastrées (une parcelle est identifiée par le code commune et la référence cadastrale).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE OR REPLACE FUNCTION public.maj_cadastre()
    RETURNS trigger AS
    $BODY$
    BEGIN
    ---je sélectionne la geométrie dans la couche geométrie
     
    SELECT geom FROM public.geo_parcelle_dist
     
    ---quand le test d'= est réussi
    WHERE (SELECT (concat_ws ('-', substring (geo_parcelle,5,2)||
    substring (geo_parcelle,8,3), substring (geo_parcelle,14,2), substring (geo_parcelle,16,4)))
    from public.geo_parcelle_majic2018_dist) IN
     
    (SELECT UPPER(concat_ws('-',commune.insee, cadastre.section, cadastre.parcelle))
    FROM public.batiment as B INNER JOIN public.commune as C ON B.pk_com= C.pk_com
    AND INNER JOIN public.cadastre as R ON B.pk_bat= R.pk_bat)
     
    ---je place la géométrie dans la couche cadastre
    INTO cadastre.zzz_geom;
    RETURN NEW;
    END;
    $BODY$
    LANGUAGE plpgsql;
     
    CREATE TRIGGER maj_cadastre()
    BEFORE INSERT
    ON public.cadastre
    FOR EACH ROW
    EXECUTE PROCEDURE maj_cadastre();

  4. #4
    Membre du Club
    Homme Profil pro
    chargé d'études
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 50
    Points
    50

    Par défaut

    bonjour, avec une aide extérieure voici la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    create or replace function trigger2.maj_refcadas()
    returns trigger as
    $body$
    declare
    insee character varying(5);
    begin
        select co.insee into insee 
    	from trigger2.ref_cadas as rf 
    		inner join trigger2.bien as bi on rf.pk_bien = bi.pk_bien 
    		inner join trigger2.commune as co on co.pk_com = bi.pk_com 
    	where bi.pk_bien = new.pk_bien;
     
          update trigger2.ref_cadas as foo set zzz_geom = geom.geom from (
            select geom
            from trigger2.geo_parcelle_majic2018_dist
            where geo_parcelle = concat('2017', substr(insee, 1, 2), '0', substr(insee, 3, 3), '000', new.section, new.parcelle)
        ) as geom
        where foo.pk_ref = new.pk_ref;
        return new;
    end;
    $body$
    language plpgsql;
     
    trigger
    create trigger maj_refcadas
    after insert
    on trigger2.ref_cadas
    for each row
    execute procedure trigger2.maj_refcadas();

  5. #5
    Membre du Club
    Homme Profil pro
    chargé d'études
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 50
    Points
    50

    Par défaut

    bonjour,

    mon trigger (cf post précédent) fonctionne.

    il permet pour un nouveau bien donné , d'ajouter dans la table ref_cadas, une ou plusieurs géométries (récupérées dans une couche géo-référencée) correspondantes aux nouvelles clés obtenues à partir de 3 tables mises en relation.

    mais...si à l'issue de la "saisie" d'un n-uplet dans mes 3 tables, une erreur de saisie apparait (erreur de section ou de parcelle), je peux faire la correction dans les tables sans que cette correction n'engendre pas d'actualisation de ou des géométrie(s) correspondante(s).

    je suis preneur d'une piste ... (ps./ je n'ai rien trouvé de ressemblant ).

Discussions similaires

  1. trigger sur plusieurs champs d'une table
    Par PxPar dans le forum PL/SQL
    Réponses: 1
    Dernier message: 27/08/2009, 15h31
  2. trigger sur la création d'une table
    Par kimcharlene dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/04/2008, 17h08
  3. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52
  4. créer TRIGGER sur 1 table avec liaison sur 2 autre table
    Par shaka84 dans le forum Développement
    Réponses: 2
    Dernier message: 11/04/2006, 11h10
  5. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo