martes, 19 de febrero de 2013

Clásico Trigger para Actualizar Inventario



Clásico Trigger para actualizar inventario
 

 
 
Cada vez que se efectua una orden (orders) en el detalle de la orden (order details) se almacenan los productos pedidos (productid) y su cantidad (quantity), la cantidad pedida de un producto en el detalle de la orden (order details) debe rebajarse de las Unidades en Inventario  (UnitInStock de la tabla products) de los Productos.
La modificación al inventario se da cada vez que se afecta la tabla detalle de la orden (order details) porque si vendo un producto tengo que hacer una inserción del producto que estoy vendiendo y debe rebajar al inventario (UnitsInStock).  Si borro una fila de la tabla detalle de la orden (order details) porque el cliente ya no quiere ese producto lo esta devolviendo por lo que debe volver a cargarle las unidades al inventario. Y si el cliente en una orden ya hecha ya no quiere cinco unidades de un producto si no 10 entonces debo regresarle al inventario las  5 unidades pedidas anteriormente y luego restarle 10 (a si funciona con los triggers).
Para que este caso se pueda resolver con un trigger debemos tener en cuenta que:
1. Los triggers se ponen sobre la tabla detalle de ordenes (order details) y son varios triggers no solo uno, dicho sea de paso la tabla puede tener mas de un trigger asociado
2. Cuando se inserta un dato en una tabla en SQL Server se crea una tabla temporal con la misma estructura de la tabla donde estoy insertando que se llama inserted esta tabla temporal tiene el dato que se esta insertando.
Igual ocurre cuando se elimina un dato, se crea una tabla temporal que se llama deleted que tiene la misma estructura de la tabla donde estoy borrando y el o los datos que se están eliminando. Y cuando ocurre un Update se crean las dos tablas con la misma estructura de la tabla donde estoy haciendo update, Deleted e Inserted donde deleted tiene el dato antiguo a modificar e inserted tiene el nuevo dato.
3. Cuando se hace un nuevo pedido y se insertan a la tabla detalle de ordenes (order details) el producto y las unidades a pedir debemos tener en cuenta que el trigger se vale de la tabla inserted que se crea con la misma estructura que [order details] para obtener el producto (productid) y la cantidad (quantity) pedida que debe debitar de unidades en estock. Y el trigger quedaria de la siguiente forma:
Create trigger Debitar_Stock
on [order details]
for Insert
as
Update P set P.UnitsInStock=P.UnitsInStock-D.Quantity
from products as P inner join
INSERTED as D on D.ProductID=P.ProductID
4. Cuando es necesario eliminar un registro a la tabla detalle de ordenes (order details) debemos tener en cuenta que el trigger se vale de la tabla deleted que se crea con la misma estructura que [order details] para obtener el producto (productid) y la cantidad (quantity) eliminada que debe regresar a las  unidades en estock. Y el trigger quedaría de la siguiente forma:
Create trigger Regresar_Stock
on [order details]
for Delete
as
Update P set P.UnitsInStock=P.UnitsInStock+D.Quantity
from products as P inner join
DELETED as D on D.ProductID=P.ProductID
 
5. Y cuando ocurre un update se crean las dos tablas Deleted con el dato antiguo a modificarse y Inserted con el dato nuevo que va a modificar por lo que el trigger debe de regresar a inventario lo que esta en Deleted y luego volver a debitar lo que esta en inserted.
Create trigger Actualizar_Stock
on [order details]
for Updete
as
Update P set P.UnitsInStock=P.UnitsInStock+D.Quantity
from products as P inner join
DELETED as D on D.ProductID=P.ProductID
 
Update P set P.UnitsInStock=P.UnitsInStock-D.Quantity
from products as P inner join
INSERTED as D on D.ProductID=P.ProductID
 
 
 
 

jueves, 14 de febrero de 2013

Red Ad-Hoc Inalámbrica


