Gå til innhold

[Løst] MSSQL, nummerserie, SP for neste nummer


Anbefalte innlegg

Folkens..

Vi trenger en metode for å hente neste nummer i en serie.  Vi har nummerserier plassert i en tabell:

ID                 Integer

SerieNavn    varchar(50)

StartNr         Integer

SluttNr          Integer

LastNr          Integer

 

 

I dag så gjør vi dette på klient siden, men det er ikke godt nok når det er mange brukere.  Går det ikke an å lage en StoredProc som fikser dette?  Som garantert funker i flerbruk miljøer

Lenke til kommentar
  • 3 uker senere...
Videoannonse
Annonse

 

Jaja, ingen som visste dette skjønner jeg.,  Fant ut av det sjæl i stedet. Deler dette med dere i tilfelle noen andre har behovet: Brukte en eksisterende tabell for formålet som ser slik ut:

CREATE TABLE [dbo].[SYSCOUNT] (
    [ID]      INT          NOT NULL, ' Record ID
    [CTYPE]   TINYINT      NOT NULL, ' Nummerserie type
    [CCN_ID]  INT          NOT NULL, ' Sub type
    [ANS_ID]  INT          NOT NULL, ' Ansatt ID
    [IDCOUNT] DECIMAL (11) NULL,     ' Siste brukte ID i serien
    PRIMARY KEY CLUSTERED ([ID] ASC),
    UNIQUE NONCLUSTERED ([CCN_ID] ASC, [CTYPE] ASC, [ANS_ID] ASC)
);

Så lagde jeg en SP som sørget for eksistensen av record:

CREATE procedure CreateNewNumberSequence
	@SequenceType tinyint,
	@user int,
	@SubCode int = 0,
	@startID decimal = 1
as
begin
	declare @nextID int
	if exists (select 1 from SYSCOUNT where CTYPE = @SequenceType and CCN_ID = @SubCode and ANS_ID = @user)
	begin
		return 1
	end
	select @nextID = MAX(ID) from SYSCOUNT
	if @nextID is null set @nextID = 1
	else set @nextID = @nextID + 1
	insert into SYSCOUNT (ID, CTYPE, CCN_ID, ANS_ID, IDCOUNT) values(@nextID, @SequenceType, @SubCode, @user, @startID - 1)
end
Og så til slutt en SP som skal brukes fra programmene for selve spørringen:
CREATE procedure GetNewSequentialID
	@SequenceType tinyint,
	@SubCode int,
	@user int
as
begin
	declare @NewSequentialId decimal
	declare @currentval decimal
	set NOCOUNT ON
	select @currentval = IDCOUNT from SYSCOUNT where CTYPE = @SequenceType and CCN_ID = @SubCode and ANS_ID = @user
	if @currentval is null
	begin
		execute CreateNewNumberSequence @SequenceType,@user, @SubCode, 1
		select @currentval = IDCOUNT from SYSCOUNT where CTYPE = @SequenceType and CCN_ID = @SubCode and ANS_ID = @user
	end
	update SYSCOUNT
	set @NewSequentialId = IDCOUNT = @currentval + 1
	where CTYPE = @SequenceType and CCN_ID = @SubCode and ANS_ID = @user
	return @NewSequentialId
end

Synes dette var greit finni på av en som aldri har laget SP'er før jeg. 

 

Endret av HDSoftware
  • Liker 1
Lenke til kommentar

 

 

Jaja, ingen som visste dette skjønner jeg.,  Fant ut av det sjæl i stedet. Deler dette med dere i tilfelle noen andre har behovet: Brukte en eksisterende tabell for formålet som ser slik ut:

