C# Tutorials and offshore development in India
    Tutorials   Resources   Forum   Reviews   Communities   Interview   Jobs   Projects   Training   Your Ad Here    
Silverlight Games | Mentor | Code Converter | Articles | Code Factory | Computer Jokes | Members | Peer Appraisal | IT Companies | Bookmarks | Polls | Revenue Sharing | Lobby | Gift Shop |


Prizes & Awards
My Profile



Active Members
TodayLast 7 Days more...






Resources » Articles » Databases »

Generate Next Numbers with SQLServer


Posted Date: 10 Jun 2004    Resource Type: Articles    Category: Databases
Author: PPG Dinesh AsankaMember Level: Bronze    
Rating: 1 out of 5Points: 10



Introduction

Generating next numbers in SQLServer should not be a problem. But problem arises when customer ask for different types of next numbers where you cannot generate directly from SQLServer. This brief article describes how you would tackle this problem in different scenarios.

Number Generating Requirements

I was in a team of developing Invoicing System for a major photo developer Sri Lanka which has Orders, Invoices and Receipts among others. When we carried out a system study we
found that their number generating is quite different to other clients, which we have implemented. Normally others would be happy if it is a general increment which is unique. In SQLServer there is a property of Increment which we were using happily for some times. But for this particular customer things were not easy.


  1. For all numbers there should be a prefix which attached to it. It is “O”, “I” and “R” for Orders, Invoices Receipts respectively./li>
  2. Invoice number should be reset in every month while receipt number reset in every year.

  3. Invoice number consists of year and month while receipt number must contain year for its number.

  4. Order number sequence is depending on the channel wise. This client has several channels. Channel 'A' order number has different sequence to that of channel 'B'.

  5. There are some other source documents such as delivery orders, advance slips where their sequence number method has not implemented at the time of the discussion. But they said it will be one of the above methods.



These are their main requirement to the number generating. Thing are not easy as it looks.

Implementation

As the fully implementation is not completed we had to design in advance. We adopted following methods of doing it.

Main steps are storing last number, reading last number and updating it.

Storing Last Number

Followings are the file structures, which are used to keep the last number.

CREATE TABLE [dbo].[SEQ_NO] (

[TYPE] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,

[Prefix] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,

[LastNumber] [int] NULL ,

[Length] [smallint] NULL ,

[Year] [bit] NULL ,

[Month] [bit] NULL ,

[LastYear] [smallint] NULL ,

[LastMonth] [smallint] NULL ,

[TableName] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL

) ON [PRIMARY]

GO


Sample Data for the SEQ_NO
Type Prefix Last Number Length Year Month Last Year Last Month Different Table TableName

INV

I 984 4 1 2004 2    
ORD   0 8 10 2004   1 SEQ_CHAN
RCT R 125 10 0 0        


2. Table for keep channel wise sequence numbers

