Forum QGIS

Pełna wersja: autouzupełnianie
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Czy jest taka możliwość żeby w atrybutach zapisywała się data ostatniej edycji obiektu?
Cześć,

Ja przyłączam się do wątku. Nie wiem jak to zrobić ale może to się przyda.

W QGIS jest funkcja now() dzięki której pobieramy dane o dacie.
Mam małe pytanie. Czy da się ustawić dla nowej kolumny pewną wartość.
Czyli tworzę nową kolumnę data_zmiany (type:data) i ustawiam aby domyślnie dla data_zmiany = now().
W shapefile łatwo da się to zrobić dodając nowe pole, nazwijmy je "dt", ustawiając typ jako Date (jeśli chcemy samą datę), lub Text (jeśli chcemy datę i czas - wtedy długość pola należy ustawić tak, żeby nam odpowiadało, czyli w zależności od formatu zapisu daty i czasu, jaki chcemy uzyskać, domyślnie proponuję 20 Wink ).

Potem w QGIS, we właściwościach warstwy, wystarczy ustawić rodzaj edytora dla tego pola jako "Data/czas", jak na rysunkach poniżej.
[attachment=301]
[attachment=300]

Ustawienia można zostawić domyślne, można też w zależności od potrzeb wybrać sobie format zapisu czasu, i tak dalej.

Po postawieniu jakiegoś punktu, zakończeniu edycji jakiejś linii bądź poligonu, pole powinno samo się uzupełnić z aktualną datą.
Przy dodawaniu nowego obiektu ta funkcja działa. Niestety przy edycji już istniejącego nie działa.
Właśnie też to zauważyłem,

Wartość w polu daty zmienia się tylko wtedy, gdy zostanie odpalony formularz, dopiero wtedy dana zostaję zaktualizowana, ale tylko wtedy gdy kolumna ma wartość NULL w przypadku gdy chcemy zastąpić istniejącą wartość nie działa
No, to właściwie szybkim i dosyć prostym rozwiązaniem będzie skorzystanie z PostGISa. Wgraj tabelę do bazy, a potem wystarczy dodać kolumnę przez:
Kod:
ALTER TABLE twoja_tabela
ADD COLUMN modified timestamp default current_timestamp;
To polecenie dodało kolumnę "modified" do Twojej tabeli, która co prawda będzie zapisywać aktualny czas, ale tylko dla nowotworzonych obiektów.

Żeby pole to miało informację o ostatniej edycji obiektu, trzeba jeszcze poniższe funkcje wywołać.
Kod:
CREATE OR REPLACE FUNCTION update_modified_column()    
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW;    
END;
$$ language 'plpgsql';

A potem taki "trigger" (nie wiem jak i czy słówko "trigger" tłumaczy się na polski...):
Kod:
CREATE TRIGGER update_edit_modtime BEFORE UPDATE ON twoja_tabela FOR EACH ROW EXECUTE PROCEDURE update_modified_column();
który stworzy działanie wywołujące funkcję, która jest opisana wyżej [czyli update_modified_column()].

Sprawdziłem u siebie, działa. A pewnie i mi się przyda w przyszłości Smile
Trigger po polsku w pgAdminie to wyzwalacz Wink
Do definicji dodałbym INSERT czyli
CREATE TRIGGER update_edit_modtime BEFORE INSERT OR UPDATE ON twoja_tabela FOR EACH ROW EXECUTE PROCEDURE update_modified_column();
aby postgresql dodawał datę stworzenia (insert) obiektu a nie tylko aktualizacji (update).
Pozdrawiam!
A nie jest tak, że przy tworzeniu automatycznie to zrobi ze względu na typ pola i rodzaj danych (timestamp)?
Pytam, bo nie wiem (ciągle się douczam tego Postgresa) Smile A podczas testowania tego rozwiązania automatycznie uzupełniało mi daty w nowotworzonych obiektach.
Być może dla timestamp tak działa (nie testowałem) ale takiego triggera wykorzystywać można do autouzupełniania wielu innych danych więc warto pamiętać aby był wyzwalany również przy insercie.
Pozdrawiam!
Odkopuję temat, bo właśnie pojawiła się nowa wtyczka, która pozwala na autouzupełnianie przeróżnych opcji. AutoFields Plugin [1] - bez potrzeby zaprzęgania PostGISa Wink

Przykładowy filmik [2] z rozwiązaniem problemu z tego tematu - timestamps Smile

-----------
[1] - http://geotux.tuxfamily.org/index.php/ge...n-for-qgis
[2] - https://vimeo.com/178984647