Red Ad-Hoc Inalámbrica
En Windows una Red Wirelesses Ad-Hoc es  red temporal que se crea usando la tarjeta de red inalámbrica del equipo y que permite que otros dispositivos inalámbricos se conecten a esta, creando un grupo de trabajo que nos deja compartir recursos.
En Windows 7 crear una red Ad-Hoc es extremadamente sencillo y aunque hay varios caminos el más sencillo es  abrir el “Centro de redes y recursos compartidos” para esto hacemos clic derecho sobre el icono de la tarjeta de red en nuestra barra de tareas, y luego hacemos clic en “Administrar redes inalámbricas”.

Lo que hará que aparezca la ventana de administración de Redes Inalámbricas, donde tenemos que hacer clic sobre el botón de la esquina superior izquierda de agregar, para agregar manualmente la conexión a una red en una nueva ventana.

En la nueva ventana de “Conectarse manualmente a una red inalámbrica” elegimos “Crear una Red Ad-Hoc” y finalmente en el último paso establecemos el nombre de la red, el protocolo de seguridad y la clave de seguridad.
Los otros dispositivos que se conectaran a nuestra red solo tienen que buscar la red inalámbrica y conectarse a ella usando el protocolo y clave que asignamos.





En Windows 8 este proceso es diferente ya que el “Centro de Redes y  Recursos Compartidos” no trae la opción de “Administrar Redes Inalámbricas” por lo que es necesario realizar los pasos a través de la línea de comandos, usando el comando Netsh.
Netsh es una utilidad de línea de comandos que nos ofrece varias opciones para la configuración de una red. Entre las principales opciones que se pueden realizar, están la posibilidad de ver, modificar, administrar y diagnosticar la configuración de una red.
Así que lo primero será abrir la ventana de línea de comando pero ejecutándola como administrador,  en Windows 8, vamos tocamos la esquina superior derecha de la pantalla para aparecer la opción de búsqueda y allí escribimos CMD

 
Una vez ubicada la aplicación de línea de comandos hacemos clic derecho y buscamos en la parte de abajo la opción para ejecutar como administrador.


Al abrir la ventana de línea de comandos ejecutamos la instrucción “netsh wlan show drivers”  para verificar que nuestra tarjeta de red soporte crear una red ad-hoc para que esto sea possible debemos leer que “Red Hospedada admitida” este en  Sí.


Luego escribimos la instrucción: netsh wlan set hostednetwork mode=allow ssid= [Nombre de la red] key= [Contraseña]

Y finalmente iniciamos la red con el commando: netsh wlan start hostednetwork y la detenemos con netsh wlan stop hostednetwork

lunes, 4 de febrero de 2013

Conteo Condicional en SQL Server


Conteo Condicional en SQL Server
Recientemente he tenido la necesidad de hacer un conteo de datos condicional en SQL Server, lo que en Excel es un CONTAR.SI, aprovechando la ocasión decidí documentar con ejemplo la tarea, para futuras oportunidades
Suponiendo contamos con una tabla llamada ProductList, con los datos que se muestran en la imagen de abajo y  necesitamos contar los productos mayores a 0 de la categoría “Condiments”.
Pues bien antes de realizar el conteo debemos tener en cuenta que la función COUNT() de SQL Server si la usamos como COUNT(*) contara todas las filas, por ejemplo
SCRIPT
RESULTADO
Select Count(*) from Productlist
 

 
Y si lo que contamos es un campo de la tabla por ejemplo COUNT(UNITPRICE), como en el ejemplo UNITPRICE tiene valores nulos en productos de la categoría “Seafood” estos no los contara.
SCRIPT
RESULTADO
Select Count(UnitPrice) from Productlist
 

 
Ahora como lo que necesitamos es contar los productos mayores que 0 de la categoría “Condiments”,  si volviéramos Nulos los valores en 0 no los contaría, para esto usaremos la instrucción CASE
 
SCRIPT
RESULTADO
Select Categoryname, Productname,
(CASE Unitprice WHEN 0 THEN NULL ELSE Unitprice END) as Precio
from Productlist
where Categoryname='Condiments'
 
 

 
Finalmente usamos, nuevamente la función COUNT, pero esta vez encerrando la función CASE creada.
SCRIPT
RESULTADO
Select count(CASE Unitprice WHEN 0 THEN NULL ELSE Unitprice END) as Total
from Productlist
where Categoryname='Condiments'
 

 
Fuente de apoyo para la intruccion CASE