CREATE TABLE [dbo].[SYSCOUNT] (
    [ID]      INT          NOT NULL,
    [CTYPE]   TINYINT      NOT NULL,
    [CCN_ID]  INT          NOT NULL,
    [ANS_ID]  INT          NOT NULL,
    [IDCOUNT] DECIMAL (11) NULL,
    PRIMARY KEY CLUSTERED ([ID] ASC),
    UNIQUE NONCLUSTERED ([CCN_ID] ASC, [CTYPE] ASC, [ANS_ID] ASC)
);

... (klippet bort)

 

Synes dette var greit finni på av en som aldri har laget SP'er før jeg. 

 

Akkurat sånne spørsmål synes jeg gir høyest verdi for allmenheten å legge på SO. Og hvis man legger ut ferdig kode kunne det være en ide å kommentere variablene litt for å gjøre det klart hva i all verden de gjør for noe. Synes det ikke er opplagt hva IDCOUNT, CTYPECCN_IDANS_ID og IDCOUNT var ment å gjøre, og dermed har koden mye mindre verdi, selv om du skal ha takk for å ha postet den :-) 

Endret av 8086
Lenke til kommentar

 

 

 

Jaja, ingen som visste dette skjønner jeg.,  Fant ut av det sjæl i stedet. Deler dette med dere i tilfelle noen andre har behovet: Brukte en eksisterende tabell for formålet som ser slik ut:

CREATE TABLE [dbo].[SYSCOUNT] (
    [ID]      INT          NOT NULL,
    [CTYPE]   TINYINT      NOT NULL,
    [CCN_ID]  INT          NOT NULL,
    [ANS_ID]  INT          NOT NULL,
    [IDCOUNT] DECIMAL (11) NULL,
    PRIMARY KEY CLUSTERED ([ID] ASC),
    UNIQUE NONCLUSTERED ([CCN_ID] ASC, [CTYPE] ASC, [ANS_ID] ASC)
);

... (klippet bort)

 

Synes dette var greit finni på av en som aldri har laget SP'er før jeg. 

 

Akkurat sånne spørsmål synes jeg gir høyest verdi for allmenheten å legge på SO. Og hvis man legger ut ferdig kode kunne det være en ide å kommentere variablene litt for å gjøre det klart hva i all verden de gjør for noe. Synes det ikke er opplagt hva IDCOUNT, CTYPECCN_IDANS_ID og IDCOUNT var ment å gjøre, og dermed har koden mye mindre verdi, selv om du skal ha takk for å ha postet den :-) 

 

Kommentarer er lagt på..

 

Når det gjelder bruken av SO så er jeg uenig.  Da kan man jo strengt tatt legge ned hele diskusjon.no da. Er ikke poenget at man skal få et blomstrende miljø i Norge da?  Hvis alle legger ting ut på SO, eller MSDN for den saken skyld, så er jo dette forumet bortkastet. 

Synes det er litt leit at folk har den holdningen jeg.  Når jeg startet med .NET programmering så var nettopp denne kanalen selve utdannelses sentralen for meg.  Heg kunne jeg spørre og grave om alt mulig og svar kom i løpet av kort tid.

Lenke til kommentar

Når det gjelder bruken av SO så er jeg uenig.  Da kan man jo strengt tatt legge ned hele diskusjon.no da. Er ikke poenget at man skal få et blomstrende miljø i Norge da?  Hvis alle legger ting ut på SO, eller MSDN for den saken skyld, så er jo dette forumet bortkastet. 

Synes det er litt leit at folk har den holdningen jeg.  Når jeg startet med .NET programmering så var nettopp denne kanalen selve utdannelses sentralen for meg.  Heg kunne jeg spørre og grave om alt mulig og svar kom i løpet av kort tid.

 

 

Domenenavnet sier alt. DISKUSJON.no. Disse foraene egner seg jo aller best til å diskutere en sak fram og tilbake, men grunnen til at SO har nådd toppen er jo at disse foraene har veldig lav S/N (signal/noise) for klare spørsmål (eller problemer). SO er helt klart stedet å gå for spørsmål, men passer overhodet ikke for diskusjoner.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...