Wstawianie wielu rekordów QGIS/PostgreSQL

0

Cześć,
Mam projekt w qgis w którym mam warstwy obszary(poligon) i promocje( niegometryczna). Chciałbym z poziomu qgis mieć w miare wygodną możliwość przypisywania promocji do obszarów. Problem w tym, że do każdego obszaru może być kilka promocji, czyli relacja N;n jeżeli dobrze rozumiem. Warstwy stoją na postgresie. Utworzyłem tabele złączeniowa id, id_obszaru, id_promocji, ale ręczne wpisywanie kombinacji mnie nie satysfakcjonuje. Fajnie by było, gdyby dało sie zanaznaczyć w QGis na mapie obszary i wtedy do nich dopisywać promocje.

1

Rozwiązaniem było stworzenie nowej kolumny dodane_promocje oraz triggera, który wstawiał w tabelę złączeniową id obszaru oraz wartość z kolumny dodane_promocje w odpowiednie miejsca. Z poziomu qgis możemy multiedycją wprowadzać zmiany do wielu obszarów i przypisywać im jeden atrybut. Analogicznie działa usuwanie. Dodajemy kolumnę usuwane_promocje i tam wpisujemy id promocji do usunięcia z tego obszaru.

CREATE OR REPLACE FUNCTION tmp_geoinfo.obszary_cenowe_promocje()
  RETURNS trigger AS
$BODY$
BEGIN
if new.dodane_promocje <> old.dodane_promocje then
 insert into  tmp_geoinfo.oc_promocje_obszary_cenowe( id_promocji,id_obszaru)
 values (new.dodane_promocje,old.id);
 end if;
 RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tmp_geoinfo.obszary_cenowe_promocje()
  OWNER TO wkolosa;

CREATE TRIGGER trigger_obszary_cenowe_promocje
  BEFORE INSERT OR UPDATE
  ON tmp_geoinfo.obszary_cenowe_v3
  FOR EACH ROW
  EXECUTE PROCEDURE tmp_geoinfo.obszary_cenowe_promocje();

Aby nie duplikować wartości obszar-promocja na tabelę z promocje_uslugi dodajemy ograniczenie na unikalny concat(id_promocji,id_obszaru)
który tworzy się triggerem

wojkol1 napisał(a):

Cześć,
Mam projekt w qgis w którym mam warstwy obszary(poligon) i promocje( niegometryczna). Chciałbym z poziomu qgis mieć w miare wygodną możliwość przypisywania promocji do obszarów. Problem w tym, że do każdego obszaru może być kilka promocji, czyli relacja N;n jeżeli dobrze rozumiem. Warstwy stoją na postgresie. Utworzyłem tabele złączeniowa id, id_obszaru, id_promocji, ale ręczne wpisywanie kombinacji mnie nie satysfakcjonuje. Fajnie by było, gdyby dało sie zanaznaczyć w QGis na mapie obszary i wtedy do nich dopisywać promocje.

0

Przyznam się, że nie zrozumiałem problemu. Wydawało mi się, że narzędzia klasy GIS mają możliwość:
a) wyboru obszaru
b) importu danych i powiązania ich z wybranym obszarem za pomocą funkcji JOIN

np. mamy plik CSV np. promocje.csv, a w nim atrybuty: Promocja,IdObszaru, DanePromocji, Od, Do.

Procedura działania, np. tu: https://tilemill-project.github.io/tilemill/docs/guides/joining-data/

Chyba, że nie o to chodziło :)

W każdym razie +1 za powrót na forum i podzielenie się rozwiązaniem problemu :)

2

@wojkol1: A to ci działa? bo masz warunek if new.dodane_promocje <> old.dodane_promocje then, a w on insert nie ma obiektu old.

0
Marcin.Miga napisał(a):

@wojkol1: A to ci działa? bo masz warunek if new.dodane_promocje <> old.dodane_promocje then, a w on insert nie ma obiektu old.

działa, gdy nie ma żadnego rekordu w dodane_promocje oraz wtedy gdy ten rekord aktualizuję. Tylko to jest trochę słabe bo w tabeli cały czas wiszą mi promocje, które wprowadzałem ostatnio

0
wojkol1 napisał(a):
Marcin.Miga napisał(a):

@wojkol1: A to ci działa? bo masz warunek if new.dodane_promocje <> old.dodane_promocje then, a w on insert nie ma obiektu old.

działa, gdy nie ma żadnego rekordu w dodane_promocje oraz wtedy gdy ten rekord aktualizuję. Tylko to jest trochę słabe bo w tabeli cały czas wiszą mi promocje, które wprowadzałem ostatnio

jednak tylko myślałem, że działa, przy wartości null nie robi inserta

1 użytkowników online, w tym zalogowanych: 0, gości: 1