[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