首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成发票

生成发票
EN

Stack Overflow用户
提问于 2009-06-23 21:01:14
回答 4查看 1.8K关注 0票数 2

我需要大量的发票,将转换到电子数据交换和运输到我们的总部。有一个订单表,上面有所有的订单。在一天中的某个时候,我必须拿一套(大约1k)并生成发票。

  1. 哪里是生成发票号码的最佳地点?在Server后端上?或者抓取批处理到.NET应用程序中,然后在那里生成发票号?发票号码可以是随机的,但不能重复( 3-4年).我有最多12位数字可玩,可以是阿尔法数字。在哪里可以找到生成发票号码的信息。

注意:当我生成发票时,我需要计算订单总额和税金。

我很感谢你的意见。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-23 21:05:11

发票号码可能受到法律要求的约束(在我居住的地方,它们需要按顺序排列,而且我不认为在顺序上可能有漏洞)。

您经常会看到,这些数字包括一个将及时对其进行范围的元素(例如年份:200903472)。这样,就可以将使用同一数字两次的风险降到最低。

你说你一天有1K的发票。这意味着6位数的发票号码将满足您的需要.所以,4位数的年份,然后是零填充的6位数的发票号码,可能会让你走。

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

票数 4
EN

Stack Overflow用户

发布于 2009-06-23 21:22:02

向数据库中添加一个表,该表存储使用的最后一个发票号的值,并添加一个存储过程来增加该值,并将新的值返回给您,以便在创建发票时使用。

当你保存你的新发票时,打电话给SP,得到你做的最后一件事中的第一件事--在验证通过之后,但在写到磁盘之前--以便尽量减少你的编号顺序中“漏洞”的风险。

票数 1
EN

Stack Overflow用户

发布于 2009-06-23 22:59:12

使用顺序id可能是最好的,除非您希望它们出于某种原因是随机的(比如因为客户不应该能够从大致相同的时间内猜测另一个订单的订单id)。使用顺序ids可以读取当前的最大值,然后在从批处理过程提交订单之前检查是否在要写入的范围内没有写入。

如果您不想要检查数据库的负担,并且可以确保其他进程不会干扰,那么您可能能够利用DateTime.UtcNow和Base64转换。一个非常笨拙的例子可能是这样的:

代码语言:javascript
复制
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 })

代码语言:javascript
复制
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Ticks })

您可能更感兴趣的是一个Base32转换(它使用字母A和数字2-7),尽管没有原生的.Net转换,所以您必须搜索其中一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1035197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档