Salve a tutti, sto facendo un gestionale di magazzino, e sto curando la procedura di scarico.
Ho fatto una stored procedure semplicissima, che non si occupa di salvare i dati, ma semplicemente di pescare il record di scarico salvato e di affibiargli un numero progressivo (inizialmente salvo il record con numero=0). Passo come parametri l'ID del record del documento (pk) e il l'ID del tipo documento (ci possono essere documenti di tipo diverso, con numerazioni diverse).
Lo scopo è ripescare come parametro di ritorno il numero di documento salvato
La procedura è la seguente:
codice:
ALTER PROCEDURE AGGIORNA_PROGRESSIVO
@IDDOCUMENTO INT,
@IDTIPODOCUMENTO INT,
@NUMERODOC INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
UPDATE Documenti.Scarico SET NUMERO = (SELECT MAX(NUMERO)+1 FROM DOCUMENTI.Scarico WHERE IDTIPODOCUMENTO=@IDTIPODOCUMENTO) WHERE ID=@IDDOCUMENTO AND NUMERO = 0
COMMIT
SELECT @NUMERODOC = NUMERO FROM DOCUMENTI.Scarico WHERE ID=@IDDOCUMENTO
RETURN @NUMERODOC
END
Da vb 2010, questo è il codice per ripescare il parametro di ritorno
codice:
Function Salva() as integer
Dim Cmd As New SqlClient.SqlCommand
Cmd.CommandType = CommandType.StoredProcedure
Cmd.Connection = cnConnessione
Cmd.CommandText = "AGGIORNA_PROGRESSIVO"
Dim p As New SqlClient.SqlParameter("NUMERODOC", SqlDbType.Int)
p.Direction = ParameterDirection.ReturnValue
Cmd.Parameters.Add(p)
Cmd.Parameters.AddWithValue("IDDOCUMENTO", ritorno)
Cmd.Parameters.AddWithValue("IDTIPODOCUMENTO", IDTIPODOCUMENTO)
Cmd.ExecuteNonQuery()
Return Cmd.Parameters("NUMERODOC").Value
End Function
ritorno è un variabile contenete l'ID del documento appena salvato. Non vi posto il codice di salvataggio, tanto quello funziona.
Ecco il problema: da codice mi dice che la procedura necessita di un valore per NUMERODOC, ma se provo ad eseguire la stored dal management studio, funziona, fa l'update e mi ritorna il parametro di ritorno.
Cosa c'è che non va
?
E il tipo di transazione? Il programma verrà usato da più pc, è ho pensato che isolare la procedura quando viene chiamata poteva essere una buona soluzione per ritrovarmi con numeri di documento doppi o tripli o peggio.