Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: procedura składowana SQL - prośba o pomoc
Forum PHP.pl > Forum > Bazy danych
donkosiorro
Witam.
Mam pytanie w jaki sposob ułożyc procedurę skladowaną która po dodaniu transakcji sprzedaży produktu pomniejszy mi jego ilość z innej tabeli o tyle ile zostało "sprzedanych " sztuk?

Jaśniej chodzi o to ze jak w tabeli TRANSAKCJA dodam rekord gdzie odwołam się do klucza obcego do tabeli STANY_MAGAZYNOWE i zatwierdze to zmiejszy mi sie w tabeli STANY MAGAZYNOWE w atrybucie ilosć właśnie ilosc tego produktu o 1

bede wdzięczny za info

pozdrawiam
kartin
W wyzwalaczu AFTER INSERT dla tabeli TRANSAKCJA wystarczy zrobić UPDATE tabeli STANY MAGAZYNOWE zmniejszając stan odpowiedniego produktu o ilość w dodanym wierszu. Coś w tego rodzaju:
  1. CREATE TRIGGER aktualizacjaStanu
  2. AFTER INSERT ON TRANSAKCJA FOR EACH ROW
  3. BEGIN
  4. UPDATE `STANY MAGAZYNOWE`
  5. SET stan = stan - NEW.ilosc
  6. WHERE idProduktu = NEW.idProduktu;
  7. END;
donkosiorro
ciagle dostaje komunikat - Incorrect syntax near 'After'. :/


przyznaje że nie ogarniam tego za bardzo. teoria ok ale jeżeli przychodzi pisać kod to właśnie wygląda to tak jak wygląda
kartin
Taki komunikat błędu to pojawia się w bazie od mikromiękkiego. Trzeba było od razu pisać, że ma być w Transact-SQL. Składnię masz w dokumentacji. Zamiast używania NEW jak w przykładzie który podałem musisz skorzystać z tabeli inserted.
Ogólnie to będzie coś takiego:
  1. CREATE TRIGGER aktualizacjaStanu
  2. ON TRANSAKCJA
  3. AFTER INSERT AS
  4. BEGIN
  5. -- tutaj zapytanie UPDATE
  6. END
  7. GO
donkosiorro
nic z tego. Trigger owszem tworzy się ale po dodatniu transakcji ilosc w tabeli stany magazynowe zmienia się w każdym produkcie i to do tego na dziwne liczby np z minusem itd. nie wiem o co kaman
kartin
Wygląda, że masz 2 błędy w zapytaniu UPDATE. Jeden przy ustawianiu wartości, a drugi przy WHERE. Pokaż co napisałeś.
donkosiorro


coś takiego ale teraz wygląda na to że jest ok. wpisując do tabelfi FakturaTransakcja id produktu aktualizuje się jego liczba w tabeli stany magazynowe
Kod jest troszke inny niż sugerowałeś bo tez struktura tabeli jest troszke inna i NIBY działa aczkolwiek czy jest to optymalne rozwiązanie - nie wiem


CODE

CREATE TRIGGER [dbo].[TRIGGER_aktualizacjaStanu]
ON [dbo].[FakturaTransakcja]
AFTER INSERT AS
BEGIN
UPDATE StanyMagazynowe SET Ilosc -= 1 WHERE IdProduktu = IdProduktu
END

GO
mmmmmmm
  1. CREATE TRIGGER [dbo].[TRIGGER_aktualizacjaStanu]
  2. ON [dbo].[FakturaTransakcja]
  3. AFTER INSERT AS
  4. BEGIN
  5. UPDATE StanyMagazynowe SET Ilosc = Ilosc - 1 WHERE IdProduktu = inserted.IdProduktu
  6. END

Ale i tak jest to bez sensu...
ZAWSZE pomniejszasz o JEDEN?
donkosiorro
Tzn zawsze o jeden z tego względu że tabela FakturaTransakcja składa się z atrybutów:
- klucza głownego i
- Idproduktu
- iduslugi
- ceny

przyjalem dziwne zalozenie ze jedna transakcja może obejmować tylko jedną usluge i/lub jeden produkt
Nie bardzo wiem jak miala by wygladac tabela ktora umozliwia wybieranie kilku produktów po idproduktu w ramach jednej transakcji i odejmowanie ich pozniej z tabeli StanyMagazynowe

niestety



wyglada to tak ze tabela fakturaTransakcja połaczona jest z tabelą Produkt i tabelą Usługa i w FakturaTransakcja znajdują sie klucze obce z tabel Produkt i Usluga.
Jak można inaczej rozwiązać problem tego aby kilka produktów lub uslug mogło znajdować się w tabeli fakturaTransakcja?

dzieki za info
mmmmmmm
Bardziej chodzilo mi o to, że kupując np 10 bułek, nie rozbijasz tego na 10 transakcji, tylko na jedną, w której zapisujesz 10 sztuk.
donkosiorro
tak i teraz to wydaje się oczywiste dla mnie z tym ze jak mozna teraz przerobić takie tabele lub jaki jest sposób rozwiązania tego właśnie problemu?
jak sądzisz?
mmmmmmm
Pokaz DDL-e
donkosiorro
CODE
CREATE TABLE [dbo].[FakturaTransakcja](
[IdFakturaTransakcja] [int] IDENTITY(1,1) NOT NULL,
[IdUsługi] [int] NULL,
[IdProduktu] [int] NULL,
[IdFaktury] [int] NULL,
[Wartosc] [decimal](6, 2) NOT NULL,
[Rabat] [decimal](6, 2) NULL,
CONSTRAINT [PK_FakturaTransakcja] PRIMARY KEY CLUSTERED




CODE
CREATE TABLE [dbo].[StanyMagazynowe](
[IdStanyMagazynowe] [int] IDENTITY(1,1) NOT NULL,
[IdMagazynu] [int] NOT NULL,
[IdDostawy] [int] NOT NULL,
[IdProduktu] [int] NOT NULL,
[Ilosc] [int] NOT NULL,
[DataWygenerowania] [date] NOT NULL,
CONSTRAINT [PK_StanyMagazynowe] PRIMARY KEY CLUSTERED




taka jest struktura tych dwóch tabel o ktore chodzi
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.