Procedimiento almacenado para generar correlativo (Pedido, Orden de Compra, etc) evitando la concurrencia en una plataforma multiusuario.
En el presente artículo vamos a explicar una forma de crear un procedimiento almacenado para generar un numero correlativo (Factura, Pedido, Orden de Compra, N° de ticket) en un sistemas multiusuario, evitando la concurrencia.
Crearemos un Procedimiento almacenado con los siguientes parámetros:
@NumSalida: En este parámetro se almacena el numero correlativo generado para ser devuelto a la aplicación.
@NombCampo: Aquí se envía el nombre de la variable del tipo de documento para el cuela se va a generar el correlativo.
@Serie: Aquí se envía el número de serie o el año del correlativo del documento si es que lo tuviera, ejemplo en el caso de las factura hay serie 001, 002, 003, etc.
@Tam: Este valor se utiliza para darle formato al correlativo a un tamaño determinado, ejemplo si se envía Tam=10 y el correlativo que sigue para N° de pedido es 10, el valor devuelto por el procedimiento seria 0000000010.
@MostSelect: Este valor indica si el correlativo se devuelve con una sentencia SELECT o en el parámetro @NumSalida que está declarado como output.
CREATE Procedure [dbo].[proc_MaesSemillasGeneraCodigo]
@NumSalida Varchar(15) Output,
@NombCampo VarChar (30),
@Serie varchar(15),
@Tam int,
@MostSelect Varchar(1)='N'
As
BEGIN
Set nocount on
Declare @Valor bigint , @Mens Varchar (150), @NumReg int=0
Set @Mens='No existe semilla '+ @NombCampo
/*Evalua si existe el tipo de documento enviado en la variable @NombCampo*/
If not Exists(Select * From MaesSemillas Where RTRIM(NombCampo) = @NombCampo AND Serie=@Serie)
RAISERROR (@Mens, 16, 1);
/*El while es el que se encarga de evitar la concurrencia (Que dos usuarios del sistema generen el mismo correlativo para un mismo tipo de dodumento), evaluado que el valor generado en (1) no haya cambiado hasta llegar el Update (2), ya que es ahí donde se incrementa el contador del correlativo.*/
While @NumReg=0
Begin
Select @Valor=Valor From MaesSemillas Where RTRIM(NombCampo) = @NombCampo AND Serie=@Serie (1)
Set @NumSalida = Right(Replicate('0',@Tam) + Convert(Varchar,@Valor),@Tam)
Update MaesSemillas Set Valor= Valor+1 Where NombCampo= @NombCampo and Valor=@Valor AND Serie=@Serie (2)
Set @NumReg=@@rowcount
If @MostSelect='S'
Select @NumSalida;
End
Return 0
END
Crearemos un Procedimiento almacenado con los siguientes parámetros:
@NumSalida: En este parámetro se almacena el numero correlativo generado para ser devuelto a la aplicación.
@NombCampo: Aquí se envía el nombre de la variable del tipo de documento para el cuela se va a generar el correlativo.
@Serie: Aquí se envía el número de serie o el año del correlativo del documento si es que lo tuviera, ejemplo en el caso de las factura hay serie 001, 002, 003, etc.
@Tam: Este valor se utiliza para darle formato al correlativo a un tamaño determinado, ejemplo si se envía Tam=10 y el correlativo que sigue para N° de pedido es 10, el valor devuelto por el procedimiento seria 0000000010.
@MostSelect: Este valor indica si el correlativo se devuelve con una sentencia SELECT o en el parámetro @NumSalida que está declarado como output.
CREATE Procedure [dbo].[proc_MaesSemillasGeneraCodigo]
@NumSalida Varchar(15) Output,
@NombCampo VarChar (30),
@Serie varchar(15),
@Tam int,
@MostSelect Varchar(1)='N'
As
BEGIN
Set nocount on
Declare @Valor bigint , @Mens Varchar (150), @NumReg int=0
Set @Mens='No existe semilla '+ @NombCampo
/*Evalua si existe el tipo de documento enviado en la variable @NombCampo*/
If not Exists(Select * From MaesSemillas Where RTRIM(NombCampo) = @NombCampo AND Serie=@Serie)
RAISERROR (@Mens, 16, 1);
/*El while es el que se encarga de evitar la concurrencia (Que dos usuarios del sistema generen el mismo correlativo para un mismo tipo de dodumento), evaluado que el valor generado en (1) no haya cambiado hasta llegar el Update (2), ya que es ahí donde se incrementa el contador del correlativo.*/
While @NumReg=0
Begin
Select @Valor=Valor From MaesSemillas Where RTRIM(NombCampo) = @NombCampo AND Serie=@Serie (1)
Set @NumSalida = Right(Replicate('0',@Tam) + Convert(Varchar,@Valor),@Tam)
Update MaesSemillas Set Valor= Valor+1 Where NombCampo= @NombCampo and Valor=@Valor AND Serie=@Serie (2)
Set @NumReg=@@rowcount
If @MostSelect='S'
Select @NumSalida;
End
Return 0
END
Comentarios
Publicar un comentario