[QGIS-it-user] Campi database calcolati/dinamici

francesco marucci francesco.marucci a gmail.com
Mer 5 Feb 2020 08:33:11 PST


ciao,
cosa intendi per "database sqlite"? geopackage o spatialite?

ci sono due modi per risolvere la tua esigenza:

1
creare una vista geometrica in questo modo (esempio geopackage)

devi innanzitutto abilitare le funzioni spaziali (solo se lavori fuori da
QGIS):
SELECT load_extension('mod_spatialite.so');
SELECT EnableGpkgAmphibiousMode();

create view [vista_geometrica] as
select *, st_length([geom]) as lunghezza,  st_length([geom])*[x] as costo
from [tabella_geometrica]

dove:
[vista_geometrica] è il nome in output che tu vuoi dare
[tabella_geometrica] è il tuo layer di linee
[geom] è il nome del tuo campo geometria (linee)
[x] è il tuo valore fisso (può anche essere un campo numerico)

una volta creata questa vista la devi catalogare nel geopackage (metodo
manuale):

insert into gpkg_geometry_columns
(table_name,column_name,geometry_type_name,srs_id,z,m) values (
'[vista_geometrica]',
'[geom]',
(select geometry_type_name from gpkg_geometry_columns where
table_name='[tabella_geometrica]'),
(select srs_id from gpkg_contents where table_name='[tabella_geometrica]'),
0,0
);

insert into gpkg_extensions
(table_name,column_name,extension_name,definition,scope) values (
'[vista_geometrica]',
(select column_name from gpkg_geometry_columns where
table_name='[tabella_geometrica]'),
(select extension_name from gpkg_extensions where
table_name='[tabella_geometrica]'),
(select definition from gpkg_extensions where
table_name='[tabella_geometrica]'),
(select scope from gpkg_extensions where table_name='[tabella_geometrica]')
);

insert into gpkg_ogr_contents (table_name,feature_count) values (
'[vista_geometrica]',
(select count(*) from [tabella_geometrica])
);

è un po rocambolesco ma funziona.

ovviamente poi l'editing continui a farlo sulla tua [tabella_geometrica] e
nella [vista_geometrica] troverai i dati aggiornati.




2.
come già qualcuno ha suggerito, con un trigger (anzi, due):

CREATE TRIGGER agg_lunghezza_after_insert_[tabella_geometrica]
   AFTER INSERT ON [tabella_geometrica]
     BEGIN
        UPDATE [tabella_geometrica] set lunghezza=st_length(geom), costo =
st_length(geom)*[x] where gid=new.gid;
     END;

CREATE TRIGGER agg_lunghezza_after_update_[tabella_geometrica]
   AFTER UPDATE ON [tabella_geometrica]
     BEGIN
       UPDATE [tabella_geometrica] set lunghezza=st_length(geom), costo =
st_length(geom)*[x] where gid=new.gid;
     END;


facci sapere.

saluti,
francesco




Il giorno mer 5 feb 2020 alle ore 07:19 FabioP <fabio.pifferini a masotti.ch>
ha scritto:

> Buongiorno,
> lavoro con layer basati su un database sqlite, contenete informazioni
> tipologiche e geometriche.
> M'interesserebbe far si che alcuni campi (il cui valore è dipendente da
> altri valori nella tabella) venissero aggiornati in automatico ogni volta
> che si cambiano dei campi di riferimento.
>
> Per esempio:
> Ho i seguenti campi "Lunghezza" e "Costo",
> Il valore del campo "Costo" = "Lunghezza" x fattore fisso.
> Vorrei che quando cambio il valore del campo "Lunghezza" su un determinato
> vettore, il corrispondente valore del campo "Costo" venisse aggiornato.
>
> Attendo volentieri qualche suggerimento, grazie mille.
>
> F.
>
>
>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20200205/f44f121e/attachment.html>


Maggiori informazioni sulla lista QGIS-it-user