我需要大量的发票,将转换到电子数据交换和运输到我们的总部。有一个订单表,上面有所有的订单。在一天中的某个时候,我必须拿一套(大约1k)并生成发票。
注意:当我生成发票时,我需要计算订单总额和税金。
我很感谢你的意见。
发布于 2009-06-23 21:05:11
发票号码可能受到法律要求的约束(在我居住的地方,它们需要按顺序排列,而且我不认为在顺序上可能有漏洞)。
您经常会看到,这些数字包括一个将及时对其进行范围的元素(例如年份:200903472)。这样,就可以将使用同一数字两次的风险降到最低。
你说你一天有1K的发票。这意味着6位数的发票号码将满足您的需要.所以,4位数的年份,然后是零填充的6位数的发票号码,可能会让你走。
我可能会让数据库生成它们,以确保它们是唯一的。
发布于 2009-06-23 21:22:02
向数据库中添加一个表,该表存储使用的最后一个发票号的值,并添加一个存储过程来增加该值,并将新的值返回给您,以便在创建发票时使用。
当你保存你的新发票时,打电话给SP,得到你做的最后一件事中的第一件事--在验证通过之后,但在写到磁盘之前--以便尽量减少你的编号顺序中“漏洞”的风险。
发布于 2009-06-23 22:59:12
使用顺序id可能是最好的,除非您希望它们出于某种原因是随机的(比如因为客户不应该能够从大致相同的时间内猜测另一个订单的订单id)。使用顺序ids可以读取当前的最大值,然后在从批处理过程提交订单之前检查是否在要写入的范围内没有写入。
如果您不想要检查数据库的负担,并且可以确保其他进程不会干扰,那么您可能能够利用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转换(它使用字母A和数字2-7),尽管没有原生的.Net转换,所以您必须搜索其中一个。
https://stackoverflow.com/questions/1035197
复制相似问题