Pages: 1
- Sujet précédent - QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers - Sujet suivant
#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
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
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
Re: QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers
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
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
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
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,
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
#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
Pages: 1
- Sujet précédent - QGIS 3.16: Operateurs < et > mal interpretes pour des Triggers - Sujet suivant