Lorem Ipsum 只是印刷和排版行业的虚拟文本。 Lorem Ipsum 已经成为行业标准虚拟文本 10

问题描述 投票:0回答:2

Lorem Ipsum 只是印刷和排版行业的虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是行业标准的虚拟文本,当时一位不知名的印刷商拿走了一堆字体并将其打乱以制作一本字体样本簿。它不仅经历了五个世纪的考验,而且跨越了电子排版的时代,基本保持不变。它在 20 世纪 60 年代随着包含 Lorem Ipsum 段落的 Letraset 表的发布而流行起来,最近又随着包含 Lorem Ipsum 版本的 Aldus PageMaker 等桌面出版软件而流行。

openai-api
2个回答
3
投票

扩展@Marius的答案,我会使用触发器让MySQL自动设置发票号码,如下所示:

DELIMITER $$

CREATE TRIGGER bi_invoices_each BEFORE INSERT ON invoices FOR EACH ROW
BEGIN
  DECLARE lastest_invoice_number VARCHAR(20);
  DECLARE numberpart INTEGER;

  -- find lastest invoicenumber in the current year.
  SELECT COALESCE(max(invoicenumber),0) INTO lastest_invoice_number 
  FROM invoice 
  WHERE invoice_date >= MAKEDATE(YEAR(NEW.invoice_date)  ,1) 
    AND invoice_date <  MAKEDATE(YEAR(NEW.invoice_date)+1,1);

  -- extract the part before the '-'
  SET numberpart = SUBSTRING_INDEX(lastest_invoice_number,'-',1)

  SET NEW.invoicenumber = CONCAT(numberpart+1,'-',YEAR(NEW.invoice_date));
END $$

DELIMITER ;

请注意,您无法在

before
触发器中访问自动递增的 id;
只有在
after
触发器中才能执行此操作,但在那里您无法更改任何值,因此需要一些技巧。
使用了更多技巧来确保我们在选择查询中使用
invoice_date
,以便可以使用该字段上的索引。

参见:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_makedate


3
投票

您可以在发票表中拥有一个带有

id
的单独
auto_increment
列,以及使用以下公式填充
prog_n
的触发器:

prog_n = id - select max(id) from invoices where year = current_year - 1

这样,您的

prog_n
每年都会自动重置,而无需手动执行。但是,如果您在表中插入大量发票,可能会出现性能问题,但我认为实际上不会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.