Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z Trigger'em
Niktoś
post 26.05.2012, 21:34:04
Post #1





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Nie za wiele działałem z triggerami i mam problem.
Ułożyłem takiego triggera:
  1. CREATE TRIGGER tr_UpdTabele
  2. ON Platnosci
  3. AFTER UPDATE
  4. AS
  5.  
  6. IF NOT UPDATE(zaplacono)
  7. RETURN
  8.  
  9. IF EXISTS (SELECT *
  10. FROM inserted a
  11. JOIN deleted b ON a.IdPlat=b.IdPlat
  12. WHERE b.zaplacono <> 1 AND
  13. a.zaplacono = 1)
  14. BEGIN
  15. DECLARE @NazwaSklepu nvarchar(50);
  16. DECLARE @NazProduktu nvarchar(50);
  17. Declare @TypSklepu nvarchar(50);
  18. Declare @Suma int;
  19.  
  20.  
  21. SET @TypSklepu=(SELECT t.TypSklepu
  22. FROM inserted a
  23. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  24. WHERE b.zaplacono <> 1 AND
  25. a.zaplacono = 1)
  26. SET @NazProduktu=(SELECT t.NazwaTowaru
  27. FROM inserted a
  28. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  29. WHERE b.zaplacono <> 1 AND
  30. a.zaplacono = 1)
  31. SET @Suma=( SELECT SUM(t.Ilosc) FROM Finanse t JOIN inserted f ON t.IDkl=f.IdKl AND t.IdKlient=f.numtKlienta WHERE t.NazwaTowaru=@NazProduktu AND f.zaplacono=1 GROUP BY t.NazwaTowaru)
  32. UPDATE [@TypSklepu] SET iloscSprzedanych=iloscSprzedanych+@Suma WHERE NazwaProduktu=@NazProduktu;
  33. END
  34. go


Trigger ma za zadanie zrobić update na danej tabli ,kiedy zostaje wykonany update na tabeli gdzie ustawiony jest ten triger.
Po dokonaniu płatności do tabeli płatności updatowana jest kolumna zaplacono(ustawiony status).
tabela jest powiązana z tabelą finanse ,gdzie są nazwy sklepu,przedmiotu, ilość zakupionych produktów,a ta zkolei powiązana jest z tabelą klient(to chyba mało ważne).Ważne są te dwie tabele finanse i płatności.
Po updatowaniu chciałem użyć wyzwalacza który by zliczył ilość wszystkich zakupionych przedmiotów o konkretnej nazwie ze statusem zakupiono i updatować całkiem inną /inne tabele [@TypSklepu].Użyłem parametru bo przedmioty mogą znajdować się w różnych tabelach o tej samej strukturze.
Tymczasem wyskoczyło mi internal server error (500).

Nie wiem czy w ogóle mogę tu użyć triggera. Wygląda to tak- dokonuje zakupu przykładowo rower,rolki,piłka zapisują się w tabeli finanse zaś wszelkie dane adresowe do tabeli klient, w osobnej tabeli płatności zapisuje się status.Te trzy tabele są w mniejszym lub większym stopniu ze sobą powiązane. Teraz dokonuję zapłaty za przedmiot i updatuje tabele płatności i bezpośredni w tabeli finanse dla każdego przedmiotu muszę zliczyć/sumować liczbę wszystkich które zostały zakupione.Nie mam pojęcia jak to fajnie rozwiązać, dlatego proszę o radę.Czy triger do tego się nadaje?

Ten post edytował Niktoś 26.05.2012, 22:01:05
Go to the top of the page
+Quote Post
Firebright
post 27.05.2012, 07:13:35
Post #2





Grupa: Zarejestrowani
Postów: 18
Pomógł: 3
Dołączył: 19.01.2011

Ostrzeżenie: (0%)
-----


Jeszcze nigdy nie widziałem takiej konstrukcji UPDATE [@zmienna] SET...
Być może żyje w nieświadomości ale na 99% właśnie to jest powodem twoich problemów, spróbuj zmienić tego update na coś takiego:
  1. DECLARE @sql varchar(4000)
  2. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @Suma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
  3. EXEC sp_executesql @sql

Więcej na ten temat znajdziesz w Google pod hasłem "MSSQL dynamic SQL".

