2015-06-06 3 views
1

У меня есть 3 стола: Venta, Factura, Producto. Поэтому я пытаюсь создать Trigeer, который вставляет значения в таблицу «Factura» и удваивает значение «Producto» при вставке в Venta. Это мой первый триггер, и я не знаю, что я делаю неправильно, я думаю, может быть, я не понимаю, как объявлять переменные? Я буду признателен за любой свет.Mysql Trigger multiple stat

  • Я изменил код, как я понял. Теперь я получаю синтаксическую ошибку в строке, это инструкция UPDATE. Кстати, столы являются:

mysql> describe Producto; 
 
+------------+--------------+------+-----+---------+-------+ 
 
| Field  | Type   | Null | Key | Default | Extra | 
 
+------------+--------------+------+-----+---------+-------+ 
 
| Cod_Prod | varchar(8) | NO | PRI | NULL |  | 
 
| Nom_Prod_P | varchar(16) | NO |  | NULL |  | 
 
| Precio_P | decimal(9,2) | NO |  | NULL |  | 
 
| Cantidad_P | int(6)  | NO |  | NULL |  | 
 
+------------+--------------+------+-----+---------+-------+ 
 
4 rows in set (0.00 sec) 
 

 
mysql> describe Venta; 
 
+--------------+--------------+------+-----+---------+-------+ 
 
| Field  | Type   | Null | Key | Default | Extra | 
 
+--------------+--------------+------+-----+---------+-------+ 
 
| id_Venta  | varchar(9) | NO | PRI | NULL |  | 
 
| Fecha_V  | date   | NO |  | NULL |  | 
 
| Nom_Cli_V | varchar(24) | NO |  | NULL |  | 
 
| Rut_Cli_V | varchar(12) | NO |  | NULL |  | 
 
| Dir_Cli_V | varchar(16) | NO |  | NULL |  | 
 
| Nom_Prod_V | varchar(16) | NO |  | NULL |  | 
 
| Precio_V  | decimal(9,2) | NO |  | NULL |  | 
 
| Cant_Prod_V | int(6)  | NO |  | NULL |  | 
 
| Forma_Pago_V | varchar(12) | NO |  | NULL |  | 
 
+--------------+--------------+------+-----+---------+-------+ 
 
9 rows in set (0.00 sec) 
 

 
mysql> describe Factura; 
 
+--------------+--------------+------+-----+---------+----------------+ 
 
| Field  | Type   | Null | Key | Default | Extra   | 
 
+--------------+--------------+------+-----+---------+----------------+ 
 
| Num_Fac  | int(11)  | NO | PRI | NULL | auto_increment | 
 
| Fecha_F  | date   | NO |  | NULL |    | 
 
| Nom_Cli_F | varchar(24) | NO |  | NULL |    | 
 
| Rut_Cli_F | varchar(12) | NO |  | NULL |    | 
 
| Dir_Cli_F | varchar(16) | NO |  | NULL |    | 
 
| Nom_Prod_F | varchar(24) | NO |  | NULL |    | 
 
| Cant_Prod_F | int(6)  | NO |  | NULL |    | 
 
| Neto   | decimal(9,2) | NO |  | NULL |    | 
 
| IVA   | decimal(9,2) | NO |  | NULL |    | 
 
| Total  | decimal(9,2) | NO |  | NULL |    | 
 
| Forma_Pago_F | varchar(12) | NO |  | NULL |    | 
 
+--------------+--------------+------+-----+---------+----------------+ 
 
11 rows in set (0.00 sec)

DELIMITER $$ 
 
CREATE TRIGGER Genera_Factura_Before 
 
    BEFORE INSERT 
 
    ON TuOficina.Venta 
 
    FOR EACH ROW 
 
BEGIN 
 
    DECLARE calc_iva decimal(9,2); 
 
    DECLARE calc_neto decimal(9,2); 
 
    DECLARE gran_total decimal(9,2); 
 
    DECLARE prod_descuento int(6); 
 

 
SET calc_neto = new.Precio_V * new.Cant_Prod_V; 
 
SET calc_iva = calc_neto/0.19; 
 
SET gran_total = calc_neto + calc_iva; 
 
SET prod_descuento = new.Cant_Prod_V - Cantidad_P; 
 

 
INSERT INTO Factura(Fecha_F, Nom_Cli_F, Rut_Cli_F, Dir_Cli_F, Nom_Prod_F, Cant_Prod_F, Neto, IVA, Total, Forma_Pago_F) VALUES (Fecha_V, new.Nom_Cli_V, new.Rut_Cli_V, new.Dir_Cli_V, new.Nom_Prod_V, new.Cant_Prod_V, calc_neto, calc_iva, gran_total, new.Forma_Pago_V); 
 

 
UPDATE Producto SET Cantidad_P = prod_descuento WHERE Nom_Prod_P = new.Nom_Prod_P; 
 
END$$

ответ

0

Несколько вопросов выделяются сразу ...

В MySQL числовой литерал , символ десятичной точки должен быть периодом (точкой) n от запятой.

SET iva = neto/0,19 ; 
        ^

В триггере INSERT, не существует OLD. значения для столбца в таблице. Это справедливо только в триггере UPDATE или DELETE.

SET prod_descuento = new.Cant_Prod_V - old.Cant_Prod_P; 
             ^^^^ 

Также будьте осторожны с столбцами и переменными с тем же именем в контексте инструкции SQL. Когда его возможная ссылка может быть связана с переменной или столбцом, MySQL решит ссылку на столбец.

+0

Большое спасибо за ваш ответ, я изменил то, что вы комментируете, все еще получил еще одну ошибку, связанную с синтаксисом mysql. Я буду продолжать смотреть. –

+0

Хорошо, я получаю это. Я понял, что у меня есть значения, такие как «iva» и «neto», используя одно и то же имя имен столбцов. Теперь я получаю: «# 1235 - эта версия MySQL еще не поддерживает« несколько триггеров с одинаковым временем действия и событием для одной таблицы ». Я думаю, это потому, что я делаю INSERT и UPDATE в одном и том же триггере. Я поделюсь с вами, если найду решение. –

+0

Эта ошибка означает, что триггер «ПЕРЕД НАЧАЛОМ» определен в таблице при попытке создать новый триггер «ПЕРЕД НАЧАЛОМ» в той же таблице. Прежде чем создавать новый, вам нужно отказаться от существующего. – spencer7593