如何为当天创建唯一的批号

时间:2019-05-26 00:46:15

标签: sql sql-server-2008

我要为当天创建唯一的批次号,明天的批次号应为max(batchno)+1。和序列号应保持如下

record set should be as follows

ID    | invoice date   | Batchno     |  seqno
1     | 2019-05-24     |201905000001 | 1
2     | 2019-05-24     |201905000001 | 2
3     | 2019-05-25     |201905000002 | 1
4     | 2019-05-25     |201905000002 | 2

   ON  [dbo].[EBSIEMSTransfernew]
   AFTER INSERT   

AS 

 declare @year varchar(4)
 declare @month varchar(2)
 declare @serialNo varchar(10)

 select @year = year(getdate())
 select @month = REPLICATE('0', 2-len( month(getdate())))+ cast(month(getdate()) as varchar)
 select @serialNo = Max(right(BatchNo,5)) FROM  [Onaccount].[dbo].[EBSIEMSTransfernew] where InvoiceDate >= dateadd(day,datediff(day,1,GETDATE()),0) 
 AND InvoiceDate < dateadd(day,datediff(day,0,GETDATE()),0)


BEGIN

UPDATE    [Onaccount].[dbo].[EBSIEMSTransfernew]
SET              BatchNo = @year + @month + REPLICATE('0', 5 - LEN(@serialNo + 1)) + CAST(@serialNo + 1 AS varchar)
FROM         [Onaccount].[dbo].[EBSIEMSTransfernew] INNER JOIN
                      inserted AS i ON EBSIEMSTransfernew.InvoiceDate = i.InvoiceDate
WHERE     (EBSIEMSTransfernew.InvoiceDate = i.InvoiceDate) 

SET NOCOUNT ON;



END


GO

2 个答案:

答案 0 :(得分:1)

对于每日批号,我可以选择使用YYYYMMDD作为批号。因为这在所有意义上都是唯一的。因此,每个新的日期本身就是一个新的UNIQUE批号,如下所示-

20190526
20190527
...
20190530

当您管理每天从1开始的每日序列号/序列号时,它们也会一起产生有意义的数字。您可以轻松地从中读取一些价值。我建议根据一天可能需要的最大发票猜测,使用诸如0001..0002之类的“ seqno”。

您现在还可以从下面的两个数字生成发票编号,如下所示-

201905260001
201905260002

然后,发票号本身将很有意义,因为它很容易理解,发票的日期为20190526,而销售发票是当天的第一次/第二次销售。

答案 1 :(得分:0)

触发器似乎很愚蠢。为什么不只使用计算列呢?

create view v_EBSIEMSTransfernew as
    select t.*,
           dense_rank() over (order by invoice_date)
    from EBSIEMSTransfernew t;

诚然,如果没有批次,这将跳过几天。如果存在问题,则可以在视图中生成值:

app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"

您对问题的描述仅提及一个数字。我不确定其余数字的来源,但是您可以修改这两种方法以添加前缀。