Olá Pedro,

Não consigo encontrar erros no trigger. Parece-me simplesmente que a
query não está a devolver resultados. Também poderá estar a devolver
mais que uma linha no resultado. O melhor é experimentar emitir uma
mensagem com o conteúdo do campo morada_rede_viaria antes do return
para ter a certeza.

Boa sorte,

Luís

2011/7/23 Pedro Venâncio <[email protected]>:
> Olá boa tarde,
>
>
> Ando há uns dias a tentar encontrar solução para este problema, inserir 
> automaticamente a morada numa tabela postgis de pontos a partir da morada que 
> se encontra numa tabela de linhas (rede_viaria). A solução que encontrei 
> passa por obter a morada a partir da linha que se encontra mais próxima do 
> ponto (até um limite de 80m):
>
> UPDATE plantas_emitidas
> SET morada_rede_viaria = morada
> From
> (select  t2.gid as p_id, t1.nome as morada
> from rede_viaria t1, plantas_emitidas t2,
> (select gid as plantas_emitidas_gid, (select gid from rede_viaria order by 
> st_distance(rede_viaria.the_geom, plantas_emitidas.the_geom) limit 1 ) as 
> rede_viaria_gid from plantas_emitidas) as t3
> where t1.gid = t3.rede_viaria_gid and t2.gid = t3.plantas_emitidas_gid and 
> st_dwithin(t1.the_geom, t2.the_geom,80)
> ORDER BY t2.ref_int) as foo
> where p_id = plantas_emitidas.gid
>
> Esta solução funciona perfeitamente, no entanto não consigo criar uma trigger 
> para a correr automaticamente sempre que adiciono novos pontos. Tentei assim
>
> CREATE OR REPLACE FUNCTION preenche_morada_plantas_from_rede_viaria()
> RETURNS TRIGGER AS
> $BODY$
> BEGIN
> SELECT morada INTO NEW.morada_rede_viaria
> From
> (select  t2.gid as p_id, t1.nome as morada
> from rede_viaria t1, plantas_emitidas t2,
> (select NEW.gid as plantas_emitidas_gid, (select gid from rede_viaria order 
> by st_distance(rede_viaria.the_geom, NEW.the_geom) limit 1 ) as 
> rede_viaria_gid from plantas_emitidas) as t3
> where t1.gid = t3.rede_viaria_gid and NEW.gid = t3.plantas_emitidas_gid and 
> st_dwithin(t1.the_geom, t2.the_geom,80)
> ORDER BY t2.ref_int) as foo
> where p_id = NEW.gid;
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE
>
> CREATE TRIGGER update_nome_rua_plantas_from_rede_viaria
>   BEFORE INSERT OR UPDATE
>   ON plantas_emitidas
>   FOR EACH ROW
>   EXECUTE PROCEDURE preenche_morada_plantas_from_rede_viaria();
>
>
> Não dá erros, mas também não preenche o campo morada_rede_viaria na tabela de 
> pontos.
>
>
> Agradeço quaisquer sugestões que me possam dar os mais experientes, porque 
> acho que já não consigo avançar mais... Se for mais simples chegar ao mesmo 
> resultado por outro caminho, também agradeço as dicas que me possam dar!
>
>
> Abraço! Bom fim de semana!
>
>
> Pedro Venâncio
>
> _______________________________________________
> Portugal mailing list
> [email protected]
> http://lists.osgeo.org/mailman/listinfo/portugal
>
_______________________________________________
Portugal mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/portugal

Responder a