如何生成发票号如下:
Invoice Number = MC1200001
MC : Company name
12 : current year (Flexibel)
00001 : auto increment (Flexibel - auto increment and will reset to 00001 again if year is 2013)
Run Code Online (Sandbox Code Playgroud)
预期结果 :
current year 2012 :
MC1200001
MC1200002
MC1200003
.....
year 2013
MC1300001
MC1300002
MC1300003
.....
Run Code Online (Sandbox Code Playgroud)
需要你的想法或解决这个问题的方法.
谢谢.
您可以使用三列来表示数字的不同部分,并使用视图或简单的CONCAT表达式来获取每张发票的整个数字.
然后,要获得一个新数字,您将使用一个函数插入一个记录,该函数将返回实际的行ID或连接数.
我会做这样的事情:(为了简洁而留下领先的零)
DROP TABLE IF EXISTS invoces;
CREATE TABLE invoices (
id INT NOT NULL UNIQUE AUTO_INCREMENT
,company CHAR(2)
,number INT
,fiscal_year INT
, PRIMARY KEY (company, number, fiscal_year)
);
DROP PROCEDURE IF EXISTS spCreateInvoice;
DELIMITER $$
CREATE PROCEDURE spCreateInvoice
(
pCompany CHAR(2)
,pFiscalYear INT
)
BEGIN
INSERT INTO invoices (
company, fiscal_year, number
) SELECT
pCompany
, pFiscalYear
, 1+MAX(number)
FROM invoices
WHERE
fiscal_year=pFiscalYear;
SET @id = LAST_INSERT_ID();
SELECT CONCAT(i.company, i.number, i.fiscal_year) invoice_number, i.* from invoices i WHERE id = @id;
END;
$$
DELIMITER ;
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
Run Code Online (Sandbox Code Playgroud)
您可以将其作为针对mysql测试数据库的脚本运行,并查看以下输出:
invoice_number id company number fiscal_year
MC012 1 MC 0 12
invoice_number id company number fiscal_year
MC112 2 MC 1 12
invoice_number id company number fiscal_year
MC212 3 MC 2 12
invoice_number id company number fiscal_year
MC312 4 MC 3 12
invoice_number id company number fiscal_year
MC013 5 MC 0 13
invoice_number id company number fiscal_year
MC113 6 MC 1 13
invoice_number id company number fiscal_year
MC213 7 MC 2 13
invoice_number id company number fiscal_year
MC313 8 MC 3 13
Run Code Online (Sandbox Code Playgroud)