7 votos

Rellenar los campos con cláusulas condicionales

Tengo cuatro campos en mi archivo de formas. Me gustaría llenar sólo uno de ellos (celda de la tabla de atributos) y automáticamente después de escribir una celda los otros serán llenados por la cláusula condicional. Necesito que este condicional se mantenga ahí, llenando el atributo de valor, sin necesidad de ejecutar la calculadora archivada (automáticamente).

I will fill only one of the field: "nivel_1", "nivel_2", "nivel_3" and "codigo" and the others are fielded  immediatly

5voto

Mue Puntos 2469

Podrías crear Campos virtuales para los campos que quieres que se actualicen automáticamente. Cuando crees una expresión para estos campos virtuales, se aplicarán cada vez que realices y guardes cambios en el archivo shape (es posible que tengas que recargar la tabla de atributos para ver los cambios).

Virtual field

También tenga en cuenta que tendrá que crear un Proyecto para el archivo de formas (si no lo ha hecho ya) ya que los campos virtuales se almacenan en los archivos del proyecto (.qgs).


Alternativamente, también podrías editar y ejecutar el siguiente script desde el Consola Python . Después de que hayas rellenado la columna codigo cambio formula_1 etc. a su expresión deseada y ejecutarla. Usted debería obtener los mismos resultados que obtendrías al usar campos virtuales con la principal diferencia de que los campos se almacenan dentro del shapefile (útil si se necesita exportar los resultados):

layer = qgis.utils.iface.activeLayer()
layer.startEditing()

idx_1 = layer.fieldNameIndex( "nivel_1" )
idx_2 = layer.fieldNameIndex( "nivel_2" )
idx_3 = layer.fieldNameIndex( "nivel_3" )

formula_1 = 'case when "codigo" = 1 then 1 end'
formula_2 = 'case when "codigo" = 2 then 2 end'
formula_3 = 'case when "codigo" = 3 then 3 end'

e_1 = QgsExpression( formula_1 )
e_2 = QgsExpression( formula_2 )
e_3 = QgsExpression( formula_3 )

e.prepare(layer.pendingFields())

for f in layer.getFeatures():
    f[idx_1] = e_1.evaluate( f )
    f[idx_2] = e_2.evaluate( f )
    f[idx_3] = e_3.evaluate( f )
    layer.updateFeature( f )

layer.commitChanges()

Nota: ¡Hay formas más agradables de hacer guiones para lograr esto!


¡Espero que esto ayude!

1voto

Howard Puntos 356

En el caso de que quisiera imprimir una cadena en lugar de un valor numérico como retorno, es decir, "caso cuando "codigo" = 1 y luego "hola" fin"... ¿cómo codificaría eso?

Disculpa por incluir esto como respuesta. No tengo suficiente reputación para hacer un comentario. Apreciaría si alguien pudiera colocar esta petición en el lugar correcto.

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