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

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.

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Il mer 5 feb 2020, 07:19 FabioP <fabio.pifferini@masotti.ch> ha scritto:

Buongiorno,

Ciao

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.

Attendo volentieri qualche suggerimento, grazie mille.

(domanda camuffata da risposta in attesa di conferma) credo tu debba allestire dei trigger nel DB (e qui cedo la mano)

F.

Ciao,
Giuliano

Ciao Fabio,

direi dei trigger:

https://www.sqlitetutorial.net/sqlite-trigger/

Matteo

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]) 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)
è 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.

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)* 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)* where gid=new.gid;
END;

facci sapere.

saluti,
francesco

Il giorno mer 5 feb 2020 alle ore 07:19 FabioP <fabio.pifferini@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.

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

Inviato: mercoledì, 5 febbraio 2020 17:33

···

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]) 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)

è 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.

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)* 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)* where gid=new.gid;
END;

facci sapere.

saluti,

francesco

Il giorno mer 5 feb 2020 alle ore 07:19 FabioP <fabio.pifferini@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](http://www.sophos.com)