sábado, 22 de agosto de 2015

Programación T SQL para llenar o actualizar una tabla

Me vi en la necesidad de agregar todos los productos en  todos los almacenes para poder realizar mis pruebas del  sistema de administración. Programé el siguiente método. que tardó 13 segundos  la primera vez y 7 la segunda vez (cuando ya existían todas las filas)
Lo que hace es buscar por cada producto (5520)  si  éste maneja inventario y si  es así agrega  a cada almacén (23 en total) la cantidad de 500 productos en  existencia.

DECLARE @idProducto char(5)='1';
DECLARE @idAlmacen char(2)='1';
DECLARE @inventario bit;

BEGIN TRY
WHILE  CAST(@idProducto as int)<5520
BEGIN
WHILE  CAST(@idAlmacen as int)<=23
BEGIN
Select @inventario=CAST((Select Inventario from AdmProductos where idProducto=@idProducto) as bit)   
if @inventario=1
BEGIN
IF EXISTS (Select * from AdmProductosAlmacenes where idAlmacen=@idAlmacen AND idProducto=@idProducto)
Update AdmProductosAlmacenes set Entradas=0,Salidas=0,Existencia=500 where idAlmacen=@idAlmacen AND idProducto=@idProducto
        ELSE
Insert into AdmProductosAlmacenes values (@idProducto,@idAlmacen,0,0,0,0,500);
END
else 
print('el producto #'+@idProducto+' no maneja inventario');
select @idAlmacen=(CAST(@idAlmacen as int)+1)

END
   set @idAlmacen='1';
   select @idProducto=(CAST(@idProducto as int)+1)
   print('Producto #'+@idProducto);
END
END TRY
BEGIN CATCH
     print(ERROR_MESSAGE());
END CATCH

sábado, 8 de agosto de 2015

Como hacerle una consulta a otra consulta? Subqueries SQL Server

En ocasiones realizamos consultas que quedan casi perfectas, o nuestro poco conocimiento nos permite arreglar el  resultado sin enredarnos más. Bueno pues para eso usen las consultas sobre consultas
Observen la siguiente imagen fué creada con el siguiente código:

SELECT DISTINCT venta.idVenta, producto.Producto, venta.Precio, 
(SELECT SUM(Cantidad) AS Expr1 FROM Abonos WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS TotalAbonado, 
(SELECT venta.Precio - SUM(Cantidad) AS Expr1 
FROM Abonos AS Abonos_1 
WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS Saldo, 
CONVERT (varchar(10), venta.FechaVenta, 103) AS Fecha FROM Ventas AS venta 
LEFT OUTER JOIN Abonos AS abono ON abono.idCliente = venta.idCliente AND abono.idVenta = venta.idVenta 
LEFT OUTER JOIN Productos AS producto ON producto.idProducto = venta.idProducto 
WHERE venta.idCliente = 1 AND venta.Pagado = 'False' AND venta.Cancelado = 'False'
No importa si no entienden la consulta.. se les va a presentar el caso.
Pero que es eso de null¡ cuando no se encuentran pagos de un artículo las columnas total abonado  y Saldo me aparecen en  blanco
Pues para eso le voy a hacer otra consulta a esta tabla y con el  uso  de la sentencia isnull asignaré valores ami antojo, quedando de la siguiente forma:

Select idVenta,Producto,Precio,isnull(TotalAbonado,0) TotalAbonado,isnull(Saldo,Precio) Saldo,Fecha from  (Select tu primera consulta) as #Temp
o así para traer todas las columnas
Select  * from  (Select tu primera consulta) as #Temp

y si no  entendiste algo  aquí está la consulta completa
Select * from  (SELECT DISTINCT venta.idVenta, producto.Producto, venta.Precio, 
(SELECT SUM(Cantidad) AS Expr1 FROM Abonos WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS TotalAbonado, 
(SELECT venta.Precio - SUM(Cantidad) AS Expr1 
FROM Abonos AS Abonos_1 
WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS Saldo, 
CONVERT (varchar(10), venta.FechaVenta, 103) AS Fecha FROM Ventas AS venta 
LEFT OUTER JOIN Abonos AS abono ON abono.idCliente = venta.idCliente AND abono.idVenta = venta.idVenta 
LEFT OUTER JOIN Productos AS producto ON producto.idProducto = venta.idProducto 
WHERE venta.idCliente = 1 AND venta.Pagado = 'False' AND venta.Cancelado = 'False' ) as #Temp

y el resultado visual,donde la venta 4 no  tiene abonos y muetra valores en las columnas que antes eran null


Sé que lo  vas a necesitar ;)