[QGIS-it-user] Qgis&Postgresql - Vista editabile con geometria

falcerisimone a inwind.it falcerisimone a inwind.it
Ven 20 Set 2019 00:53:48 PDT


Buongiorno a tutti,
forse non è il posto giusto per esporre un simile quesito,
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!


Maggiori informazioni sulla lista QGIS-it-user