Olá Luís, Pois, correndo o UPDATE depois de inserir os pontos, a coisa funciona, a trigger é que, aparentemente, não está a funcionar, mas também não devolve erro nenhum. No meio de tantas sub-queries, a certa altura já não consigo perceber se os "NEW." da trigger estão nas variáveis certas, mas já fiz várias tentativas e o resultado é sempre o mesmo... não preenche o campo morada_rede_viaria.
Como posso emitir a mensagem que referes? Muito obrigado! Abraço, Pedro ----- Original Message ----- From: Luís de Sousa 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
