377 lines
12 KiB
Transact-SQL
377 lines
12 KiB
Transact-SQL
CREATE OR ALTER PROCEDURE dbo.PA_Bit_BitacoraListByRelations
|
|
@RelacionesXml xml = NULL,
|
|
@RegistrosOmitidos int,
|
|
@RegistrosPorPagina int,
|
|
@CveUsuarioEjecuta int,
|
|
@ErrorMostrar varchar(max) OUTPUT,
|
|
@ErrorTipo int OUTPUT,
|
|
@Return bit OUTPUT
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
SELECT
|
|
@ErrorMostrar = NULL,
|
|
@ErrorTipo = 0,
|
|
@Return = 0;
|
|
|
|
BEGIN TRY
|
|
IF @RegistrosOmitidos < 0 OR @RegistrosPorPagina <= 0
|
|
BEGIN
|
|
SET @ErrorMostrar = 'Los datos de paginación no son válidos.';
|
|
SET @ErrorTipo = 2;
|
|
RETURN;
|
|
END;
|
|
|
|
DECLARE @EsAdministrador bit = 0;
|
|
DECLARE @EsDesarrollador bit = 0;
|
|
|
|
SELECT
|
|
@EsAdministrador = CASE
|
|
WHEN R.NombreRol IN ('SuperUsuario', 'Administrador') THEN 1
|
|
ELSE 0
|
|
END,
|
|
@EsDesarrollador = CASE
|
|
WHEN R.NombreRol = 'Empresa' THEN 1
|
|
ELSE 0
|
|
END
|
|
FROM dbo.Sis_Usuarios AS U
|
|
INNER JOIN dbo.Sis_Roles AS R
|
|
ON R.CveRol = U.CveRol
|
|
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
|
AND U.Activo = 1
|
|
AND R.Activo = 1;
|
|
|
|
DECLARE @Filtros TABLE
|
|
(
|
|
Orden int NOT NULL PRIMARY KEY,
|
|
NombreTablaSQL varchar(128)
|
|
COLLATE Modern_Spanish_CS_AS NOT NULL,
|
|
NombreCampoSQL varchar(128)
|
|
COLLATE Modern_Spanish_CS_AS NOT NULL,
|
|
Valor nvarchar(250)
|
|
COLLATE Modern_Spanish_CS_AS NOT NULL
|
|
);
|
|
|
|
IF @RelacionesXml IS NOT NULL
|
|
BEGIN
|
|
INSERT INTO @Filtros
|
|
(
|
|
Orden,
|
|
NombreTablaSQL,
|
|
NombreCampoSQL,
|
|
Valor
|
|
)
|
|
SELECT
|
|
R.value('@Orden', 'int'),
|
|
R.value('@Tabla', 'varchar(128)'),
|
|
R.value('@Campo', 'varchar(128)'),
|
|
R.value('@Valor', 'nvarchar(250)')
|
|
FROM @RelacionesXml.nodes('/Relaciones/Relacion') AS X(R);
|
|
END;
|
|
|
|
DECLARE @FiltrosResueltos TABLE
|
|
(
|
|
Orden int NOT NULL PRIMARY KEY,
|
|
CveTabla int NOT NULL,
|
|
CveCampo int NOT NULL,
|
|
TipoDatoSQL varchar(128)
|
|
COLLATE Modern_Spanish_CS_AS NOT NULL,
|
|
Valor nvarchar(250)
|
|
COLLATE Modern_Spanish_CS_AS NOT NULL,
|
|
EsEntero bit NOT NULL
|
|
);
|
|
|
|
INSERT INTO @FiltrosResueltos
|
|
(
|
|
Orden,
|
|
CveTabla,
|
|
CveCampo,
|
|
TipoDatoSQL,
|
|
Valor,
|
|
EsEntero
|
|
)
|
|
SELECT
|
|
F.Orden,
|
|
T.CveTabla,
|
|
C.CveCampo,
|
|
C.TipoDatoSQL,
|
|
F.Valor,
|
|
CASE
|
|
WHEN C.TipoDatoSQL IN
|
|
(
|
|
'tinyint',
|
|
'smallint',
|
|
'int',
|
|
'bigint'
|
|
) THEN 1
|
|
ELSE 0
|
|
END
|
|
FROM @Filtros AS F
|
|
INNER JOIN dbo.Bit_Tablas AS T
|
|
ON T.NombreTablaSQL = F.NombreTablaSQL
|
|
AND T.Activo = 1
|
|
INNER JOIN dbo.Bit_Campos AS C
|
|
ON C.CveTabla = T.CveTabla
|
|
AND C.NombreCampoSQL = F.NombreCampoSQL
|
|
AND C.Activo = 1
|
|
WHERE C.TipoDatoSQL IS NOT NULL;
|
|
|
|
IF (SELECT COUNT(1) FROM @Filtros) <>
|
|
(SELECT COUNT(1) FROM @FiltrosResueltos)
|
|
BEGIN
|
|
SET @ErrorMostrar = 'Una relación utiliza una tabla o campo que no está configurado en la bitácora.';
|
|
SET @ErrorTipo = 2;
|
|
RETURN;
|
|
END;
|
|
|
|
IF EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM @FiltrosResueltos
|
|
WHERE EsEntero = 1
|
|
AND TRY_CONVERT(bigint, Valor) IS NULL
|
|
)
|
|
BEGIN
|
|
SET @ErrorMostrar = 'El valor de una relación numérica no es válido.';
|
|
SET @ErrorTipo = 2;
|
|
RETURN;
|
|
END;
|
|
|
|
CREATE TABLE #BitacorasCoincidentes
|
|
(
|
|
CveBitacora bigint NOT NULL PRIMARY KEY,
|
|
FechaMovimiento datetime NOT NULL
|
|
);
|
|
|
|
INSERT INTO #BitacorasCoincidentes
|
|
(
|
|
CveBitacora,
|
|
FechaMovimiento
|
|
)
|
|
SELECT
|
|
B.CveBitacora,
|
|
B.FechaMovimiento
|
|
FROM dbo.Bit_Bitacora AS B
|
|
WHERE
|
|
(
|
|
@EsAdministrador = 1
|
|
OR
|
|
(
|
|
@EsDesarrollador = 1
|
|
AND EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM dbo.Bit_BitacoraRelaciones AS BRCliente
|
|
INNER JOIN dbo.Bit_Tablas AS TCliente
|
|
ON TCliente.CveTabla =
|
|
BRCliente.CveTablaRelacionada
|
|
INNER JOIN dbo.Bit_Campos AS CCliente
|
|
ON CCliente.CveCampo =
|
|
BRCliente.CveCampoRelacion
|
|
AND CCliente.CveTabla = TCliente.CveTabla
|
|
INNER JOIN dbo.Sis_UsuariosClientes AS UC
|
|
ON UC.CveCliente =
|
|
BRCliente.ValorRelacionNumero
|
|
AND UC.CveUsuario = @CveUsuarioEjecuta
|
|
AND UC.Activo = 1
|
|
WHERE BRCliente.CveBitacora = B.CveBitacora
|
|
AND BRCliente.VisibleDesarrollador = 1
|
|
AND TCliente.NombreTablaSQL = 'Clientes'
|
|
AND CCliente.NombreCampoSQL = 'CveCliente'
|
|
)
|
|
)
|
|
)
|
|
AND
|
|
(
|
|
@EsDesarrollador = 0
|
|
OR NOT EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM @FiltrosResueltos AS FCliente
|
|
INNER JOIN dbo.Bit_Tablas AS TClienteFiltro
|
|
ON TClienteFiltro.CveTabla = FCliente.CveTabla
|
|
INNER JOIN dbo.Bit_Campos AS CClienteFiltro
|
|
ON CClienteFiltro.CveCampo = FCliente.CveCampo
|
|
AND CClienteFiltro.CveTabla =
|
|
TClienteFiltro.CveTabla
|
|
WHERE TClienteFiltro.NombreTablaSQL = 'Clientes'
|
|
AND CClienteFiltro.NombreCampoSQL = 'CveCliente'
|
|
AND NOT EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM dbo.Sis_UsuariosClientes AS UCClienteFiltro
|
|
WHERE UCClienteFiltro.CveUsuario =
|
|
@CveUsuarioEjecuta
|
|
AND UCClienteFiltro.CveCliente =
|
|
TRY_CONVERT(bigint, FCliente.Valor)
|
|
AND UCClienteFiltro.Activo = 1
|
|
)
|
|
)
|
|
)
|
|
AND NOT EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM @FiltrosResueltos AS F
|
|
WHERE NOT EXISTS
|
|
(
|
|
SELECT 1
|
|
FROM dbo.Bit_BitacoraRelaciones AS BR
|
|
WHERE BR.CveBitacora = B.CveBitacora
|
|
AND BR.CveTablaRelacionada = F.CveTabla
|
|
AND BR.CveCampoRelacion = F.CveCampo
|
|
AND
|
|
(
|
|
@EsAdministrador = 1
|
|
OR BR.VisibleDesarrollador = 1
|
|
)
|
|
AND
|
|
(
|
|
(
|
|
F.EsEntero = 1
|
|
AND BR.ValorRelacionNumero =
|
|
TRY_CONVERT(bigint, F.Valor)
|
|
)
|
|
OR
|
|
(
|
|
F.EsEntero = 0
|
|
AND BR.ValorRelacionTexto =
|
|
F.Valor COLLATE Modern_Spanish_CS_AS
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
DECLARE @TotalRegistros int;
|
|
|
|
SELECT @TotalRegistros = COUNT(DISTINCT CveBitacora)
|
|
FROM #BitacorasCoincidentes;
|
|
|
|
CREATE TABLE #BitacorasPagina
|
|
(
|
|
CveBitacora bigint NOT NULL PRIMARY KEY,
|
|
Orden int NOT NULL
|
|
);
|
|
|
|
INSERT INTO #BitacorasPagina
|
|
(
|
|
CveBitacora,
|
|
Orden
|
|
)
|
|
SELECT
|
|
C.CveBitacora,
|
|
ROW_NUMBER() OVER
|
|
(
|
|
ORDER BY
|
|
C.FechaMovimiento DESC,
|
|
C.CveBitacora DESC
|
|
)
|
|
FROM #BitacorasCoincidentes AS C
|
|
ORDER BY
|
|
C.FechaMovimiento DESC,
|
|
C.CveBitacora DESC
|
|
OFFSET @RegistrosOmitidos ROWS
|
|
FETCH NEXT @RegistrosPorPagina ROWS ONLY;
|
|
|
|
SELECT @TotalRegistros AS TotalRegistros;
|
|
|
|
SELECT
|
|
B.CveBitacora,
|
|
B.CveTabla,
|
|
T.NombreTablaSQL,
|
|
T.NombreMostrar AS NombreTabla,
|
|
B.CveTipoMovimiento,
|
|
M.Nombre AS TipoMovimiento,
|
|
B.CveDefinicionAccion,
|
|
A.NombreAccion,
|
|
A.DescripcionAccion,
|
|
B.CveUsuarioEjecuta,
|
|
B.CveUsuarioAutoriza,
|
|
B.FechaAutorizacion,
|
|
B.LlaveRegistro,
|
|
B.DescripcionMovimiento,
|
|
B.FechaMovimiento,
|
|
B.DireccionIP,
|
|
B.NombreEquipo,
|
|
B.Modulo
|
|
FROM #BitacorasPagina AS P
|
|
INNER JOIN dbo.Bit_Bitacora AS B
|
|
ON B.CveBitacora = P.CveBitacora
|
|
INNER JOIN dbo.Bit_Tablas AS T
|
|
ON T.CveTabla = B.CveTabla
|
|
INNER JOIN dbo.Bit_TiposMovimiento AS M
|
|
ON M.CveTipoMovimiento = B.CveTipoMovimiento
|
|
LEFT JOIN dbo.Bit_DefinicionesAccion AS A
|
|
ON A.CveDefinicionAccion = B.CveDefinicionAccion
|
|
ORDER BY P.Orden;
|
|
|
|
SELECT
|
|
BC.CveBitacoraCampo,
|
|
BC.CveBitacora,
|
|
BC.CveCampo,
|
|
C.NombreCampoSQL,
|
|
C.NombreMostrar,
|
|
BC.ValorAnterior,
|
|
BC.ValorNuevo
|
|
FROM #BitacorasPagina AS P
|
|
INNER JOIN dbo.Bit_BitacoraCampos AS BC
|
|
ON BC.CveBitacora = P.CveBitacora
|
|
INNER JOIN dbo.Bit_Campos AS C
|
|
ON C.CveCampo = BC.CveCampo
|
|
WHERE @EsAdministrador = 1
|
|
OR C.MostrarEnBitacora = 1
|
|
ORDER BY
|
|
P.Orden,
|
|
BC.CveBitacoraCampo;
|
|
|
|
SELECT
|
|
BR.CveBitacoraRelacion,
|
|
BR.CveBitacora,
|
|
BR.CveTipoRelacion,
|
|
TR.Nombre AS TipoRelacion,
|
|
BR.CveTablaRelacionada,
|
|
T.NombreTablaSQL,
|
|
BR.CveCampoRelacion,
|
|
C.NombreCampoSQL,
|
|
BR.LlaveRegistroRelacionada,
|
|
BR.ValorRelacionNumero,
|
|
BR.ValorRelacionTexto,
|
|
BR.VisibleDesarrollador,
|
|
BR.DescripcionRelacion
|
|
FROM #BitacorasPagina AS P
|
|
INNER JOIN dbo.Bit_BitacoraRelaciones AS BR
|
|
ON BR.CveBitacora = P.CveBitacora
|
|
INNER JOIN dbo.Bit_TiposRelacion AS TR
|
|
ON TR.CveTipoRelacion = BR.CveTipoRelacion
|
|
INNER JOIN dbo.Bit_Tablas AS T
|
|
ON T.CveTabla = BR.CveTablaRelacionada
|
|
LEFT JOIN dbo.Bit_Campos AS C
|
|
ON C.CveCampo = BR.CveCampoRelacion
|
|
AND C.CveTabla = T.CveTabla
|
|
WHERE @EsAdministrador = 1
|
|
OR BR.VisibleDesarrollador = 1
|
|
ORDER BY
|
|
P.Orden,
|
|
BR.CveBitacoraRelacion;
|
|
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SET @ErrorMostrar = 'Ocurrió un error al consultar la bitácora; favor de contactar a Sistemas.';
|
|
SET @ErrorTipo = 1;
|
|
SET @Return = 0;
|
|
|
|
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
|
'Número: ', ERROR_NUMBER(),
|
|
'; Procedimiento: ', COALESCE(
|
|
ERROR_PROCEDURE(),
|
|
'PA_Bit_BitacoraListByRelations'
|
|
),
|
|
'; Línea: ', ERROR_LINE(),
|
|
'; Detalle: ', ERROR_MESSAGE()
|
|
);
|
|
|
|
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH;
|
|
END;
|
|
GO |