Mysql触发多重统计

时间:2015-06-06 21:10:51

标签: mysql

我有3张桌子:Venta,Factura,Producto。因此,我正在尝试创建一个Trigeer,它在表“Factura”上插入值,并在插入Venta时在“Producto”上添加一个值。这是我的第一个触发器,我不知道我做错了什么,我想也许我不知道如何声明变量?我会对此表示赞赏。

  • 我已经按照我的理解修改了代码。现在我在de 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$$

1 个答案:

答案 0 :(得分:0)

有几个问题立即脱颖而出......

在MySQL数字文字中,小数点字符必须是句点(点)而不是逗号。

  SET iva = neto / 0,19 ;
                    ^

在INSERT触发器中,表中的列没有OLD.值。这仅在UPDATE或DELETE触发器中有效。

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

另外,请注意SQL语句上下文中具有相同名称的列和变量。当可能的引用可能是变量或列时,MySQL会将引用解析为列。