Procedimiento con cursor variable
Gracias Leo por tu ayuda ... me explico un poquito más.
Estoy realzando un procedimiento almacenado que me devuelve un Inventario retroactivo a una fecha en base a una consulta sobre la tabla MovimientoAlmacen. Al comentarme que en realidad no se puede hacer un cursor con una consulta dinámica he cambiado un poquito la idea que tenía y la consulta en la que se basa el cursor es siempre la misma, es decir, ya no es dinámica.
Ahora me ha surgido un nuevo problema. En la consulta en la que se basa el cursor he puesto un par de condiciones para tratar los articulos y almacenes que recibe el parametro en 2 listas de IDs que le paso por parametro: Mo.ArticuloId IN (in_ListaArticulos) And Mo.AlmacenId IN (in_ListaAlmacenes).
Llamando al procedimiento de esta manera: call prueba('2017-12-31', '3,4,5,6,7,8', '1,2,3', True) el cursor unicamente recibe las filas de la primera posición de la lista de IDs, es decir como si in_ListaArticulos recibiera unicamente 3 en lugar de 3,4,5,6,7,8 y como si in_ListaAlmacenes recibiera unicamente 1 en lugar de 1,2,3.
Gracias por vuestra colaboración, saludos.
Mikel
Código completo del procedimiento actualmente:
CREATE DEFINER=`root`@`%` PROCEDURE `prueba`(IN in_HastaFecha Date, IN in_ListaArticulos LongText, IN in_ListaAlmacenes LongText, IN in_ExcluirSinExistencia Boolean)
BEGIN
Declare v_ArticuloId_Anterior BigInt(20) Default Null;
Declare v_CodigoArticulo_Anterior VarChar(50) Default Null;
Declare v_NombreArticulo_Anterior VarChar(200) Default Null;
Declare v_AlmacenId_Anterior BigInt(20) Default Null;
Declare v_CodigoAlmacen_Anterior VarChar(50) Default Null;
Declare v_NombreAlmacen_Anterior VarChar(100) Default Null;
Declare v_FamiliaId_Anterior BigInt(20) Default Null;
Declare v_CodigoFamilia_Anterior VarChar(50) Default Null;
Declare v_NombreFamilia_Anterior VarChar(100) Default Null;
Declare v_TipoArticuloId_Anterior BigInt(20) Default Null;
Declare v_CodigoTipoArticulo_Anterior VarChar(20) Default Null;
Declare v_NombreTipoArticulo_Anterior VarChar(300) Default Null;
Declare v_Existencia Decimal(38,6) Default 0;
Declare v_PrecioUltimaEntrada Decimal(38,6) Default 0;
Declare v_PMP Decimal(38,6) Default 0;
Declare v_Tipo VarChar(5) Default Null;
Declare v_ArticuloId BigInt(20) Default Null;
Declare v_CodigoArticulo VarChar(50) Default Null;
Declare v_NombreArticulo VarChar(200) Default Null;
Declare v_AlmacenId BigInt(20) Default Null;
Declare v_CodigoAlmacen VarChar(50) Default Null;
Declare v_NombreAlmacen VarChar(100) Default Null;
Declare v_FamiliaId BigInt(20) Default Null;
Declare v_CodigoFamilia VarChar(50) Default Null;
Declare v_NombreFamilia VarChar(100) Default Null;
Declare v_TipoArticuloId BigInt(20) Default Null;
Declare v_CodigoTipoArticulo VarChar(20) Default Null;
Declare v_NombreTipoArticulo VarChar(300) Default Null;
Declare v_FechaHora DateTime Default Null;
Declare v_CantidadAlmacen Decimal(38,6) Default 0;
Declare v_Precio Decimal(38,6) Default 0;
Declare v_ParaCalculoPrecioUltimaEntrada Boolean Default Null;
Declare v_ParaCalculoPMP Boolean Default Null;
Declare Fin_C_Movimientos Boolean Default False;
Declare C_Movimientos Cursor For
Select TM.Tipo, Mo.ArticuloId, Ar.Codigo As CodigoArticulo, Ar.Nombre As NombreArticulo, Mo.AlmacenId, Al.Codigo As CodigoAlmacen, Al.Nombre As NombreAlmacen,
Ar.FamiliaId, Fa.Codigo As CodigoFamilia, Fa.Nombre As NombreFamilia, Ar.TipoArticuloId, TA.Abreviatura As CodigoTipoArticulo, TA.Descripcion As NombreTipoArticulo,
Mo.FechaHora, Mo.CantidadAlmacen, Mo.Precio, TM.ParaCalculoPrecioUltimaEntrada, TM.ParaCalculoPMP
From MovimientoAlmacen As Mo
Left Outer Join TipoMovimiento As TM On Mo.TipoMovimientoId = TM.TipoMovimientoId
Left Outer Join Articulo As Ar On Mo.ArticuloId = Ar.ArticuloId
Left Outer Join Almacen As Al On Mo.AlmacenId = Al.AlmacenId
Left Outer Join Familia As Fa On Ar.FamiliaId = Fa.FamiliaId
Left Outer Join TablaGeneral As TA On Ar.TipoArticuloId = TA.TablaGeneralId
Where Mo.ArticuloId Is Not Null And Date(Mo.FechaHora) <= in_HastaFecha And Mo.ArticuloId IN (in_ListaArticulos) And Mo.AlmacenId IN (in_ListaAlmacenes)
Order By Mo.ArticuloId, Mo.FechaHora, Mo.AlmacenId, Mo.UbicacionId;
Declare Continue Handler For Not Found Set Fin_C_Movimientos = True;
Drop Temporary Table If exists zzzInventarioTemporal;
Create Temporary Table zzzInventarioTemporal (ArticuloId BigInt(20), CodigoArticulo VarChar(50), NombreArticulo VarChar(200),
AlmacenId BigInt(20), CodigoAlmacen VarChar(50), NombreAlmacen VarChar(100),
FamiliaId BigInt(20), CodigoFamilia VarChar(50), NombreFamilia VarChar(100),
TipoArticuloId BigInt(20), CodigoTipoArticulo VarChar(20), NombreTipoArticulo VarChar(300),
Existencia Decimal(38,6), PrecioUltimaEntrada Decimal(38,6), PMP Decimal(38,6));
Set v_ArticuloId_Anterior = 0;
Set v_CodigoArticulo_Anterior = '';
Set v_NombreArticulo_Anterior = '';
Set v_AlmacenId_Anterior = 0;
Set v_CodigoAlmacen_Anterior = '';
Set v_NombreAlmacen_Anterior = '';
Set v_FamiliaId_Anterior = 0;
Set v_CodigoFamilia_Anterior = '';
Set v_NombreFamilia_Anterior = '';
Set v_TipoArticuloId_Anterior = 0;
Set v_CodigoTipoArticulo_Anterior = '';
Set v_NombreTipoArticulo_Anterior = '';
Set v_Existencia = 0;
Set v_PrecioUltimaEntrada = 0;
Set v_PMP = 0;
Open C_Movimientos;
Loop_C_Movimientos: LOOP
Fetch C_Movimientos Into
v_Tipo, v_ArticuloId, v_CodigoArticulo, v_NombreArticulo, v_AlmacenId, v_CodigoAlmacen, v_NombreAlmacen,
v_FamiliaId, v_CodigoFamilia, v_NombreFamilia, v_TipoArticuloId, v_CodigoTipoArticulo, v_NombreTipoArticulo,
v_FechaHora, v_CantidadAlmacen, v_Precio, v_ParaCalculoPrecioUltimaEntrada, v_ParaCalculoPMP;
If Fin_C_Movimientos = True Then
If v_ArticuloId_Anterior <> 0 And (v_Existencia <> 0 Or in_ExcluirSinExistencia = False) Then
Insert Into zzzInventarioTemporal Values
(v_ArticuloId_Anterior, v_CodigoArticulo_Anterior, v_NombreArticulo_Anterior, v_AlmacenId_Anterior, v_CodigoAlmacen_Anterior, v_NombreAlmacen_Anterior,
v_FamiliaId_Anterior, v_CodigoFamilia_Anterior, v_NombreFamilia_Anterior,
v_TipoArticuloId_Anterior, v_CodigoTipoArticulo_Anterior, v_NombreTipoArticulo_Anterior,
v_Existencia, v_PrecioUltimaEntrada, v_PMP);
End If;
Leave Loop_C_Movimientos;
End If;
IF v_ArticuloId <> v_ArticuloId_Anterior Or v_AlmacenId <> v_AlmacenId_Anterior Then
If v_ArticuloId_Anterior <> 0 And (v_Existencia <> 0 Or in_ExcluirSinExistencia = False) Then
Insert Into zzzInventarioTemporal Values
(v_ArticuloId_Anterior, v_CodigoArticulo_Anterior, v_NombreArticulo_Anterior, v_AlmacenId_Anterior, v_CodigoAlmacen_Anterior, v_NombreAlmacen_Anterior,
v_FamiliaId_Anterior, v_CodigoFamilia_Anterior, v_NombreFamilia_Anterior,
v_TipoArticuloId_Anterior, v_CodigoTipoArticulo_Anterior, v_NombreTipoArticulo_Anterior,
v_Existencia, v_PrecioUltimaEntrada, v_PMP);
End If;
Set v_ArticuloId_Anterior = v_ArticuloId;
Set v_CodigoArticulo_Anterior = v_CodigoArticulo;
Set v_NombreArticulo_Anterior = v_NombreArticulo;
Set v_AlmacenId_Anterior = v_AlmacenId;
Set v_CodigoAlmacen_Anterior = v_CodigoAlmacen;
Set v_NombreAlmacen_Anterior = v_NombreAlmacen;
Set v_FamiliaId_Anterior = v_FamiliaId;
Set v_CodigoFamilia_Anterior = v_CodigoFamilia;
Set v_NombreFamilia_Anterior = v_NombreFamilia;
Set v_TipoArticuloId_Anterior = v_TipoArticuloId;
Set v_CodigoTipoArticulo_Anterior = v_CodigoTipoArticulo;
Set v_NombreTipoArticulo_Anterior = v_NombreTipoArticulo;
Set v_Existencia = 0;
Set v_PrecioUltimaEntrada = 0;
Set v_PMP = 0;
End If;
Case
When v_Tipo = 'PA' Then
Set v_Existencia = v_CantidadAlmacen;
When Left(v_Tipo,1) = 'E' Then
Set v_Existencia = v_Existencia + v_CantidadAlmacen;
When Left(v_Tipo,1) = 'S' Then
Set v_Existencia = v_Existencia - v_CantidadAlmacen;
Else
Set v_Existencia = v_Existencia;
End Case;
If v_ParaCalculoPrecioUltimaEntrada = True Then
Set v_PrecioUltimaEntrada = v_Precio;
End If;
End Loop Loop_C_Movimientos;
Close C_Movimientos;
Select * From zzzInventarioTemporal;
Drop Temporary Table If exists zzzInventarioTemporal;
END