一些背景:在德国(至少)发票号码必须遵循某些规则:
几个月后,他们被允许包含字符。有些客户希望使用这种可能性,客户不知道或害怕他们坚持使用仅限数字的发票号码。
此外,客户不希望在零处启动它们。
我能想出很多方法来产生这样一个数字吗?我想知道:最好的方法是什么?
答案 0 :(得分:5)
为了避免从0开始 - 只需从10000开始。忘掉零填充。
您必须考虑何时分配号码。
如果您在首次打开发票进行编辑时分配号码,例如分配号码10014,并且用户取消发票,那么您就有差距,因为您必须记住其他人可能已经拥有开始创建ID为10015的发票,因此您不能只回滚该号码。
如果您在发票完全写入并保存后分配号码,那么您将避免该方案,并且您将避免出现间隙,但您不知道发票之前将具有哪个发票号码它被保存了。
此外,您需要确保它是线程安全的,这样两个用户就无法创建相同的发票号。
static object _invoiceNumberLock = new object();
public static string GetInvoiceNumber()
{
lock(_invoiceNumberLock)
{
//Connect to database and get MAX(invoicenumber)+1
//Increase the invoicenumber in SQL database by one
//Perhaps also add characters
}
}
还要考虑通过在SQL数据库中的invoicenumber列上使用UNIQUE INDEX来备份唯一性。
答案 1 :(得分:1)
我的两个想法:
以十六进制:>
包含发票号码会很酷答案 2 :(得分:0)
对于我的发票,它们总是包含一年中的最后一位数字,后跟一个从4096开始的4位数发票编号,因此您将得到一个类似85021的值。这是为了轻松处理我的账单(最多)15客户每月两次。
现在这是无关紧要的,因为我每年只筹集大约6张发票(我是永久性的,现在只做一小部分工作,大部分时间都是出于投资目的而离开公司),但这个方案对我来说总是有效。
它阻止客户感觉他们正在完成一家小公司的工作(没有1号发票甚至80001号)。
就顺序性而言,发票只是存储在文件名中包含发票编号的文件中,因此很容易创建下一个发票。不需要数据库 - 这实际上取决于您的商店有多大。
答案 3 :(得分:0)
更多想法:
选择一个任意比特序列作为数字的顶部。这将作为一个“魔术键”,因此您可以脱离上下文识别该数字。例如,Newegg产品ID似乎以“N82E”开头,UPS跟踪号似乎以“1Z”开头。
如果您可以弯曲“连续”规则,则将最后一位设为奇偶校验位,以进行错误检查。