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

Les inscriptions sont ouvertes ! L'association GeoRezo sera présente.

#1 Hier 10:56

AlexisSIG
Participant occasionnel
Date d'inscription: 17 Mar 2025
Messages: 10

QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,

J'ai un projet QGIS avec un ensemble de couches provenant d'une connexion PostgreSQL.
Je mets ce projet sur QField pour une prise de données naturaliste sur le terrain. La connexion avec la base se fait sans problème.

Je souhaite cependant, filtrer l'ensemble de mes couches selon un champ. J'ai donc créé une variable projet sur QGIS que je laisse vide. J'ai ensuite écrit un script QML (ci-dessous) permettant l'ouverture d'un popup à mon ouverture de mon projet sur QField et me permettant de renseigner une valeur pour cette variable et ainsi filtrer mes couches. (Le script présenté n'est fait que pour filtrer une seule couche, je l'adapterai pour les autres lorsque celui-ci fonctionnera). Les logs QField me permettent de voir que j'ai le bon nom de champ reconnu et le bon filtre renseigné lorsque je l'intègre.
Pour autant, ma couche affiche 0 entité. Je n'arrive pas à comprendre où mon script cesse de fonctionner correctement.

Code:

import QtQuick
import QtQuick.Controls
import org.qfield
import Theme

Item {
    Component.onCompleted: {
        codeetudeDialog.open();
    }

  QfDialog {
    id: codeetudeDialog
    parent: iface.mainWindow().contentItem

    width: 300
    height: 180
    x: (iface.mainWindow().width - width) / 2
    y: (iface.mainWindow().height - height) / 2
    title: "Saisissez un Code Etude"

    Column {
      id: columnLayout
      width: parent.width

      TextField {
        id: codeetudeField
        width: parent.width
        text: ""
      }
    }

    onAccepted: {
      const valeur = codeetudeField.text.trim();
      if (valeur === "") return;

      ExpressionContextUtils.setProjectVariable(qgisProject, "code_etude", valeur);
      let projectInfo = iface.findItemByObjectName("projectInfo");
      projectInfo.saveVariable("code_etude", valeur);

      const couches = qgisProject.mapLayersByName("Etude");
      if (couches.length === 0) return;
      const couche = couches[0];

      const valeurSafe = valeur.replace(/'/g, "''");
      couche.subsetString = '"Code_Etude" = \'' + valeurSafe + "'";

      // Remplace reload() + triggerRepaint() + mapCanvas().refresh()
      iface.reloadProject();
    }
  }
}

Hors ligne

 

#2 Hier 12:53

Al3+
Participant actif
Lieu: Fécamp
Date d'inscription: 5 Sep 2005
Messages: 74

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,

N'y a-t-i pas une subtilité avec les ' et les " ?

Je vous propose :

Code:

couche.subsetString = '"Code_Etude" = \'' + valeurSafe + '\'';

au lieu de

Code:

couche.subsetString = '"Code_Etude" = \'' + valeurSafe + "'";

Hors ligne

 

#3 Hier 13:13

AlexisSIG
Participant occasionnel
Date d'inscription: 17 Mar 2025
Messages: 10

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Je viens d'essayer la solution proposer mais rien ne change malheureusement

Hors ligne

 

#4 Hier 21:19

fabriceg
Juste Inscrit !
Date d'inscription: 3 Mar 2025
Messages: 4

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,
Je ne suis pas familier avec le QML, en python j'aurais plutôt écrit

Code:

couche.setSubsetString('"Code_Etude" = \'' + valeurSafe + '\'')

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo