banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoDataDays 2025

#1 Thu 30 September 2021 09:20

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

Je vous contacte car j'ai récemment découvert les trigger qui me permettent notamment de calculer automatiquement des surfaces lors de l'actualisation de mes couches géopackage.

Seulement j'ai constaté un problème d'interprétation des opérateurs "supérieur à" (>) et "inférieur à" (<) lorsque j'essaie de créer un trigger. En effet, ces caractères semblent être interprétés comme des marqueurs de balise type html (<a href:link>text</a>), donc le trigger qui en résulte est complètement faux et a même tendance à faire planter QGIS car il tente d'appliquer un trigger invraisemblable.

Pour info, l'idée est de calculer un nombre de logement pour chaque parcelle. J'ai une surface en Ha et une densité en logements/Ha. Le calcul est simple :

Code:

SURF_HA * DENSITE.

Seulement, il peut arriver que le résultat de ce calcul soit inférieur à 0.5, donc l'arrondi indiquera 0, ce qui m'ennuie. Je voulais donc arrondir à l'entier supérieur ces valeurs inférieures à 0.5 (j'ai cru voir que la fonction ceil() ne fonctionnait pas non plus dans les trigger) par une formule de ce type :

Code:

CASE WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_HA" * "DENSITE") < 1))
THEN round((new."SURF_HA" * "DENSITE")+0.5, 0)
WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_HA" * "DENSITE") >= 1))
THEN round((new."SURF_HA" * "DENSITE"), 0) 
ELSE 0
END

Comment puis-je contourner ce problème ? Est-ce possible d'échapper les caractères < et > ? Est-ce qu'une fonction existe qui pourrait remplacer ces caractères ?

D'avance merci pour vos réponses.

Hors ligne

 

#2 Thu 30 September 2021 10:26

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 4119

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,
On est bien dans QGIS? Où saisissez-vous cette formule: dans les expressions ou DB Manager? parce que la syntaxe de votre code ne répond pas aux logiques ni de l'une ni de l'autre: new.surf_ha n'est pas une expression et si SQL pure, il manquerait les from.

Hors ligne

 

#3 Thu 30 September 2021 11:01

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

On est bien dans QGIS, dans la "fenêtre SQL" du DB Manager. Effectivement, ce code n'est pas complet, il s'agit d'une petite partie du code SQL suivant :

Code:

CREATE TRIGGER trigger_surface_logements
AFTER UPDATE
ON 'parcelles'
FOR EACH ROW
BEGIN UPDATE 'parcelles'
SET SURF_HA = st_area(new.geom) / 10000,
NB_LGTS = (
    CASE WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_HA" * "DENSITE") < 1))
    THEN round((new."SURF_HA" * "DENSITE")+0.5, 0)
    WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_HA" * "DENSITE") >= 1))
    THEN round((new."SURF_HA" * "DENSITE"), 0) 
    ELSE 0
    END)
WHERE fid = new.fid;
END

Je suis surpris que les opérateurs < et > soient mal reconnus car en SQL ce sont bien des opérateurs courants et non des balises, et il en est de même dans les requêtes sous QGIS, mais peut-être ai-je loupé une étape.
En tous cas, les autres opérateurs fonctionnent : AND, OR, NOT, LIKE, =, +, -, *, /

En tous cas merci pour votre retour !

Hors ligne

 

#4 Thu 30 September 2021 12:30

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 576
Site web

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

Il faut mettre le code dans une fonction et exécuter cette fonction depuis le trigger.
Relisez la doc https://www.postgresql.org/docs/9.1/sql … igger.html


Jean-Marie
Azimut

Hors ligne

 

#5 Thu 30 September 2021 14:11

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour et merci pour l'info,

Par contre je vois que la doc est pour postgresql.
J'utilise un fichier geopackage qui semble être basé sur une BD sqlite spatiale (bref, spatialite). D'après ce que j'ai pu voir, sqlite ne gère pas les fonctions personnalisées (il ne comprend pas CREATE FUNCTION function_name). Ou alors il faut passer par d'autres langages que je ne maîtrise pas (python, php, C,...). Et je crains de devoir passer par un autre programme que le petit QGIS.
https://stackoverflow.com/questions/210 … -in-sqlite

Encore merci !

Hors ligne

 

#6 Thu 30 September 2021 16:33

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 576
Site web

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Avez-vous essayé avec la bibliothèque spatialite (cf. https://gis.stackexchange.com/questions … -template)

Sinon, ne pouvez-vous pas utiliser un fichier spatialite plutôt qu' un geopackage (les deux s'appuient sur sqlite)


Jean-Marie
Azimut

Hors ligne

 

#7 Thu 30 September 2021 16:40

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 4119

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Et je crains de devoir passer par un autre programme que le petit QGIS.


Hmmm... Et quid de l'utilisation d'un champ virtuel, même si ça contraint la consultation de l'info à se faire dans le même projet? Ou d'une valeur par défaut sur un champ, mais il me semble que ce n'est pas un trigger after update ici (mais ça fait un bail que j'ai testé cette option, peut-être que ça a évolué)?

Hors ligne

 

#8 Fri 01 October 2021 14:45

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

Effectivement, le champ virtuel peut être utile, au moins temporairement. L'intérêt de ces trigger était bien d'avoir une actualisation permanente de mes champs quelque soit le projet où j'utilise la couche.
Pour les valeurs par défaut, j'avoue n'y avoir jamais eu recours. je vais voir si je peux faire quelque chose avec ça...

Avez-vous essayé avec la bibliothèque spatialite (cf. https://gis.stackexchange.com/questions … -template)
Sinon, ne pouvez-vous pas utiliser un fichier spatialite plutôt qu' un geopackage (les deux s'appuient sur sqlite)


