Forum Użytkownikow Subiekt GT
InsERT GT => Subiekt GT => Wątek zaczęty przez: vodnik w Styczeń 20, 2024, 12:00:32
-
Cześć,
Próbuję zrobić kod do MS SQL Server Management Studio, aby:
- w przypadku tworzenia, zaktualizowania, lub usunięcia danych z "Uwagi" na Dokumentach (akurat WZv) oraz "Zaliczek" kopiował je od razu do określonych Pól Własnych.
Próbuję to zautomatyzować przez Trigger. Ale wyskakuje mi błąd "Msg 207, Level 16, State 1, Procedure KopiaZaliczkaUwagi, Line 40 Invalid column name 'dok_Id'."
Różnie już kombinuję, ale zawsze to samo. Dopisuję w różnych miejscach "dbo." i "dok__Dokument." do nazw, ale dalej twierdzi że błędna nazwa, mimo że te obok jest ok.
Pomoże ktoś zasugerować co zmienić, dopisać?
CREATE TRIGGER KopiaZaliczkaUwagi
ON dok__Dokument
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @uwagi NVARCHAR(255);
IF EXISTS (SELECT *
FROM Inserted
WHERE dok_Id IS NOT NULL)
BEGIN
UPDATE pw_Dane
SET pwd_Tekst01 = (
SELECT dok_Uwagi
FROM Inserted)
WHERE pwd_IdObiektu = (
SELECT dok_Id
FROM Inserted);
IF LEN((
SELECT dok_Uwagi
FROM Inserted)) > 255
BEGIN
UPDATE pw_Dane
SET pwd_Tekst01 = LEFT(
(
SELECT dok_Uwagi
FROM Inserted), 255)
WHERE pwd_IdObiektu = (
SELECT dok_Id
FROM Inserted);
END;
UPDATE pw_Dane
SET pwd_Kwota02 = (
SELECT nzf_Wartosc
FROM nz__Finanse
WHERE dok_Id = nzf_IdDokumentAuto AND nzf_Wartosc IS NOT NULL);
END;
IF EXISTS (SELECT *
FROM Deleted
WHERE dok_Id IS NOT NULL)
BEGIN
UPDATE pw_Dane
SET pwd_Tekst01 = NULL
WHERE pwd_IdObiektu = (
SELECT dok_Id
FROM Deleted);
UPDATE pw_Dane
SET pwd_Kwota02 = NULL
WHERE pwd_IdObiektu = (
SELECT dok_Id
FROM Deleted);
END;
END;
-
Ja tu widzę 2 błędy, tak na szybko.
1. Aktualizujemy pw_Dane na podstawie nz_Finanse, więc skąd w tym poleceniu się bierze dok_Id?
SELECT nzf_Wartosc
FROM nz__Finanse
WHERE dok_Id = nzf_IdDokumentAuto AND nzf_Wartosc IS NOT NULL
2.
Trigger jest zaprojektowany dla przypadku kiedy inserted i delete mogą mają 1 rekord, co nie musi być prawdą, a wtedy ten trigger poleci z błędem.
-
Pisząc w tym update samo dok_Id odwołujesz się to tabeli pw_dane a tam nie ma takiej kolumny. Zamień na subquery tak samo jak zrobiłeś z
SELECT dok_Uwagi FROM Inserted
A tak poza tym to masz potężne bugi w całości tego triggera. Zacznijmy od tabeli pw_dane. Te tabele zawierają pola własne nie tylko dla faktur. Kontrahenci, towary, masa innych dokumentów w związku z czym identyfikatory w kolumnie pwd_IdObiektu mają prawo nie być unikalne. Żeby tego uniknąć trzeba dopisać warunek na typ obiektu - kolumna pwd_TypObiektu, dla faktur -2.
To samo tyczy się tabeli dok__Dokument - tam jest pierdyliard typów: faktury zakupu, sprzedaży, korekty sprzedaży, zakupu, paragony, zwroty, PZ, WZ, RW, PW, MM i to wszystko ma jeszcze podtypy. W ogóle nie sprawdzasz typu dodawanego ani usuwanego dokumentu.
A wisienką na to torcie jest ostatni update pw_dane, który nie zawiera żadnego warunku where (np. pwd_IdObiektu) co oznacza, że za każdym odpaleniem triggera przeora ci całą tabelę.
Zajrzyj do dokumentacji tabel bo zrobisz sobie straszne kuku. F1 -> wyszukaj -> Opis struktury zbiorów danych. Mam nadzieję, że eksperymentujesz na kopii bazy albo na podmiocie demo.
Do przeglądania danych w pojedynczych tabelach i wygodnego oglądania danych pojedynczych wierszy (możliwość "obracania" wierszy do kolumn) świetnie nadaje się DBeaver.