我需要大批量生成发票,这些发票将转换为 EDI 并运送到我们的总部。有一个包含所有订单的订单表。一天中的某个时候,我必须拿一套(大约 1k)并生成发票。
- 哪里是生成发票编号的最佳位置?在 SQL Server 后端?或者将批次抓取到 .NET 应用程序中,然后在那里生成发票编号?发票编号可以是随机的,但不得重复(3-4 年)。我最多可以使用 12 位数字,并且可以是字母数字。在哪里可以找到有关生成发票编号的信息。
注意:当我生成发票时,我需要计算订单总额和税金。
我会很感激你的意见。
我需要大批量生成发票,这些发票将转换为 EDI 并运送到我们的总部。有一个包含所有订单的订单表。一天中的某个时候,我必须拿一套(大约 1k)并生成发票。
注意:当我生成发票时,我需要计算订单总额和税金。
我会很感激你的意见。
发票编号可能受法律要求的约束(我居住的地方它们需要按顺序排列,我认为顺序中可能没有间隙)。
您经常会看到这些数字包含一个可以及时确定它们范围的元素(例如年份:2009 03472)。这样,您可以最大限度地降低使用相同数字两次的风险。
你说你每天有大约 1K 的发票。这意味着 6 位数的发票号码将满足您的需求。所以 4 位数的年份,后跟用 0 填充的 6 位数发票号码可能会让您继续前进。
我可能会让数据库生成它们以确保它们是唯一的。
将一个表添加到您的数据库中,该表存储上次使用的发票编号的值,以及一个存储过程来增加该值并将新值返回给您以用于创建您的发票。
当您保存新发票时,请致电 SP 以获取下一张发票编号,这是您做的最后一件事 - 在验证通过后但立即写入磁盘之前 - 以尽量减少“漏洞”的风险你的编号顺序。
使用顺序 ID 可能是最好的,除非您出于某种原因希望它们是随机的(比如因为客户不应该能够从大致相同的时间段猜测另一个订单的订单 ID)。使用顺序 ID 可以让您读取当前的最大值,然后在您提交批处理订单之前检查您要写入的范围内是否没有写入任何内容。
如果您不想承担检查数据库的负担并且可以确保其他进程不会干扰,您可以利用 DateTime.UtcNow 和 Base64 转换。一个非常笨拙的插图可能是这样的:
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Year,
(byte)DateTime.UtcNow.Month,
(byte)DateTime.UtcNow.Day,
(byte)DateTime.UtcNow.Hour,
(byte)DateTime.UtcNow.Minute,
(byte)DateTime.UtcNow.Second,
(byte)DateTime.UtcNow.Millisecond })
或者
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Ticks })
您可能对Base32转换更感兴趣(它使用字母 AZ 和数字 2-7),尽管没有原生的 .Net 转换,所以您必须搜索一个。
我认为如果没有法律限制生成发票 ID 的规则,它可以是任何你想要的。
现在我有一个很好的例子:
实际上我正在编写一个发票系统,并且我已经按顺序生成了我的 id 代码,但我有一些差距,因为例如当客户取消与公司的合同时,我之前已经生成了 12 张发票。
(因为这里我们是ISP公司,合同必须是6、12或24个月)
我在我的数据库中找到了空白,因为系统的用户删除了取消的发票。如果我真的需要一个序列号,我就会遇到法律问题。而且我这里还有很多其他情况,这让我的顺序发票编号出现了空白。
我真的不知道如何避免这种问题,因为发生这种情况的情况很多。任何的想法?