2011-07-08 15 views
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の場合、これは真です。オペレーティングシステムの年を変更して、年の変更をシミュレートします。これによると、私はトリガーが正しく働いていないと推測します。しかし、なぜ私は考えていない。

答えて

0

トリガーで問題が1件しか表示されない場合は@out = NULLの代わりに@out IS 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$$ 

それはあなたのために働く場合はお知らせ。

関連する問題