1
私は、請求書番号を生成する必要があるトリガーとプロシージャを持っています。数字のMySQLのトリガー/プロシージャが動作しない
例(形式:タイプ/数/月/年):
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, '');
私は新しい請求書を作成しようと、私はその番号フィールドをすることができないというエラーを取得しますnullの場合、これは真です。オペレーティングシステムの年を変更して、年の変更をシミュレートします。これによると、私はトリガーが正しく働いていないと推測します。しかし、なぜ私は考えていない。