我有一个触发器和程序,应该生成发票号。
数字示例(格式:类型/数字/月/年):
VAT/5/05/2011
VAT/6/05/2011
VAT/7/06/2011
使用year = YEAR(CURDATE())
插入发票时,只应增加整数。
但是,在插入新年发票时(1月1日),它应该生成新的发票号,而我的系统的这部分不起作用。
程序:
CREATE PROCEDURE generate_vat_number(out InvoiceNumber VARCHAR(50))
BEGIN
SELECT
CONCAT(
SPLIT_STR(Number, '/', 1),
'/',
COUNT(Number) + 1,
'/',
SPLIT_STR(Number, '/', 3),
'/',
YEAR(CURDATE())
)
INTO InvoiceNumber
FROM Invoices
WHERE
SPLIT_STR(Number, '/', 4) = YEAR(CURDATE())
LIMIT 1;
END$$
触发器:
CREATE TRIGGER add_invoice_number BEFORE INSERT ON Invoices
FOR EACH ROW BEGIN
CALL generate_vat_number(@out);
IF @out = NULL THEN
SET NEW.Number = CONCAT(SPLIT_STR(NEW.Number, '/', 1), '/', '1', '/', SPLIT_STR(NEW.Number, '/', 3), '/', YEAR(CURDATE()));
ELSE
SET NEW.Number = @out;
END IF;
END$$
用于拆分字符串的函数:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
当我尝试创建新发票时,我收到错误,说“数字”字段不能为空,这是真的。我正在改变我的操作系统年份以模拟年份变化。据此,我认为我的触发器无法正常工作。但是,我不知道为什么。
答案 0 :(得分:0)
我只能在触发器中看到一个问题,请尝试使用@out IS NULL
代替@out = NULL
。
更正了触发器:
CREATE TRIGGER add_invoice_number BEFORE INSERT ON Invoices
FOR EACH ROW BEGIN
CALL generate_vat_number(@out);
IF @out IS NULL THEN
SET NEW.Number = CONCAT(SPLIT_STR(NEW.Number, '/', 1), '/', '1', '/', SPLIT_STR(NEW.Number, '/', 3), '/', YEAR(CURDATE()));
ELSE
SET NEW.Number = @out;
END IF;
END$$
请告诉我们这是否适合您。