Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem ze stworzeniem trigger'a
MitS
post 24.11.2009, 22:13:37
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ę:
  1. CREATE TABLE IF NOT EXISTS `mydb`.`invoiceItems` (
  2. `id` INT(11) NOT NULL ,
  3. `idInvoice` INT(11) NOT NULL ,
  4. `name` CHAR(200) NOT NULL ,
  5. `jm` CHAR(10) NOT NULL DEFAULT 'godz' ,
  6. `pkwiu` CHAR(20) NULL ,
  7. `count` TINYINT(3) NOT NULL DEFAULT 1 COMMENT 'ilość' ,
  8. `priceNetto` FLOAT NOT NULL DEFAULT 0.00 COMMENT 'cena netto' ,
  9. `amountNetto` FLOAT NOT NULL DEFAULT 0.00 COMMENT 'kwota netto' ,
  10. `rateVat` TINYINT(2) NOT NULL DEFAULT 22 COMMENT 'stawka vat' ,
  11. `priceVat` FLOAT NOT NULL DEFAULT 0.00 COMMENT 'kwota vat' ,
  12. `priceBrutto` FLOAT NOT NULL DEFAULT 0.00 ,
  13. PRIMARY KEY (`id`, `idInvoice`) ,
  14. INDEX `fk_invoiceItems_invoices1` (`idInvoice` ASC) ,
  15. CONSTRAINT `fk_invoiceItems_invoices1`
  16. FOREIGN KEY (`idInvoice` )
  17. REFERENCES `mydb`.`invoices` (`id` )
  18. ON DELETE NO ACTION
  19. ON UPDATE NO ACTION)
  20. ENGINE = InnoDB
  21. DEFAULT CHARACTER SET = utf8
  22. COLLATE = utf8_general_ci


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
Go to the top of the page
+Quote Post
Mchl
post 24.11.2009, 22:57:53
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
Go to the top of the page
+Quote Post
MitS
post 24.11.2009, 23:53:55
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.
Go to the top of the page
+Quote Post
Mchl
post 25.11.2009, 09:14:43
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;
Go to the top of the page
+Quote Post
phpion
post 25.11.2009, 10:14:01
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.)
Go to the top of the page
+Quote Post
Mchl
post 25.11.2009, 10:34:23
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
Go to the top of the page
+Quote Post
MitS
post 25.11.2009, 21:43:22
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 smile.gif
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 ?
Go to the top of the page
+Quote Post
Mchl
post 25.11.2009, 22:07:43
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.
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: 14.08.2025 - 01:42