Esta es la tercera entrega de la primera parte, que son los procedimientos almacenados, aquí es donde viene la programación pura y la lógica de negocio, tratare de ser lo más claro posible en la explicación de la creación de los procedimientos almacenados. Si existe alguna duda en alguno de ellos pueden contactarme o dejarla en sus comentarios.
Comenzaremos explicando, que es un procedimiento almacenado, aquí una definición:
Procedimiento almacenado:
(stored OF procedure en inglés) es un programa (o procedimiento) el cual es almacenado físicamente en una base de datos. Su implementación varía de un gestor de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal posee acceso directo a los datos que necesita manipular y sólo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes. [es.wikipedia.org/]
La definición de los procedimientos almacenados en SQL Server 2008 son mediante Transact-SQL
La Sintaxis es la siguiente:
CREATE PROCEDURE <nombre_del_procedimiento>
-- cometarios se hacen con dos guiones seguidos "--"
@<nombre_parametro1><tipo>(<tamaño>)
,@<nombre_parametro2><tipo>(<tamaño>)
AS
BEGIN --indica el inicio del codigo
-- SET NOCOUNT ON Evita que se devuelva el recuento del número de filas afectadas
-- en la sentencias SELECT
SET NOCOUNT ON;
--Aqui va el codigo del procedimiento
...
...
END
GO
Cuando hacemos varias modificaciones en un procedimiento como inserciones, eliminaciones, actualizaciones, etc. condicionadas entre ellas, es decir, si se realiza una venta de algún artículo se debe hacer la inserción de la venta y la eliminación del artículo en el almacén, para evitar una inconsistencia en los datos por causa de un error al momento de realizar alguna de las dos modificaciones como la falla de la conexión o error en una de estas, debemos cerciorarnos que se realicen ambas transacciones o ninguna. Existe un método para hacer esto y crear una sola transacción que englobe todas las modificaciones y verifica si existe algún error entonces se cancelan o se revierten todas las modificaciones de datos, podemos combinarlas en los procedimientos almacenados y esas son las transacciones las cuales tiene, se confirman con la sentencia COMMIT(para confirmar) o ROLLBACK (para revertir).
De esta manera se pueden combinar:
CREATE PROCEDURE <nombre_del_procedimiento>
-- cometarios se hacen con dos guiones seguidos "--"
@<nombre_parametro1><tipo>(<tamaño>)
,@<nombre_parametro2><tipo>(<tamaño>)
AS
-- SET NOCOUNT ON Evita que se devuelva el recuento del número de filas afectadas
-- en la sentencias SELECT
SET NOCOUNT ON;
BEGIN TRAN --indica el inicio de las transacciones
--Aqui va el codigo del procedimiento
...
...
IF @@ERROR = 0 --llamamos a la funcion del sistema @@ERROR
--evaluamos si nos devuelve un cero
BEGIN --apertura del bloque de sentecias
COMMIT TRAN -- si devuelve un cero comprometemos o realizamos la transaccion
END --cierre del bloque de sentencias
ELSE -- en caso contrario (si no)
BEGIN --apertura del bloque de sentecias
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1) --generamos un error.
ROLLBACK -- revertimos todos los cambios
END --cierre del bloque de sentencias
--no lleva cierre del procedimiento Almacenado
Aquí tenemos la posibilidad con la función RAISERROR de crear y capturar un error para poder manejar una cadena de texto en Visual Studio y darle información al usuario sobre el error. La función RAISERROR recibe 3 parámetros,el mensaje del error, la severidad y el estado.
La severidad indica el grado de criticidad del error. Admite valores de 0 al 25, pero solo podemos asignar valores del 0 al 18. Los errores el 20 al 25 son considerados fatales por el sistema, y cerraran la conexión que ejecuta el comando RAISERROR. Para asignar valores del 19 al 25 necesitares ser miembros de la función de SQL Server sysadmin.
El estado es un valor para permitir que el programador identifique el mismo error desde diferentes partes del código, admite valores entre 1 al 127 y permite tratar. Si desean más información les dejo aquí un link de uno excelentes tutoriales que me ayudaron mucho. [devjoker.com]
Creación de una función.
Nuestro sistema tendrá la necesidad de crear llaves primarias para la venta de cada boleto y para el número de venta por eso crearemos una función que nos cree llaves únicas. Esta función recibirá dos parámetros uno tipo int,y otro tipo nvarchar, nos devolverá un nvarchar de tamaño 50, esta función convertirá el int en nvarchar y lo concatenara con el segundo parámetro para hacer una llave única.
CREATE FUNCTION nvoNumeroTer(@pasaSemilla int,@ident nvarchar(50)) --funcion para obtener convertir un numero entero a cadena de caracteres --agregandole un identificador al inicio de la cadena RETURNS nvarchar(50) --retornamos una cadena de longitud maxima de 50 AS BEGIN --declaramos una variable que retornaremos DECLARE @dato nvarchar(50) --primero convertimos la variable entera con la funcion CAST a --nvarchar despues la concatenamos con el identificador inicial --que llevara la cadena y la asignamos a la variable @dato SET @dato=(@ident+(CAST(@pasaSemilla AS nvarchar))) --al final retornamos la variable @dato RETURN @dato END GO
Creación de Procedimientos almacenados.
Comprobación de cuenta
Crearemos un procedimiento para comprobar la contraseña y el nombre de
usuario de la base de datos, pasándole al procedimiento almacenado dos
parámetros de entrada que son el nombre de usuario y la contraseña, por ultimo
tendrá un parámetro de salida o “output” tipo bit o booleano este servirá para
evaluar si la contraseña fue correcta o no.
CREATE PROCEDURE compruebaCuenta
@NombUsuarioCC nvarchar(50), -- parametro de entrada para recibir el nombre de usuario
@NumPinCC nvarchar(50), -- parametro de entrada papara recibir la contraseña
@pinCorrecto bit output -- parametro de salida para saber si es correcta la contraseña
--procedimiento para comprobar el pin de una cuenta
--pedimos el nombre de la cuenta y su pin
--tenemos una variable de output para dar uan respuesta
--si el pin es correcto o no
AS
SET NOCOUNT ON;
BEGIN TRAN
--primero comprobamos si el nombre de usuario existe
-- la funcion NOT EXISTS retorna true si no encuentra filas
IF NOT EXISTS(SELECT nombUsuario FROM Usuarios WHERE nombUsuario = @nombUsuarioCC)
BEGIN
RAISERROR('EL NOMBRE DE USUARIO NO EXISTE (intente de nuevo)',16,1)
ROLLBACK
END
ELSE
BEGIN
--despues verificamos si la cuenta esta habilitada
--cuentaHabilitada es tipo bit si es true sera 1 lo compraramos y si nos retorna
--un true es por que esta habilitada
IF((SELECT cuentaHabilitada FROM Usuarios WHERE nombUsuario =@nombUsuarioCC)=1)
BEGIN
--ahora comprobamos si el pin es correcto y asignamos true
--a la variable output
IF((SELECT contraseña FROM Usuarios WHERE nombUsuario=@nombUsuarioCC)=@NumPinCC)
BEGIN
SET @pinCorrecto=1
END
ELSE
--si no asignamos false
BEGIN
SET @pinCorrecto=0
END
--si no hay errores comprometemos la transaccion
IF @@ERROR=0
BEGIN
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1)
ROLLBACK
END
END
ELSE
--si la cuenta esta deshabilitada arrojamos el error
BEGIN
RAISERROR('EL USUARIO ESTA DESHABILIDADO',16,1)
ROLLBACK
END
END
GO
Inicio de caja.
Al iniciar caja el campo “abierta” tipo bit cambiara a
true, y se le asignara el “idCaja“ al usuario que abrió la caja en el
campo “cajaAsignada”
CREATE PROCEDURE IniciaCaja
@efectivoIC money,
@idSucursalIC nvarchar(50),
@idCajaIC nvarchar(50),
@nomUsuarioIC nvarchar(50)
--el procedimiento almacenado
--inica caja y se la asigna a un usuario
AS
SET NOCOUNT ON
BEGIN TRAN
--Verificamos si la caja que queremos iniciar ya esta abierta o no
IF((SELECT abierta FROM Cajas WHERE idCaja=@idCajaIC)=0)
BEGIN
--si el valor es 0 indica que esta cerrada
--ingresamos la apertura
INSERT INTO inicioCaja
(idCaja
,idSucursal
,nombUsuario
,fechaApertura
,efectivoApertura)
VALUES
(@idCajaIC
,@idSucursalIC
,@nomUsuarioIC
,GETDATE() ---Esta funcion retorna la fecha del sistema de BD
,@efectivoIC)
--actualizamos el valor de caja abierta a verdadero
UPDATE Cajas
SET abierta =1
WHERE idCaja = @idCajaIC
--le asignamos la caja al usuario
UPDATE Usuarios
SET cajaAsignada=@idCajaIC
WHERE nombUsuario=@nomUsuarioIC
--comprobamos errores
IF @@ERROR=0
COMMIT TRAN
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1)
ROLLBACK
END
END
ELSE
BEGIN
--si no indicamos que la caja esta abierta o iniciada
RAISERROR('ESTA CAJA YA SE HA INICIADO (SELECCIONE OTRA)',16,1)
ROLLBACK
END
GO
Venta de Boletos
Crearemos una nueva tabla
con las mismas columnas de la tabla Boletos además de un campo auto-incrementable de uno en uno tipo identity llamado semilla el cual será para
crear las llaves primarias, esta tabla nos servirá para guardar los boletos que
se deseen en una sola venta, sin importar si son a diferentes destinos y para
evitar que se guarden datos en las tablas relacionadas del sistema hasta que se
finalice y confirme la venta los copiaremos a las tablas reales
CREATE TABLE ref_Boletos(
idBoleto nvarchar(50) NOT NULL,
idCorrida nvarchar(50) NOT NULL,
lugarDestino nvarchar(50) NOT NULL,
lugarSalida nvarchar(50) NOT NULL,
nombCliente nvarchar(50) NOT NULL,
edad int NULL,
idVenta nvarchar(50) NOT NULL,
fechaSalida datetime NOT NULL,
precio money NOT NULL,
clase nvarchar(50) NOT NULL,
numAsiento int NOT NULL,
idAutobus nvarchar(50) NOT NULL,
idSucursal nvarchar(50) NOT NULL,
semilla int IDENTITY(1,1) NOT NULL
)
También modificaremos la tabla ventas agregándole una columna más llamada “semilla” también tipo IDENTITY para las llaves primarias de ventas , con la siguiente instrucción lo hacemos.
ALTER TABLE Ventas ADD semilla INT IDENTITY(1,1) NOT NULL
Pueden aprender un poco más sobre los campos IDENTITY, en este link que
está bastante claro su explicación y funciones [grimpidev.wordpress.com]
El siguiente procedimiento almacenado es para agregar un boleto a la
venta, por medio de uno de los parámetros de entrada, llamado @nuevaVenta tipo bit, lo
utilizaremos para saber si se ejecuta este procedimiento para agregar otro
boleto a la misma venta, o si es una nueva venta, de ser una nueva venta
eliminaremos todas las filas que existan de la tabla ref_Boletos para agregar nuevos
datos y no copiar los datos de los boletos de ventas anteriores.
CREATE PROCEDURE NuevoBoleto
@CorridaNB nvarchar(50)
,@lugarDestinoNB nvarchar(50)
,@lugarSalidaNB nvarchar(50)
,@NomClienteNB nvarchar(50)
,@edadNB int
,@precioNB money
,@claseNB nvarchar(50)
,@numAsientoNB int
,@idSucursalNB nvarchar(50)
,@nuevaVenta bit
AS
SET NOCOUNT ON;
BEGIN TRAN
--Verificamos si es una nueva venta eliminamos todos los datos de la tabla anteriores
IF(@nuevaVenta=1)
BEGIN
--Eliminamos todo loq eu tenga la tabla de ref para evitar errores
DELETE FROM ref_Boletos
END
--hacemos la insercion de los datos ee la tabla ref_Boletos
INSERT INTO ref_Boletos
(idBoleto
,idCorrida
,lugarDestino
,lugarSalida
,nombCliente
,edad
,idVenta
,fechaSalida
,precio
,clase
,numAsiento
,idAutobus
,idSucursal)
VALUES
((SELECT dbo.nvoNumeroTer( (SELECT IDENT_CURRENT('ref_Boletos'))+1,'BT'))
,@CorridaNB
,@lugarDestinoNB
,@lugarSalidaNB
,@NomClienteNB
,@edadNB
,(SELECT dbo.nvoNumeroTer( (SELECT IDENT_CURRENT('VENTAS'))+1,'VT'))
,(SELECT fechaSalida FROM Corridas WHERE idCorrida = @CorridaNB)
,@precioNB
,@claseNB
,@numAsientoNB
,(SELECT idAutobus FROM Corridas WHERE idCorrida = @CorridaNB)
,@idSucursalNB)
--Comprobamos errores y conformamos la transaccion
IF @@ERROR = 0
BEGIN
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1)
ROLLBACK
END
GO
La función IDENT_CURRENT('Nombre_Tabla'), nos retorna el ultimo
valor autogenerado del campo IDENTITY de la tabla que se le pasa como una cadena de caracteres.
Al finalizar y confirmar la venta se ejecutara el siguiente
procedimiento para ingresar y dar de alta la venta en la base de datos, en este
paso aun podemos copiar los boletos de esta venta a la tabla Boletos aun, debido a
que el idVenta de la misma no existe hasta que se termina de ejecutar este
procedimiento almacenado, asi que la mejor opcion para copiar los boletos sera
un trigger que se ejecute despues de insertar una columna en la tabla ventas.
CREATE PROCEDURE NuevaVentaBoleto
@nomUsuarioNV nvarchar(50)
,@idCaja nvarchar(50)
AS
SET NOCOUNT ON;
BEGIN TRAN
--hacemos la insercion de la venta
INSERT INTO Ventas
(idVenta
,nombUsuario
,idCaja
,importeVenta
,fechaVenta
,numBoletos)
VALUES
((SELECT DISTINCT idVenta FROM ref_Boletos) --tomamos el id venta de los boletos
,@nomUsuarioNV
,@idCaja
,(SELECT SUM(precio) FROM ref_Boletos) --sumamos todos los precios de los boletos
,GETDATE()
,(SELECT COUNT(idBoleto) FROM ref_Boletos)) --contamos todos los boletos
--Comprobamos errores y conformamos la transaccion
IF @@ERROR = 0
BEGIN
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1)
ROLLBACK
END
GO
Trigger de la Venta
Una vez que se aya insertado una fila en la tabla Ventas, se copiaran los
boletos de esta venta a la tabla relacionada de la base de datos, si por
alguna cuestión llega a fallar por algun error de conexion o
cualquier otro el sistema revierte todos los cambios que se hacen desde este
trigger hasta el procedimiento donde se creo la insercion de la tabla venta.
CREATE TRIGGER CopiaBoletosVendidos
ON Ventas
AFTER INSERT
AS
BEGIN
BEGIN TRAN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
--copiamos los boletos que vendimos a la tabla de boletos
INSERT INTO Boletos
(idBoleto
,idCorrida
,lugarDestino
,lugarSalida
,nombCliente
,edad
,idVenta
,fechaSalida
,precio
,clase
,numAsiento
,idAutobus
,idSucursal)
SELECT ref_Boletos.idBoleto
,ref_Boletos.idCorrida
,ref_Boletos.lugarDestino
,ref_Boletos.lugarSalida
,ref_Boletos.nombCliente
,ref_Boletos.edad
,ref_Boletos.idVenta
,ref_Boletos.fechaSalida
,ref_Boletos.precio
,ref_Boletos.clase
,ref_Boletos.numAsiento
,ref_Boletos.idAutobus
,ref_Boletos.idSucursal
FROM ref_Boletos
---------------------------------------------------------------
---------si no ocurre un error finalizamos la tranzaccion
IF @@ERROR=0
BEGIN
COMMIT TRAN
END
---si no la cancelamos---------------------------------------
ELSE
BEGIN
RAISERROR ('HA OCURRIDO UN ERROR INTENTELO DE NUEVO', 16, 1 )
ROLLBACK
END
END
GO
Procedimiento para la cancelación.
En este caso al ser un boleto el cual creamos a partir de ningún
inventario podemos simplemente eliminarlo, en este caso también agregaremos un
campo a la tabla de cancelaciones para guardar algunos datos de la
cancelación, en la tabla de cancelaciones podemos agregar
más datos del boleto si es que se necesitan.
CREATE PROCEDURE CancelaBoleto
@idBoletoCB nvarchar(50),
@idCajaCB nvarchar(50),
@nomUsuarioCB nvarchar(50),
@devolucionBoleto money output
AS
SET NOCOUNT ON;
BEGIN TRAN
IF NOT EXISTS(SELECT idBoleto FROM Boletos WHERE idBoleto=@idBoletoCB)
BEGIN
RAISERROR('EL BOLETO NO EXISTE (verifique el numero)',16,1)
ROLLBACK
END
ELSE
BEGIN
--declaramos las variables que utilizaremos en para guardar
--el numero de boletos vendidos, y el numero de la venta
DECLARE @numBoletosCB int,@numVentaCB nvarchar(50),@precioboleto money
---guardamos la devolucion del boleto para saber cuanto es lo que devolveremos
SET @precioboleto= (SELECT precio FROM Boletos WHERE idBoleto = @idBoletoCB)
--Obtenemos el numero de venta para saber cual es el que actualizaremos
SET @numVentaCB=(SELECT idVenta FROM Boletos WHERE idBoleto=@idBoletoCB)
DELETE FROM Boletos WHERE idBoleto=@idBoletoCB
SET @numBoletosCB=(SELECT numBoletos FROM Ventas WHERE idVenta=@numVentaCB)
IF(@numBoletosCB=1)
BEGIN
DELETE FROM Ventas WHERE idVenta = @numVentaCB
END
ELSE
BEGIN
UPDATE Ventas SET numBoletos=(numBoletos-1)
,importeVenta=(importeVenta-@precioboleto)
WHERE idVenta = @numVentaCB
END
INSERT INTO Cancelaciones
(idBoleto
,importe
,fechaCancelacion
,idCaja
,nombUsuario)
VALUES
(@idBoletoCB
,@precioboleto
,GETDATE()
,@idCajaCB
,@nomUsuarioCB)
--si no hay errores comprometemos la transaccion
IF @@ERROR=0
BEGIN
SET @devolucionBoleto=@precioboleto
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR (intente de nuevo)',16,1)
ROLLBACK
END
END
GO
Corte de caja.
Para realizar el corte de caja basta con simples consultas del total de
ventas y cancelaciones, crearemos un procedimiento almacenado para enviar los
datos con parámetros de “output” a la aplicación en Visual Studio antes de cerrar
la caja, solo como información para el usuario y pueda verificar el efectivo de
caja con lo que marca el sistema.
CREATE PROCEDURE VerificaCorteCaja
@idCajaVC nvarchar(50),
@EfectivoIni money output,
@totalVentas money output,
@totalEfectivo money output,
@numVentasVC int output,
@boletosVendido int output,
@boletosCancelado int output,
@totalCancelaciones money output
AS
SET NOCOUNT ON
BEGIN TRAN
IF((SELECT abierta FROM Cajas WHERE idCaja=@idCajaVC)=1)
BEGIN
DECLARE @fechaAperturaMax datetime
SET @fechaAperturaMax=(SELECT MAX(fechaApertura)
FROM inicioCaja WHERE idCaja=@idCajaVC)
IF NOT EXISTS(SELECT efectivoApertura FROM inicioCaja
WHERE idCaja=@idCajaVC and fechaApertura=@fechaAperturaMax)
BEGIN
SET @EfectivoIni=0
END
ELSE
BEGIN
SET @EfectivoIni=(SELECT efectivoApertura FROM inicioCaja
WHERE idCaja=@idCajaVC and fechaApertura=@fechaAperturaMax)
END
IF NOT EXISTS(SELECT importeVenta FROM Ventas
WHERE idCaja=@idCajaVC and fechaVenta>=@fechaAperturaMax)
BEGIN
SET @totalVentas=0
END
ELSE
BEGIN
SET @totalVentas=(SELECT SUM(importeVenta) FROM Ventas
WHERE idCaja=@idCajaVC and fechaVenta>=@fechaAperturaMax)
END
SET @totalEfectivo=@EfectivoIni+@totalVentas
SET @numVentasVC=(SELECT COUNT(idVenta)FROM Ventas
WHERE idCaja=@idCajaVC and fechaVenta>=@fechaAperturaMax)
IF NOT EXISTS(SELECT numBoletos FROM Ventas
WHERE idCaja=@idCajaVC and fechaVenta>=@fechaAperturaMax)
BEGIN
SET @boletosVendido=0
END
ELSE
BEGIN
SET @boletosVendido=(SELECT SUM(numBoletos)FROM Ventas
WHERE idCaja=@idCajaVC and fechaVenta>=@fechaAperturaMax)
END
SET @boletosCancelado=(SELECT COUNT(idBoleto)FROM Cancelaciones
WHERE fechaCancelacion>=@fechaAperturaMax )
IF NOT EXISTS(SELECT idBoleto FROM Cancelaciones
WHERE fechaCancelacion>=@fechaAperturaMax )
BEGIN
SET @totalCancelaciones=0
END
ELSE
BEGIN
SET @totalCancelaciones=(SELECT SUM(importe) FROM Cancelaciones
WHERE fechaCancelacion>=@fechaAperturaMax )
END
IF @@ERROR =0
COMMIT TRAN
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR EN CARGAR LOS DATOS INTENTE DE NUEVO',16,1)
ROLLBACK
END
END
ELSE
BEGIN
RAISERROR('LA CAJA ESTA CERRADA',16,1)
ROLLBACK
END
GO
Por ultimo creamos el procedimiento para realizar el corte de caja,
cerrar la caja y actualizaremos al usuario que realizo la apertura de caja.
CREATE PROCEDURE RealizaCorte
@idCajaRC nvarchar(50),
@nomUsuarioRC nvarchar(50)
AS
SET NOCOUNT ON
BEGIN TRAN
IF((SELECT abierta FROM Cajas WHERE idCaja=@idCajaRC)=1)
BEGIN
DECLARE
@fechaApeMax datetime,
@EfectivoIniRC money ,
@totalVentasRC money ,
@totalEfectivoRC money ,
@numVentasRC int ,
@boletosVendidoRC int ,
@boletosCanceladoRC int ,
@totalCancelacionesRC money
SET @fechaApeMax=(SELECT MAX(fechaApertura)
FROM inicioCaja WHERE idCaja=@idCajaRC)
IF NOT EXISTS(SELECT efectivoApertura FROM inicioCaja
WHERE idCaja=@idCajaRC and fechaApertura=@fechaApeMax)
BEGIN
SET @EfectivoIniRC=0
END
ELSE
BEGIN
SET @EfectivoIniRC=(SELECT efectivoApertura FROM inicioCaja
WHERE idCaja=@idCajaRC and fechaApertura=@fechaApeMax)
END
IF NOT EXISTS(SELECT importeVenta FROM Ventas
WHERE idCaja=@idCajaRC and fechaVenta>=@fechaApeMax)
BEGIN
SET @totalVentasRC=0
END
ELSE
BEGIN
SET @totalVentasRC=(SELECT SUM(importeVenta) FROM Ventas
WHERE idCaja=@idCajaRC and fechaVenta>=@fechaApeMax)
END
SET @totalEfectivoRC=@EfectivoIniRC+@totalVentasRC
SET @numVentasRC=(SELECT COUNT(idVenta)FROM Ventas
WHERE idCaja=@idCajaRC and fechaVenta>=@fechaApeMax)
IF NOT EXISTS(SELECT numBoletos FROM Ventas
WHERE idCaja=@idCajaRC and fechaVenta>=@fechaApeMax)
BEGIN
SET @boletosVendidoRC=0
END
ELSE
BEGIN
SET @boletosVendidoRC=(SELECT SUM(numBoletos)FROM Ventas
WHERE idCaja=@idCajaRC and fechaVenta>=@fechaApeMax)
END
SET @boletosCanceladoRC=(SELECT COUNT(idBoleto)FROM Cancelaciones
WHERE fechaCancelacion>=@fechaApeMax )
IF NOT EXISTS(SELECT idBoleto FROM Cancelaciones
WHERE fechaCancelacion>=@fechaApeMax )
BEGIN
SET @totalCancelacionesRC=0
END
ELSE
BEGIN
SET @totalCancelacionesRC=(SELECT SUM(importe) FROM Cancelaciones
WHERE fechaCancelacion>=@fechaApeMax )
END
INSERT INTO Cortes
(idCaja
,nombUsuario
,numVentas
,numCancelaciones
,importeVentas
,importeCancelaciones
,efectivoTotal
,fechaCorte)
VALUES
(@idCajaRC
,@nomUsuarioRC
,@numVentasRC
,@boletosCanceladoRC
,@totalVentasRC
,@totalCancelacionesRC
,@totalEfectivoRC
,GETDATE())
--se actualiza el usuario
UPDATE Usuarios
SET cajaAsignada=''
WHERE nombUsuario=@nomUsuarioRC
--se actualiza el estado de la caja
UPDATE Cajas
SET abierta=0
WHERE idCaja=@idCajaRC
IF @@ERROR =0
COMMIT TRAN
ELSE
BEGIN
RAISERROR('HA OCURRIDO UN ERROR EN CARGAR LOS DATOS INTENTE DE NUEVO',16,1)
ROLLBACK
END
END
ELSE
BEGIN
RAISERROR('LA CAJA ESTA CERRADA',16,1)
END
GO
Estos son los procedimientos almacenados que utilizaremos para crear
nuestro sistema de 3 capas, la primera capa está terminada con los
procedimientos almacenado los podemos probarlos ejecutándolos con el manejador
de base de datos. Para todos aquellos que deseen aprender más sobre el
lenguaje Transact-SQL les sugiero visitar esta excelente página con muy buenos
tutoriales de varios lenguajes.[devjoker.com]
Gracias por seguirnos y les agradezco cualquier aporte y comentario ;)
los espero en la próxima entrega.
No hay comentarios:
Publicar un comentario