Numero Documento

martedì 08 marzo 2011 - 17.25
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows XP  |  Visual Studio 2008  |  SQL Server 2008

Peppino Profilo | Junior Member

Ciao a tutti.
Come numero incrementale dei documenti uso la seguente funzione, e funziona benissimo.

Private Function NuovoNumero() As Integer
Try
'Cerco il numero del documento più alto salvato
Dim cmd As New SqlCommand
cmd.Connection = ConnessioneDatabase
cmd.CommandText = "SELECT ID FROM Documnti ORDER BY ID DESC"
ConnessioneDatabase.Open()
Dim ris As Object = cmd.ExecuteScalar()
ConnessioneDatabase.Close()
If ris Is DBNull.Value Or ris Is Nothing Then
Return 1
End If
Return Convert.ToInt32(ris) + 1

Catch ex As Exception
Messaggi.Errore("Errore non gestito nell'individuazione del nuovo numero documento : " & _
ex.ToString, "Attenzione")
Return 0
End Try
End Function

Il problema è che in questo modo il progressivo va avanti all'infinito. Io invece vorrei che con il nuovo anno il contatore riparte da 1 (Es. da 1000/2010 a 1/2011). E' possibile risolvere il mio problema? come?. Saluto e ringrazio anticipatamente come sempre.
Ciao. Peppino.

dinoxet Profilo | Senior Member

ma i prograssevi che memorizzi sono del tipo:
2/2010
o solo
2?


DINOXET
__________________________________________
impossible is only a word

Peppino Profilo | Junior Member

E memorizzato numero singolo (in tabella come int e PK)

alexmed Profilo | Guru

Ciao
Prova così, non l'ho verificata ...

cmd.CommandText = "SELECT MAX(ID) FROM Documnti WHERE nome_del_compo_anno = DATEPART(year, CURRENT_TIMESTAMP)"


alexmed

Peppino Profilo | Junior Member

La riga di codice è giusta infatti se faccio una simulazione di cambio anno e vado a fare un nuovo inserimento nel nuovo anno mi da come ID il numero 1. Purtroppo essendo il campo definito come PK campo univoco, quando vado per salvare i dati mi dice che il numero 1 è gia presente in archivio e giustamente non mi permette di salvare i dati inseriti con quell'ID. Ho in mente di fare delle modifiche al codice e alle tabelle per utilizzare la riga di codice che mi avete passato e penso di arrivare a risolvere il problema. Eventualmente mi farò risentire. Comunque ringrazio per la disponibilità di tutti del Forum e per la tempestiva risposta. Saluto. Ciao. Peppino.

alexmed Profilo | Guru

Ciao
Una soluzione potrebbe essere quella di inserire una colonna "Protocollo"

cmd.CommandText = "SELECT MAX(Protocollo) FROM Documnti WHERE nome_del_compo_anno = DATEPART(year, CURRENT_TIMESTAMP)"

Oppure, se vuoi "esagerare" , potresti inserire una colonna "N" che rappresenta il progressivo del documento e poi la colonna (calcolata) "Protocollo" in modo che ti restituisca un valore del tipo "001/2011" derivata dalla combinazione delle colonne N e ANNO.

La formula della colonna Protocollo dovrebbe essere una cosa del genere:

((right('000'+CONVERT([varchar](3),[N],(0)),(3))+'/')+CONVERT([nvarchar](4),datepart(year,[Data]),(0)))

Ciao

alexmed

Peppino Profilo | Junior Member

Ciao alexmed, grazie ancora per l'interessamento. Per quanto riguarda la soluzione era proprio a quello che mi hai appena suggerito che stavo pensando, solo che dovevo trovare la formula, ma vedo che hai provveduto anche a questo e che io sicuramente avrei nuovamente chiesto aiuto a proposito. Adesso spero di riuscire a inquadrare il tutto. Ringrazio nuovamente. Saluto. Ciao. Peppino.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5