4 votos

Actualización automática de los campos de fecha y hora en QGIS

Deseo crear un campo que se actualice automáticamente con la fecha y hora actuales cuando se realizan modificaciones en una función.

Estoy usando QGIS 3.4 y estoy probando esto usando un shapefile.

Después de @Joseph La respuesta de esta pregunta He intentado actualizar su script para que funcione en QGIS 3.4 según sus instrucciones (si las he seguido correctamente, ¡no garantizado!) a esto:

layer = qgis.utils.iface.activeLayer()

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

layer.attributeValueChanged.connect(update)

Sin embargo, esto devuelve el siguiente error:

2018-11-29T11:13:00     WARNING    Traceback (most recent call last):
              File "", line 4, in update
             AttributeError: 'QgsVectorLayer' object has no attribute 'pendingFields'

¿Qué pasa aquí?

¿Funcionará también con las modificaciones de geometría o sólo con las de atributos?

¿Funcionará también para una capa SpatiaLite?

4voto

Edward Thomson Puntos 131

Sustituir pendingFields() por fields() debería solucionar su error. Usted todavía puede tener errores al ejecutar su código en QGIS 3.X porque no hay compatibilidad con versiones anteriores. Tienes que arreglar todos los cambios de la API y funcionará.

el pendingFields() se ha eliminado en la API de QGIS 3.X y se ha sustituido por fields() .

¿Funcionará también con las ediciones de geometría o sólo con las de atributos?

Para escuchar los cambios de geometría, puede conectarse a geometryChanged señal

El código completo será:

layer = qgis.utils.iface.activeLayer()

def update():
    field = layer.fields().lookupField('fieldName')
    e = QgsExpression( " $now " )
    for feat in layer.selectedFeatures():
        feat[field] = e.evaluate()
        layer.updateFeature( feat )

layer.attributeValueChanged.connect(update)
layer.geometryChanged.connect(update)

¿Funcionará también para una capa SpatiaLite?

Probablemente también funcione con las capas SpatiaLite.

3voto

aviraldg Puntos 1049

Crear un nuevo campo de fecha o fecha-hora.

Vaya a las propiedades de la capa ' Formulario de atributos. Seleccione su campo.

Activar la casilla Apply default value on update y establezca el valor predeterminado en $now .

Screenshot of Attributes Form dialog

0voto

Aditya Bharadwaj Puntos 115

Yo también necesito un apaño decente pero he conseguido un apaño sucio.

No puedo evitar que el valor se actualice cada vez que se edita cualquier atributo del registro o de la geometría. Pero, puedo hacer una especie de "bloqueo" del valor.

Sirve para registrar la fecha en que se inspecciona físicamente el elemento in situ. En algunos casos, la fecha de inspección puede ser lo único que introduzca el usuario.

He establecido 2 campos de casilla de verificación llamados "SurveyedYN" y "confirm". El campo de fecha y hora se llama "SurveyDate" y se actualizará a la hora actual si SurveyYN está marcada y Confirm no está marcada. Si ambos están marcados, o ambos están desmarcados, la fecha se actualizará a su valor actual.

Este es el aspecto del cuadro de valores por defecto de SurveyDate con la opción "aplicar al actualizar" activada:

If ("SurveyedYN" = 'Y' AND "confirm" = 'N', $now(), "SurveyDate")

En el formulario de introducción de datos, la secuencia de entradas obliga al usuario a marcar primero SurveyedYN y luego confirmed, de modo que la lógica sólo funciona si el usuario no confunde el orden.

También funcionaría con una sola casilla de verificación si sabes que las ediciones que hagas se confirmarán antes de que haya que marcar la casilla.

No es genial pero es funcional

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X