生成发票

时间:2009-06-23 21:01:14

标签: .net sql sql-server invoice

我需要以大批量生成发票,这些发票将转换为EDI并运送到我们的总部。有一个包含所有订单的订单表。在当天的某个时刻,我必须抓住一套(约1k)并生成发票。

  1. 哪里是生成发票号码的最佳位置?在SQL Server后端?或者将批处理抓取到.NET应用程序中,然后在那里生成发票号码?发票号码可以是随机的,但不得重复(3 - 4年)。我最多可以使用12位数字,可以是字母数字。我在哪里可以找到有关生成发票号的信息。
  2. 注意:在生成发票时,我需要计算订单总额和税金。

    我很感激您的意见。

4 个答案:

答案 0 :(得分:4)

发票编号可能受到法律要求的限制(我住的地方需要按顺序排列,我不认为序列中可能存在空白)。

您经常会看到这些数字包含一个能够及时确定范围的元素(例如年份: 2009 03472)。这样可以最大限度地降低两次使用相同数字的风险。

你说你每天有~1K发票。这意味着6位数的发票号码将满足您的需求。因此,4位数年份后跟零填充的6位数发票号应该可以帮助你。

我可能会让数据库生成它们以确保它们是唯一的。

答案 1 :(得分:1)

在数据库中添加一个表,用于存储上次使用的发票编号的值,以及一个存储过程,用于递增此值并将新值返回给您,以便在创建发票时使用。

当您保存新的发票时,请拨打SP以获取下一个发票编号,这是您执行的最后一项操作之后 - 在验证通过之后但是在写入磁盘之前是不可避免的 - 以便尽量将风险降至最低在您的编号顺序中“孔”。

答案 2 :(得分:0)

使用顺序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转换,因此您必须搜索一次。

答案 3 :(得分:0)

我认为如果没有法律限制关于生成发票ID的规则,那么它可以是您想要的任何内容。

现在我有一个很好的例子:

实际上我正在编写发票系统并且我按顺序生成了我的id代码,并且我有一些差距,因为当客户例如取消与公司的合同时,我之前已经生成了12个发票。

(因为我们是一家ISP公司,合同必须是6,12或24个月)

我的数据库中存在差距,因为系统用户删除了已取消的发票。如果我真的需要序号,我就会遇到法律问题。而且我还有很多其他情况让我在顺序发票号码上留下了空白。

我真的不知道如何避免这种问题,因为有很多情况会发生。有什么想法吗?