[Gfoss] Postgresql&Qgis - Vista editabile con geometria

Falz falcerisimone a inwind.it
Ven 20 Set 2019 09:11:31 CEST


Buongiorno a tutti,
sto cercando di creare una vista Postgresql con geometria di tipo punto in
modo da poterla editare direttamente in Qgis.
Il problema che non riesco a sbloccare è creare la RULE giusta per la fase
di INSERT, il famoso "RETURNING".
Condivido il codice demo per chi fosse interessato all'argomento:


--TABELLA FISICA "SITI"
create table myschema.siti
(
id serial primary key,
richiesto boolean,
nome character varying(100),
cod_ser character varying(70),
indirizzo character varying(100),
comune character varying(70),
determina_nr integer,
determina_data date,
scadenza_conc date,
voltura1_nr integer, --aggiungi
voltura1_data date, --aggiungi
voltura1_scadenza_conc date, --aggiungi
determina_nr_rinnovo integer,
determina_data_rinnovo date,
scadenza_conc_rinnovo date,
voltura2_nr integer, --aggiungi
voltura2_data date, --aggiungi
voltura2_scadenza_conc date, --aggiungi
note text,
cc integer,
num character varying(50),
classe integer,
verificato boolean,
foto boolean,
tratta character varying(50),
constraint siti_date_check check (determina_data < scadenza_conc and
determina_data_rinnovo < scadenza_conc_rinnovo and voltura1_data <
voltura1_scadenza_conc and voltura2_data < voltura2_scadenza_conc)
);
select AddGeometryColumn('myschema','siti','geom',3064,'POINT',2);
create index idx_siti_geom on myschema.siti using gist (geom);


--VISTA DEI SITI
create view myschema.vista as
select
id,
geom,
st_astext(st_transform(geom,25832)) as etrs89_coordinate,
richiesto,
--calcolo con le 4 date (scadenza_conc, voltura1_scadenza_conc,
scadenza_conc_rinnovo, voltura2_scadenza_conc)
(case
when --quando le date di scadenza sono superiori alla data odierna
((now() < voltura2_scadenza_conc) or (now() < scadenza_conc_rinnovo) or
(now() < voltura1_scadenza_conc) or (now() < scadenza_conc))
and --e mancano più di 180 giorni alla scadenza
((date_part('day', voltura2_scadenza_conc - now()) >  180)
or
(date_part('day', scadenza_conc_rinnovo - now()) >  180)
or
(date_part('day', voltura1_scadenza_conc - now()) >  180)
or
(date_part('day', scadenza_conc - now()) >  180)) then 'In vigore'::text
when --quando le date di scadenza sono state superate dalla data odierna
(now() >  scadenza_conc)
and
(now() >  voltura1_scadenza_conc or voltura1_scadenza_conc is null) 
and
(now() >  scadenza_conc_rinnovo or scadenza_conc_rinnovo is null)
and
(now() >  voltura2_scadenza_conc or voltura2_scadenza_conc is null) then
'Scaduta'::text
when --quando mancano 180 giorni o meno alla scadenza
date_part('day', scadenza_conc - now()) <= 180
OR date_part('day', voltura1_scadenza_conc - now()) <= 180
OR date_part('day', scadenza_conc_rinnovo - now()) <= 180
OR date_part('day', voltura2_scadenza_conc - now()) <= 180 then 'In
scadenza'::text
else null end) as situazione,
determina_nr,
determina_data,
scadenza_conc,
voltura1_nr,
voltura1_data,
voltura1_scadenza_conc,
determina_nr_rinnovo,
determina_data_rinnovo,
scadenza_conc_rinnovo,
voltura2_nr,
voltura2_data,
voltura2_scadenza_conc,
tratta,
classe,
verificato,
foto,
cc,
num,
note,
indirizzo,
comune,
nome,
cod_ser,
st_astext(st_transform(geom,4326)) as wgs84_ddd
from myschema.siti;


--VISTA EDITABILE, REGOLE PER EDITING
--Delete
create or replace rule siti_cancella as
on delete to myschema.vista do instead
delete from myschema.siti where siti.id = old.id;

--Update
create or replace rule siti_modifica as
on update to myschema.vista do instead
update myschema.siti
set
richiesto = new.richiesto,
nome = new.nome,
cod_ser = new.cod_ser,
indirizzo = new.indirizzo,
comune = new.comune,
determina_nr = new.determina_nr,
determina_data = new.determina_data,
scadenza_conc = new.scadenza_conc,
voltura1_nr = new.voltura1_nr,
voltura1_data = new.voltura1_data,
voltura1_scadenza_conc = new.voltura1_scadenza_conc,
determina_nr_rinnovo = new.determina_nr_rinnovo,
determina_data_rinnovo = new.determina_data_rinnovo,
scadenza_conc_rinnovo = new.scadenza_conc_rinnovo,
voltura2_nr = new.voltura2_nr,
voltura2_data = new.voltura2_data,
voltura2_scadenza_conc = new.voltura2_scadenza_conc,
note = new.note,
cc = new.cc,
num = new.num,
classe = new.classe,
verificato = new.verificato,
foto = new.foto,
tratta = new.tratta,
geom = new.geom
where siti.id = new.id;

--Insert
create or replace rule siti_inserisci as
on insert to myschema.vista do instead
insert into myschema.siti
(id,
richiesto,
nome,
cod_ser,
indirizzo,
comune,
determina_nr,
determina_data,
scadenza_conc,
voltura1_nr,
voltura1_data,
voltura1_scadenza_conc,
determina_nr_rinnovo,
determina_data_rinnovo,
scadenza_conc_rinnovo,
voltura2_nr,
voltura2_data,
voltura2_scadenza_conc,
note,
cc,
num,
classe,
verificato,
foto,
tratta,
geom)
values
(nextval('myschema.siti_id_seq'::regclass),
new.richiesto,
new.nome,
new.cod_ser,
new.indirizzo,
new.comune,
new.determina_nr,
new.determina_data,
new.scadenza_conc,
new.voltura1_nr,
new.voltura1_data,
new.voltura1_scadenza_conc,
new.determina_nr_rinnovo,
new.determina_data_rinnovo,
new.scadenza_conc_rinnovo,
new.voltura2_nr,
new.voltura2_data,
new.voltura2_scadenza_conc,
new.note,
new.cc,
new.num,
new.classe,
new.verificato,
new.foto,
new.tratta,
st_force2d(new.geom))

returning
siti.id,
siti.richiesto,
siti.nome,
siti.cod_ser,
siti.indirizzo,
siti.comune,
siti.determina_nr,
siti.determina_data,
siti.scadenza_conc,
siti.voltura1_nr,
siti.voltura1_data,
siti.voltura1_scadenza_conc,
siti.determina_nr_rinnovo,
siti.determina_data_rinnovo,
siti.scadenza_conc_rinnovo,
siti.voltura2_nr,
siti.voltura2_data,
siti.voltura2_scadenza_conc,
siti.note,
siti.cc,
siti.num,
siti.classe,
siti.verificato,
siti.foto,
siti.tratta,
siti.geom
;
/*
ERROR: RETURNING list's entry 2 has different type from column "geom"
SQL state: 42P17
Detail: RETURNING list entry has type boolean, but column has type geometry.
LA COPPIA DI VOCI DELL'ELENCO DI RITORNO HA UN TIPO DIVERSO DALLA COLONNA
"GEOM"
*/

Ringraziando anticipatamente, si pongono distinti saluti!

--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/


Maggiori informazioni sulla lista Gfoss