Dodatkowo nie musisz pisać odrębnych SET'ów dla takich samych zapytań, spróbuj:
  1. SELECT @TypSklepu = t.TypSklepu, @NazProduktu = t.NazwaTowaru
  2. FROM inserted a
  3. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  4. WHERE b.zaplacono <> 1 AND
  5. a.zaplacono = 1


Powodzenia smile.gif.
Go to the top of the page
+Quote Post
Niktoś
post 27.05.2012, 23:33:31
Post #3





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Witaj twoje rozwiązanie wydaje się być lepsze, jednakże również nie działa.

Cytat
DECLARE @sql varchar(4000)

SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @Suma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'

EXEC sp_executesql @sql


Poczytałem trochę o EXEC() i o sp_executesql () i jak dobrze przeczytałem to wspiera typy tekstowe tylko (EXEC(8000)znaków-EXEC sp_executesql(4000).Tak więc wykonywanie pogrubionej u góry arytmetyki nie jest możliwe ze względu na niezgodność typów- wywala błąd o niemożliwości konwersji nvarchar na int.

  1. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + cast(@Suma AS nvarchar(50)) + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
jednakże sama kolumna iloscSprzedanych jest typu liczbowego.
Błędu nie wysypuje lecz nic się nie dzieje ,w ogóle nie updatuje sad.gif.
Hmm.Nie wiem już co może być nie tak, normalnie zgłupiałem.

Ten post edytował Niktoś 27.05.2012, 23:38:25
Go to the top of the page
+Quote Post
Firebright
post 28.05.2012, 08:06:19
Post #4





Grupa: Zarejestrowani
Postów: 18
Pomógł: 3
Dołączył: 19.01.2011

Ostrzeżenie: (0%)
-----


Jasne, masz rację, niestety już od dość dawna nie mam styczności z MSSQL i takie szczegóły się zacierają sad.gif.
Spróbuj tak, to powinno już problem rozwiązać:
  1. DECLARE @sql nvarchar(4000)
  2.  
  3. DECLARE @vSuma varchar(256)
  4. SET @vSuma = CAST(@Suma AS nvarchar(50))
  5.  
  6. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @vSuma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
  7.  
  8. EXEC sp_executesql @sql


Daj znać jak poszło.
Go to the top of the page
+Quote Post
Niktoś
post 2.06.2012, 21:13:49
Post #5





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Niestety coś nie działa, nie ma błedów lecz nie updatuje. Nie mogę znaleźć przyczyny tego powodu.Próbowałem jeszce kombinować ze złączeniami join usuwać pojedynczo lecz bez powodzenia.Być może przyczyną jest ,że nie znajduje żadnego rekordu, a że kolumna jest typu int to updatuje stary rekord w którym jest default 0, a więc updatuje to samo.
Cieżko wogóle stwierdzić , czy triger wykonuje polecenie lub nie.Spróbuje jeszce dodać qwerende z poleceniem is null i updatować do wartości 1 i zobaczyć czy triger wogóle działa.

Miej więcej wiem gdzie leży błąd ,tylko nie umiem z nim sobie poradzić:
Cytat
DECLARE @sql nvarchar(4000)

DECLARE @vSuma varchar(256)
SET @vSuma = CAST(@Suma AS nvarchar(50))

SET @sql = 'UPDATE [' + @TypSklepu + '] SET iloscSprzedanych=iloscSprzedanych+ ' + @vSuma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'

EXEC sp_executesql @sql


loscSprzedanych- musiałem zmienić typ kolumny z int na nvarchar aby updatowało- dodatkowo-wykonanie dodawania na tej samej kolumnie loscSprzedanych=iloscSprzedanych+ ' + @vSuma chyba nie zadziała dla typu nvarchar-nie wiem jak to rozwiązac.
Kolejny problem NazwaProduktu= ' + @NazProduktu + ';' - błąd inwalid kolumn name konik- z tym to już nie wiem o co chodzi , @NazProduktu="konik" ,który jest nazwą produktu(wartością), a nie nazwą kolumny.
Innymi słowy ,trigger updatuje do tak skonstruowanej kwerendy:
  1. SET @sql = 'UPDATE [' + @TypSklepu + '] SET iloscSprzedanych= ' + @vSuma + ';'


Tego chyba nie da rady zrobić w triggerze nie mogę znaleźć chocby jednego przykładu, hmm może z tego triggera przekazać parametry do funkcji i tam zrobić upload. Może ktoś ma jakieś wskazówki?

Ten post edytował Niktoś 2.06.2012, 22:40:17
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 03:43