![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 262 Pomógł: 5 Dołączył: 8.02.2005 Skąd: Olsztyn / Zatorze Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie,
mam sobie tabelę:
mój problem polega na stworzeniu triggera, który by wykonywał i automatycznie aktualizował pola: amountNetto , priceVat, priceBrutto po zrobieniu wcześniej inserta do tej tabeli. Chodzi o proste działania matematyczne. Czy mógłby mi ktoś napisać jak powinien wyglądać taki trigger? Bo nie ukrywam że dopiero poznaje triggery i procedury i z przykłądów znalezionych w necie nie potrafię tego sklecić. Pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
A dlaczego nie wpisać od razu poprawnych danych przy insercie?
FLOAT na ceny to zły pomysł. Lepiej używać DECIMAL |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 262 Pomógł: 5 Dołączył: 8.02.2005 Skąd: Olsztyn / Zatorze Ostrzeżenie: (0%) ![]() ![]() |
tzn można nie mniej jednak chciałbym zobaczyć jak taką operację zrobić by na jej podstawie mógł robić podobne.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
No to jakoś tak:
Kod DELIMITER ||
CREATE TRIGGER invoiceItems_beforeInsert BEFORE INSERT ON invoiceItems FOR EACH ROW BEGIN SET NEW.amountNetto = NEW.count * NEW.priceNetto; SET NEW.priceVat = NEW.rateVat * NEW.amountNetto; SET NEW.priceBrutto= NEW.amountNetto + NEW.priceVat; END; || DELIMITER; |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Nie możesz napisać triggera, który będzie operował na tej samej tabeli, która jest aktualnie modyfikowana.
http://dev.mysql.com/doc/refman/5.0/en/faq...aitem-22-5-1-11 Cytat 22.5.11: Can triggers access tables?
A trigger can access both old and new data in its own table. A trigger can also affect other tables, but it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger. (Before MySQL 5.0.10, a trigger cannot modify other tables.) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Operować nie może, ale zmienne przed wstawieniem może zmodyfikować.
[edit] Przykład Kod DROP TABLE IF EXISTS `nvb`;
CREATE TABLE `nvb` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `netto` decimal(8,2) NOT NULL, `vat` decimal(2,2) NOT NULL, `brutto` decimal(8,2) NOT NULL DEFAULT '0.00', PRIMARY KEY (`ID`) ) ENGINE=InnoDB; DELIMITER || DROP TRIGGER nvb_beforeInsert || CREATE TRIGGER nvb_beforeInsert BEFORE INSERT ON nvb FOR EACH ROW BEGIN SET NEW.brutto = NEW.netto * (1 + NEW.vat); END; || DELIMITER; INSERT INTO nvb (netto,vat) VALUES (1,0.22); Ten post edytował Mchl 25.11.2009, 10:45:59 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 262 Pomógł: 5 Dołączył: 8.02.2005 Skąd: Olsztyn / Zatorze Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za przykład
![]() o to mi chodziło ... a tak na marginesie wyczytałęm gdzieś że trigger nie może operować na swojej tabeli ale procedura już tak ... czy mam racje ? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
A procedura ma "swoją" tabelę? Raczej nie.
Natomiast jeśli chcesz wywołać procedurę w triggerze, która zmodyfikuje tabelę na której jest on zdefiniowany, to podejrzewam, że nic z tego. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 01:42 |