【问题标题】:Auto generating invoice number自动生成发票编号
【发布时间】:2020-07-07 00:34:06
【问题描述】:

我正在尝试使用数据库表上的最后一个发票编号自动生成发票编号。我的样本发票编号是“INV0000” 这是我尝试过的

SqlConnection scon1 = new SqlConnection(mycon1);
String myquery1 = "select max(Inv_num) from [dbo].[tblInv_info]";
SqlCommand cmd1 = new SqlCommand();
cmd1.CommandText = myquery1;
cmd1.Connection = con;
SqlDataAdapter da1 = new SqlDataAdapter();
da1.SelectCommand = cmd1;
DataSet ds1 = new DataSet();
da1.Fill(ds1);
txtInvoiceN.Text = ds1.Tables[0].Rows[0][0].ToString();
string a;
a = txtInvoiceN.Text;
a = a  + 1;
txtInvoiceN.Text = a.ToString();
con.Close();

上面的代码可以正常工作,但发票编号不是 INV0001,而是输出变为 INV00001。我尝试将 SQL 查询更改为:

SELECT MAX(CONVERT(INT, RIGHT(Inv_Num, LEN(Inv_Num)-3))+1) FROM tblInv_info;

输出正确,但缺少前三个字母,我们将不胜感激。

【问题讨论】:

  • 为什么不让你的数据库生成数字作为标识列
  • 通常更容易将数字序列存储在单独的位置并使用它来填充发票编号。在 SQL Server 中查找序列。

标签: c# sql asp.net sql-server


【解决方案1】:

我不能真正支持你正在尝试做的事情。如果你想要一个递增的数字,那么你应该使用identity 列或者可能是一个序列。尝试以这种方式分配值可能会导致问题 - 值得注意的是,两个不同的线程可能会产生相同的数字。

但您的问题更多是关于格式化值。您可以在数据库中进行所有操作。这是产生数字的一种方法:

select concat('INV', format(convert(int, stuff(max(Inv_num), 1, 3, '')) + 1, '0000'))
from [dbo].[tblInv_info]

这会提取最大数字,删除前三个字符,转换为整数,加 1 并以您想要的方式重新格式化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多