1

Temat: Widok i aktualizacja rekordów

Witam Panowie mam pytanie czy można zaktualiozować widok zbudowany z dwuch tabel połaczonych JOIN-em jesli tak w jaki sposób to zrobić czy trzeba pisać triger na każde pole widoku ??

Ostatnio edytowany przez Rady (2009-02-01 13:18:19)

2

Odp: Widok i aktualizacja rekordów

???
Zaktualizować widok? Widok jest tworem, który jest niczym innym jak SELECT'em przechowywanym w bazie, nie ma potrzeby aktualizowania go, bo aktualizuje sie sam (chyba ze cos sie zmienilo w tej kwestii)

3

Odp: Widok i aktualizacja rekordów

Znaczy nie chodzi mi o aktualizację samego widoku źle to określiłem, może inaczej : czy można za pomocą jakiegoś trigeru zaktualizować dane za widokiem tzn : w aplikacji wyświetlam widok zamiast tabeli w gridzie napisałem kilka fajnych prcedurek aktualizujących wybrane pole z grida, a problem jest właśnie z widokiem przy wydaniu na  Query z  połaczonym z Gridem polecenia UPDATE, jak zrobić żeby zostały zaktualizowane odpowiednie dane  ukryte za widokiem jakiś triger do tego ?? W aplikacji napisałem ukrytą aktualizacje ale niestety gdy odświrze widok po aktualizacji  kursor grida wraca na początek danych, gdy robie bezpośrednio aktualizacje na tabeli nie ma takich jaj.

4

Odp: Widok i aktualizacja rekordów

Jesli rozumiem chcesz wstawiac dane do grida, ktory powstal z widoku i maja ci sie aktualizowac tabele, z ktorych powstal widok.
To moze wystarczy jakas regula INSTEAD OF na widoku.

5

Odp: Widok i aktualizacja rekordów

Dokładnie tak smile Ale nie wiem jak napisać taki INSTEAD OF, nie mogę nigdzie znaleźć żadnego przykładu proszę o jakąś podpowiedź. Pozdrawiam

6

Odp: Widok i aktualizacja rekordów

Jak podasz strukture tabel i definicje widoku to sprobujemy cos wykombinowac wink

7

Odp: Widok i aktualizacja rekordów

Tabela nr_1 :

CREATE TABLE klienci
(
  nr_klienta numeric(9) NOT NULL,
  adres1 character varying(35),
  adres2 character varying(35),
  nazwa1 character varying(35),
  nazwa2 character varying(35),
  nr_telefonu numeric(12),
  pesel1 numeric(11),
  pesel2 numeric(11),
  nr_dowodu1 character varying(9),
  nr_dowodu2 character varying(9),
  nip1 numeric(10),
  nip2 numeric(10),
  firma boolean DEFAULT false,
  CONSTRAINT kilenci_pk PRIMARY KEY (nr_klienta)
)

Tabela nr_2 :

CREATE TABLE umowy
(
  nr_umowy serial NOT NULL,
  usluga character varying(3) NOT NULL,
  nr_pakietu integer NOT NULL,
  charakt character varying(1) NOT NULL,
  budynek numeric(5) NOT NULL,
  mieszk numeric(3) NOT NULL,
  a character(1),
  nr_klienta numeric(9) NOT NULL,
  data_podpisania date NOT NULL DEFAULT '1000-02-15'::date,
  data_zakonczenia date,
  data_podlaczenia date,
  data_zawieszenia date,
  data_odwieszenia date,
  czasowa boolean NOT NULL DEFAULT false,
  rabat numeric(3,2) DEFAULT 0,
  uwagi text,
  pc_mac character varying(17),
  oplata numeric(8,2) DEFAULT 0,
  CONSTRAINT numer_umowy_pk PRIMARY KEY (nr_umowy),
  CONSTRAINT "numer klienta" FOREIGN KEY (nr_klienta)
      REFERENCES klienci (nr_klienta) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT "numer_pakietu_usługa" FOREIGN KEY (usluga, nr_pakietu)
      REFERENCES pakiety (usluga, nr_pakietu) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

Widok :

CREATE OR REPLACE VIEW umowy_klienci AS
SELECT umowy.nr_umowy, umowy.usluga, umowy.nr_pakietu, umowy.charakt, umowy.budynek, umowy.mieszk, umowy.a, umowy.nr_klienta, umowy.oplata, umowy.data_podpisania, umowy.data_zakonczenia, umowy.data_podlaczenia, umowy.data_zawieszenia, umowy.data_odwieszenia, umowy.czasowa, umowy.rabat, umowy.uwagi, umowy.pc_mac, klienci.adres1, klienci.adres2, klienci.nazwa1, klienci.nazwa2, klienci.nr_telefonu, klienci.pesel1, klienci.pesel2, klienci.nr_dowodu1, klienci.nr_dowodu2, klienci.nip1, klienci.nip2, klienci.firma
   FROM umowy
   JOIN klienci ON umowy.nr_klienta = klienci.nr_klienta;

Wygląda to tak.

Zdefiniowałem sobie taką regułę :

CREATE OR REPLACE RULE umowy_klienci AS
    ON UPDATE TO umowy_ceny_klienci_uslugi DO INSTEAD  UPDATE umowy SET rabat = new.rabat, oplata = new.oplata idt...
  WHERE umowy.nr_umowy = old.nr_umowy;

Ale coś z aplikacji wykracza się (procedurą Query.edit, post, commit), z poziomu SQL działa dobrze.

Tylko z aplikacji drze się i sypie błędami;

Ostatnio edytowany przez Rady (2009-02-10 04:07:57)

8

Odp: Widok i aktualizacja rekordów

W takim razie to problem aplikacji. Jakis konkretny komunikat bledu?

9

Odp: Widok i aktualizacja rekordów

Komunikat że pole "a" (to jedno z pól widoku) jest wymagane a nie podane;