CREATE TABLE [dbo].[SEQ_CHAN] (
[ Code ] [nvarchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[LastNumber] [int] NULL
) ON [PRIMARY]
GO

Sample Data for the SEQ_CHAN

CodeLastNumber
A9534
B835


Reading and updating Last Number

I have used single stored procedure for reading and updating the last number. This is due to the fact that in multi user environment, there can be a case where two users get same number for the same record type. To avoid that at the point of generating the next number, number will be updated to the tables.

The stored procedure (sp_Get_Next_Number) has three parameters. First parameter is the type i.e. INV or ORD or RCT. The second parameter is date. Normally date is current system date. However, in the cases of generating previous document, date has to be parameterized keeping the system date as the default. Last parameter is optional parameter for the second table code.

/* Purpose :Get Last Number

Author : PPG Dinesh Asanka

Create Date : 2002-01-23

Version Date Modification

1.01 2002-02-28 Change to Get Last Number from Channel wise table
*/

CREATE PROCEDURE [dbo].[sp_Get_Next_Number]

@TypeID as varchar(5),@TranDate as varchar(20) = "",@secondType as varchar(5) = ""

AS

DECLARE @Prefix VARCHAR(1),

@LastNumber int,

@Length smallint,

@Year bit,

@Month bit,

@LastYear smallint,

@LastMonth smallint,

@DiffrentTable bit,

@TableName varchar(10),

@TrnYear varchar(2),

@TrnMonth varchar(2),

@char_Next_Number as varchar(25),

@SQL as varchar(120),

@charLastNumber as varchar(15)

If @TranDate = ""

Select @TranDate = GetDate()

if exists (Select * From SEQ_NO Where TYPE = @TypeID)

begin

Select @prefix = Prefix,

@LastNumber = LastNumber,

@Length = Length,

@Year = [Year],

@Month = [Month],

@LastYear = [LastYear],

@LastMonth = [LastMonth],

@DiffrentTable = [DiffrentTable],

@TableName = [TableName]

From SEQ_NO Where TYPE = @TypeID

if (@DiffrentTable = 1)

Select @LastNumber = LastNumber From SEQ_CHAN Where CODE = @secondType

Select @LastNumber = @LastNumber + 1

-- To Fill 0 for prefix

Select @charLastNumber = RTRIM(REPLICATE("0",@length - len(@LastNumber)) + cast(@LastNumber as varchar(10)))


Select @TrnYear = RIGHT(DATEPART(yyyy, @TranDate) ,2)

Select @TrnMonth = Month( @TranDate)

If Len(@TrnMonth) = 1 Select @TrnMonth = '0' + @TrnMonth

if @Year = 1 AND @Month = 1 -- Next Number is change for Every Month

if @LastMonth = Month(@TranDate) AND @LastYear = RIGHT(DATEPART(yy, @TranDate) ,2)

Select @char_Next_Number = @TrnYear + @TrnMonth + @charLastNumber

else

begin

Select @char_Next_Number = @TrnYear + @TrnMonth + REPLICATE ("0" ,@length -1) + '1'

Select @LastNumber = 1

Select @LastMonth = @TrnMonth

Select @LastYear = @TrnYear

end

else

if @Year = 1 -- Next Number is changing for Every year

if @LastYear = RIGHT(DATEPART(yy, @TranDate) ,2)

Select @char_Next_Number = @TrnYear + @charLastNumber

else

begin

Select @LastYear = @LastYear

Select @LastNumber = 1

Select @char_Next_Number = @TrnYear + REPLICATE ("0" ,@length -1) + '1'

end

else

Select @char_Next_Number = @charLastNumber

Select RTRIM(LTRIM(ISNULL(@prefix,"") + @char_Next_Number))

-- Update Tables for next Numbers

if (@DiffrentTable = 1)
begin

Select @sql = "Update " + @Tablename + " Set LastNumber ="

+ Cast(@LastNumber as varchar(10)) +

" Where CODE ='" + @secondType + "'"

execute (@sql)
end

Update SEQ_NO Set LastNumber = @LastNumber,

LastYear = @LastYear,

LastMonth = @LastMonth

Where TYPE = @TypeID

end

else

Select "Invalid Type"


Examples

Following results will be returned for the above data set

sp_Get_Next_Number 'INV' = I04020985
sp_Get_Next_Number 'RCT' = R0000000126
sp_Get_Next_Number 'ORD','','A' = 0400009535


Limitations

Problem arises when user trying to make ad hoc changes for the existing numbering system. Therefore, specifically we advised them not to do ad hoc changes to the numbering method.



Conclusion

Until now, we have not found any problems with regard to the above numbering system. Do you have any other way of doing these things? I warmly welcome any suggestions and improvements to the above numbering system.

Dinesh Asanka



Responses

Author: Sankaranarayanan.M    26 Jul 2004Member Level: Bronze   Points : 0
we used another way to generate number to the bills.
we have to go for stored Procedures.since its multiple user okay.

1.just if a user inserts a new records
2.Just Check which one he is inserting (INV,BILL, or else other).
3.Then do a query by
set @q=(select max(no) from tbl where cond1=''INV")

4. then u just increment the value by 1 and insert it.
set @q=@q+1
5.this will solve the problem while multiple user also. since we r selecting MAX okay.
Thankz
SankarM




Feedbacks      
Popular Tags   What are tags ?   Search Tags  
Sign In to add tags.
(No tags found.)

Post Feedback


This is a strictly moderated forum. Only approved messages will appear in the site. Please use 'Spell Check' in Google toolbar before you submit.
You must Sign In to post a response.
Next Resource: Time Conversion GMT to Current Time and Back
Previous Resource: Store and Retrieve Images in SQL Server database
Return to Discussion Resource Index
Post New Resource
Category: Databases


Post resources and earn money!
 
More Resources



dotNet Slackers

About Us    Contact Us    Privacy Policy    Terms Of Use