[QGIS-it-user] R: Campi database calcolati/dinamici
Fabio Pifferini
Fabio.Pifferini a masotti.ch
Gio 6 Feb 2020 11:17:18 PST
Ciao a tutti,
intendevo database spatialite.
Ringrazio per i suggerimenti, mi era sfuggita la possibilità dei “trigger”.
Nei prossimi giorni provo a seguire quanto indicatomi
Fabio
Da: QGIS-it-user <qgis-it-user-bounces a lists.osgeo.org> Per conto di francesco marucci
Inviato: mercoledì, 5 febbraio 2020 17:33
A: Utenti QGIS it <qgis-it-user a lists.osgeo.org>
Oggetto: Re: [QGIS-it-user] Campi database calcolati/dinamici
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<mailto: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.
--
This email was Anti Virus checked by Astaro Security Gateway. http://www.sophos.com
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20200206/376beb2a/attachment.html>
Maggiori informazioni sulla lista
QGIS-it-user