Autor Wątek: [MS SQL Server] Kopiowanie danych do poł własnych  (Przeczytany 649 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline vodnik

  • Nowy użytkownik
  • *
  • Wiadomości: 19
  • Reputacja +1/-0
  • Wersja programu: SGT 1.63 (lub nowsza), Sfera dla Subiekt GT, Manager SGT, S2S, Prestashop
[MS SQL Server] Kopiowanie danych do poł własnych
« dnia: 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;

Online candy

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4876
  • Reputacja +172/-11
[MS SQL Server] Kopiowanie danych do poł własnych
« Odpowiedź #1 dnia: Styczeń 20, 2024, 14:16:10 »
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.
« Ostatnia zmiana: Styczeń 20, 2024, 14:17:45 wysłana przez candy »
Nie pytaj co rząd może zrobić dla Ciebie. Spytaj czy mógłby tego nie robić.

Offline yemet

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 1250
  • Reputacja +46/-1
  • Wersja programu: Navireo
[MS SQL Server] Kopiowanie danych do poł własnych
« Odpowiedź #2 dnia: Styczeń 20, 2024, 14:33:21 »
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.
« Ostatnia zmiana: Styczeń 20, 2024, 14:37:24 wysłana przez yemet »

Forum Użytkownikow Subiekt GT

[MS SQL Server] Kopiowanie danych do poł własnych
« Odpowiedź #2 dnia: Styczeń 20, 2024, 14:33:21 »