Si je ne parviens pas à trouver une solution je me tournerais effectivement vers d'autres alternatives plus lointaines.

J'avoue que j'aurais aimé rester sur du géopackage pour que ce soit accessible à mes collègues qui pataugent un peu en SIG. C'était l'avantage du format.
Maintenant, est-ce qu'une fois le DB Manager retravaillé les opérateurs de comparaison seront opérationnels à 100%, je l'espère.

En tous cas merci pour vos réponses !

Hors ligne

 

#9 Fri 01 October 2021 15:46

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 576
Site web

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Nighthawk a écrit:

J'avoue que j'aurais aimé rester sur du géopackage pour que ce soit accessible à mes collègues qui pataugent un peu en SIG. C'était l'avantage du format.


Au vu de vos critères, spatialite semble présenter es mêmes avantages que le geopackage (stokage des données en un seul fichier)

PS: je ne suis pas accro à Spatialite smile

Dernière modification par jmarsac (Fri 01 October 2021 15:47)


Jean-Marie
Azimut

Hors ligne

 

#10 Fri 01 October 2021 17:00

JD
Membre
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,
Essayez d'utiliser spatialite gui (le geopackage est reconnu) et voyez si la création de votre trigger avec les opérateurs > et < fonctionne.

Hors ligne

 

#11 Tue 05 October 2021 14:46

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

JD a écrit:

Bonjour,
Essayez d'utiliser spatialite gui (le geopackage est reconnu) et voyez si la création de votre trigger avec les opérateurs > et < fonctionne.


Bonjour,

Je viens de tester et le résultat est... étrange... Les trigger renvoyés par spatialite gui ne sont pas les mêmes que le DB manager de QGIS... Disons que spatialite gui me renvoie effectivement la requête que j'ai entré :

Code:

CREATE TRIGGER trigger_area_TEST_up
AFTER UPDATE
ON 'TEST'
FOR EACH ROW
BEGIN UPDATE 'TEST'
SET SURF_B_HA = st_area(new.geom) / 10000,
NB_LGTS = (
    CASE WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_B_HA" * "DENSITE") >= 1 ))
    THEN round(new."SURF_B_HA" * "DENSITE")
    WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_B_HA" * "DENSITE") < 1 ))
    THEN round(new."SURF_B_HA" * "DENSITE" + 0.5 )
    ELSE 0
    END)
WHERE fid = new.fid;
END

Par contre le DB manager de qgis me fait sauter le < :

Code:

CREATE TRIGGER trigger_area_TEST_ins
AFTER INSERT
ON 'TEST'
FOR EACH ROW
BEGIN UPDATE 'TEST'
SET SURF_B_HA = st_area(new.geom) / 10000,
NB_LGTS_B = (
    CASE WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_B_HA" * "DENSITE") >= 1 ))
    THEN round(new."SURF_B_HA" * "DENSITE")
    WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_B_HA" * "DENSITE") THEN round(new."SURF_B_HA" * "DENSITE" + 0.5 )
    ELSE 0
    END)
WHERE fid = new.fid;
END

On remarque que le < 1 disparaît et supprime le retour à la ligne... C'est un fâcheux casse-tête quand même...

Mais merci pour ce tuyaux !

Hors ligne

 

#12 Tue 05 October 2021 15:12

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 576
Site web

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Pas très satisfaisant mais en inversant la proposition cela semble fonctionner avec QGIS 3.16, c'est apparemment le '<' qui pose problème

Code:

CREATE TRIGGER trigger_area_TEST_up
AFTER UPDATE
ON 'TEST'
FOR EACH ROW
BEGIN UPDATE 'TEST'
SET SURF_B_HA = st_area(new.geom) / 10000,
NB_LGTS = (
    CASE WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND ((new."SURF_B_HA" * "DENSITE") >= 1 ))
    THEN round(new."SURF_B_HA" * "DENSITE")
    WHEN (("VOCATION" IN ( 'Habitat' , 'Mixte' )) AND (1 >  (new."SURF_B_HA" * "DENSITE")))
    THEN round(new."SURF_B_HA" * "DENSITE" + 0.5 )
    ELSE 0
    END)
WHERE fid = new.fid;
END

Dernière modification par jmarsac (Tue 05 October 2021 15:25)


Jean-Marie
Azimut

Hors ligne

 

#13 Tue 05 October 2021 16:43

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

jmarsac a écrit:

Pas très satisfaisant mais en inversant la proposition cela semble fonctionner avec QGIS 3.16, c'est apparemment le '<' qui pose problème


En effet, ça marche même assez bien comme ça.
Du coup je vais m'en contenter pour le moment. En tous cas merci à vous !

Hors ligne

 

#14 Tue 05 October 2021 17:49

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 4119

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,

En effet, ça marche même assez bien comme ça.
Du coup je vais m'en contenter pour le moment. En tous cas merci à vous !


Euh... Un bug report aiderait peut-être à faire avancer les choses et éviter ce casse-têtes à une tierce personne (PS: on est en pleine période de corrections de bugs pour la prochaine LTR)?

Hors ligne

 

#15 Tue 05 October 2021 23:58

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 576
Site web

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bug report #45420 créé smile


Jean-Marie
Azimut

Hors ligne

 

#16 Thu 07 October 2021 09:41

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 4119

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,
Merci Jean-Marie

Hors ligne

 

#17 Thu 07 October 2021 14:30

Nighthawk
Participant actif
Date d'inscription: 17 Sep 2014
Messages: 129

Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers

Bonjour,
Merci pour ce bug report, et pour les réponses !

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo