Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem ze stworzeniem trigger'a
Forum PHP.pl > Forum > Bazy danych > MySQL
MitS
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
Mchl
A dlaczego nie wpisać od razu poprawnych danych przy insercie?

FLOAT na ceny to zły pomysł. Lepiej używać DECIMAL
MitS
tzn można nie mniej jednak chciałbym zobaczyć jak taką operację zrobić by na jej podstawie mógł robić podobne.
Mchl
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;
phpion
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.)
Mchl
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);
MitS
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 ?
Mchl
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.
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.