Faire un champ de date et d'heure mis à jour automatiquement dans QGIS?

8

Je souhaite créer un champ de date et d'heure mis à jour lorsque je modifie un champ d'attribut dans ce format aaaa-mm-jj 00:00:00 (= 2016-05-08 11:04:00) - ma date / heure locale. Les données sont dans un fichier de formes QGIS 2.14 et des lignes vectorielles comme capture d'écran ci-dessous.

Lorsqu'une fonction NULL dans le « nom » champ, je veux entrer un nom pour la route et le champ « mod » doit recevoir de mod ified date / heure comme '08/05/2016 15:16:00.

J'ai déjà essayé quelques options et j'ai échoué. J'ai besoin d'aide pour recommencer depuis le début.

  1. Je crée un nouveau champ, type de date / heure, mais reste avec une valeur NULL après avoir modifié, dans le champ "nom", ou la fonctionnalité elle-même.
  2. J'ai aussi utilisé l'expression now (), mais reste avec la valeur NULL après avoir édité.

Remarque: la date qui y est vue, 2016-04-14 est la première valeur créée avec "Field Calculator".

entrez la description de l'image ici

J'utilise QGIS 2.14.

Carlos Pires
la source
Veuillez modifier votre question pour spécifier le format des données et les versions des logiciels utilisés. Vous devez également spécifier le type de données de la colonne cible (puisque les champs de date n'ont pas de formats)
Vince
Veuillez modifier la question pour contenir les informations demandées. Vous devez détailler ce que vous avez essayé et exactement comment il a échoué. Cela aidera nos bénévoles à comprendre ce que vous essayez d'accomplir. À l'heure actuelle, il n'y a pas suffisamment d'informations pour deviner une solution - j'imagine qu'une colonne de remplissage automatique dans DB2 ne répondra pas à vos besoins.
Vince
Cela me semble si vous souhaitez stocker l'horodatage de la dernière modification / mise à jour d'une fonctionnalité dans un attribut, vous ai-je bien compris? Quelque chose comme ce que ESRI appelle le «suivi de l'éditeur»?
Jochen Schwarze
2
alors quel type de fournisseur de données utilisez-vous (forme, postgis, ...) et au fait: le mois à 3 chiffres est-il une erreur de frappe ou avez-vous besoin de quelque chose comme 2016-mai-08? peut-être réussir à capturer le signal «beforeCommitChanges» d'un déclencheur «QgsVectorLayer» ou «UPDATE» dans postgesql.
Jochen Schwarze
1
Shapefile est un format de données misérable pour les horodatages, car dBase ne prend en charge que la résolution journalière (il ne prend pas vraiment en charge les valeurs NULL non plus). Vous devez utiliser une colonne de caractères pour cette information (qui devra ensuite être analysée pour toute autre utilisation)
Vince

Réponses:

12

Vous pouvez utiliser le code suivant qui connecte l' attributeValueChangedévénement à une fonction que nous pouvons définir qui insère les résultats de l' $nowexpression. Mettez en surbrillance votre couche et copiez / collez les éléments suivants dans la console Python :

layer = qgis.utils.iface.activeLayer()

def update():
    field = layer.fieldNameIndex('mod')
    e = QgsExpression( " $now " )
    e.prepare( layer.pendingFields() )
    for feat in layer.selectedFeatures():
        feat[field] = e.evaluate( feat )
        layer.updateFeature( feat )

layer.attributeValueChanged.connect(update)

Sélectionnez l'entité en cliquant sur le numéro de ligne (indiqué dans la zone rouge de l'image) ou dans le canevas de carte et modifiez tout attribut pour cette entité. L'attribut de votre modchamp doit être mis à jour:

Résultat


Remarque: J'ai utilisé un champ de chaîne au lieu de date afin d'obtenir l'heure, sinon le champ de date enregistre uniquement AAAA-MM-JJ .

Joseph
la source
@CarlosPires - Bienvenue! J'espère que ça aide :)
Joseph
j'ai donc créé un nouveau champ de chaîne de texte (20) 'mod' (voir 1) , j'ai collé votre code dans la console Python (après ctrl-alt-P), inséré le nom de la rue 'name' (voir 2) , a quitté l'enregistrement mais le champ est toujours NULL (voir 3) comme vous le voyez dans la capture d'écran. ! [ScreenshotTry] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires
2
Maintenant ça marche! Comme je ne suis pas programmeur, je ne savais pas que nous avions d'abord exécuté le code !! :( Désolé. Remarque : Cela fonctionne avec l'outil de sélection. Si le champ d'attribut est modifié avec l'outil d'information (identifier la fonction), cela ne fonctionne pas.
Carlos Pires
2
@CarlosPires Vous pouvez utiliser le plugin AutoFields pour cela. Regardez cette vidéo pour un exemple de calcul automatique de la date et de l'heure. Je suppose que cela devrait également fonctionner si vous utilisez l'outil d'identification pour mettre à jour vos valeurs, pourriez-vous s'il vous plaît vérifier?
Germán Carrillo
1
@ GermánCarrillo, cela semble un bon choix. Je vais essayer plus tard. Merci.
Carlos Pires
3

Je suis tombé sur cette Q&R alors que je cherchais un moyen de modifier les horodatages que j'apportais aux enregistrements à l'aide d'un plugin. J'ai placé une version légèrement modifiée du code dans le plugin pour mettre à jour automatiquement la date / l'heure dans le ou les enregistrements que j'ai modifiés:

""" Prepare Change Date/Time Stamp"""
e = QgsExpression( " $now " )
cDate = e.evaluate()

"""" Identify column(s) to change and new value(s) to assign"""
attrs = { 10 : newStat, 20 : cDate }

""" Make record change and capture date/time of change'''
layer.dataProvider().changeAttributeValues({ fid : attrs })
rLogan
la source
Techniquement, cela ne semble pas être une réponse, mais je pense que cette "réponse" peut avoir une certaine valeur pour un futur lecteur dans le cadre du Q&A et je la laisse donc en place. Il a besoin de plus de mise en forme que ne le permettrait la conversion en commentaire. Je suis heureux d'être rejeté si quelqu'un plus proche de l'écriture de plug-ins QGIS que moi veut faire un commentaire dans les commentaires ici, puis me cingler ou un autre modérateur.
PolyGeo