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).
Respuestas
¿Demasiados anuncios?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).
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!
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.