28 febrero 2008

Jugando con tablas normalizadas y SQL

El otro día estábamos jugando a crear tablas normalizadas e instrucciones SQL y lo que resultó fue un ejemplo de diseñar tablas normalizadas (escribí algo acerca de la normalización de bases de datos que puedes leer aquí) y el uso de instrucciones SQL para usarlas. Por esta razón, publico aquí el ejercicio y la mejor solución que surgió esperando que te sea útil.

Antes que nada, este es el problema planteado:

Crear las tablas necesarias para almacenar los datos que necesita una tienda de autoservicio. El programa es de punto de venta, que controlará el inventario de producto, clientes que han solicitado facturas, recibos (ventas) y facturas.

Los datos (mínimos) que se tienen que almacenar son:
  • IdProducto – Número que identifica de manera única cada producto
  • Descripcion – Descripción del producto
  • PrecioCompra – El precio al que te venden el producto.
  • Min – Cantidad mínima que necesitas tener en el almacén. Si llegas a este valor, es necesario hacer otro pedido.
  • Max – Cantidad máxima que puedes almacenar de un producto.
  • Cantidad – Cantidad de producto que tienes actualmente.
  • PrecioVenta – Precio al que vendes el producto.
  • Proveedor – Nombre del proveedor que te surte un producto.
  • Tel – Teléfono del proveedor.
  • EMail – I-Meil del proveedor.
  • Cliente – Nombre del cliente.
  • RFC – del cliente.
  • Domicilio – del cliente.
  • CP – Código postal del cliente.
  • FechaVenta – Fecha en que se hizo la venta.
  • NoRecibo – El número que identifica un recibo.
  • NoFactura – Número de factura que se hizo de un recibo (si es que se hizo una fectura de ese recibo).
Ten en cuenta algunas de las funciones que tendrá el programa:
  • Emite recibos: almacena el número de recibo, la fecha en que se hizo la venta, la lista de productos que se vendieron (producto, cantidad, precio del producto ) y el número de factura, si es que el usuario solicitó una factura de este recibo.
  • Control de inventario: conforme se vayan vendiendo productos en la tienda, se va a ir ajustando la cantidad que se tiene en el almacén. Cuando llegue al tope mínimo, deberá mandar un aviso para que hagan un pedido de ese material y que el pedido (más lo que se tiene) no supere el límite máximo.
  • Facturación: que lleve un registro de las facturas que se emitieron. Se tiene que registrar que factura corresponde a qué recibo y a qué cliente.
  • Reportes: se necesitarán reportes de existencias en inventario, de lo que se ha vendido (reportes financieros) y uno que otro más.
Además de esto, debes guardar instrucciones SQL que hagan lo siguiente:

1. Los productos que se tienen en inventario (descripción, cantidad en inventario, precio compra y precio de venta, ordenado por la descripción).

2. La lista de los clientes (RFC, Nombre, Apellidos y Teléfono, ordenado por apellido paterno, luego por apellido materno y luego por nombre).

3. Nombres de todos los clientes cuyo apellido paterno comience con “Men” o su RFC contenga la cadena “2011”.

4. Listado de todos los recibos que contengan el producto 2 o el 9 y que se hayan comprado en el mes de septiembre de cualquier año.

5. Listado de todos los productos que contengan la cadena “coca”, “sprite” o “fanta” en la descripción. Ordénalos por descripción de forma descendente y luego por precio de venta.

6. Dar de alta un recibo de compra: número de recibo, fecha y 10 artículos que compró.

Este es el problema. Ahora la onda es ver cómo solucionarlo. Comencemos por el diseño de las tablas. No voy a hacer un repaso de las formas normales (que, como dije antes, puedes ver aquí), pero solo escribir como quedarían. Pongo un signo # antes del campo que sería la llave primaria de la tabla.

Tabla: Productos
Aquí se guardan los datos de los productos
#IdProducto
Descripcion
Min
Max
Cant
PrecioCompra
PrecioVenta
IdProveedor
(esto lo pongo solamente si cada producto tiene un solo proveedor. si no hay que hacer otra tabla que ilustro más adelante en la tabla ProveedorProducto)

Tabla: Proveedores
Aquí se guardan los datos de los proveedores
#IdProveedor
Nombre
Tel
EMail


Tabla: Clientes
Aquí se guardan los datos de los clientes
#RFC
Nombre
ApellidoP
ApellidoM
Domicilio
CP


Tabla: Recibos
Aquí se guardan los datos generales de los recibos y facturas, si la han hecho de este recibo
#NoRecibo
Fecha
NoFactura
(en caso que no haya factura de este recibo, este campo tiene 0 y el que sigue no le pongo valor, es nulo) RFCCliente

Tabla: ReciboProducto
Aquí se guardan los productos que se compraron en cada recibo
#NoRecibo
#NoProducto
Cant
Precio


Tabla: ProveedorProducto
En caso de que más de un proveedor puede proveer un producto, aquí se guarda quien provee qué
#IdProveedor
#IdProducto


Ahora van las instrucciones SQL. Como las consultas van enumeradas, voy a poner primero el numero y en el siguiente renglón la instrucción SQL correspondiente:

1.
SELECT Descripcion,Cant,PrecioCompra,PrecioVenta
FROM Productos
ORDER BY Descripcion


2.
SELECT RFC,Nombre,ApP,ApM,Tel
FROM Clientes
ORDER BY ApP,ApM,Nombre


3.
SELECT RFC,Nombre,ApP,ApM
FROM Clientes
WHERE ApP LIKE "Men*" OR RFC LIKE "*2011*"


4.
SELECT DISTINCT NoRec
FROM ReciboProducto
WHERE NoProd=2 OR NoProd=9


5.
SELECT Descripcion
FROM Productos
WHERE Descripcion LIKE "*coca*" OR Descripcion LIKE "*sprite*" OR Descripcion LIKE "*fanta*" ORDER BY Descripcion DESC,PrecioVenta


6.
En primer lugar, inserto los datos generales a la tabla Recibos. Como puedes ver, estoy omitiendo la información de la factura:
INSERT INTO Recibos (NoRec,Fecha) VALUES (1,"28/Feb/08")

Ahora todos estos dan de alta los 10 productos que ampara este recibo (en nuestor caos, el recibo número 1):
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,1,5,3.5)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,3,1,13)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,9,1,25.95)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,25,1,14.5)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,7,2,3.75)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,2,1,5)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,10,1,4)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,13,2,8.5)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,7,1,50)
INSERT INTO ReciboProducto (NoRec,NoProd,Cant,Precio) VALUES (1,24,3,30)


Espero que esto te ayude. Si no te queda claro, no dudes en dejar un mensaje. ¡Hasta la próxima!

36 comentarios:

Anónimo dijo...

chong 4 tpo:

Pues las tablas normalizadas son algo interesantes ocupas saber bien de que estan hechas sus datos y las funciones que se van a requerir al momento de hacerla ademas de que es necesario el uso de las instrucciones del SQL. Interesante sin duda y espero saberlas hacer bien al momento de su uso en la computadora.

Anónimo dijo...

Pako 4to TPO:
K onda tony
Pues es necesario tener tablas normalizadas para poder tener en orden tu información y para eso hay que pensar en que manera hay que organizar las cosas, la verdad todo depende de las necesidades que necesites eda? en fin hay que tener organizado eso y lo que haga especial a ese dato por asi decirlo (como cliente, producto, etc.) tiene que ser tu clave principal para tener controlada la información, es más hasta puedes hacer dos o más tablas y relacionarlas entre sí y evitarte tantos shows, puedes hacer una lista de productos, otra de clientes otra de compras y una para administrar el dinero o lo k se ocupe.
bno creo k eso es todo kuidese profechereso.

Anónimo dijo...

Alex Fabregas 4-TPO

Bueno Tony pues leyendo sus informativos y humoristicos articulos de las tablas normalizadas y el SQL, se puede resaltar que tienen como mayor funcion llevar un orden general (si no es que total) de todos los datos que hemos guardado, ya que igual que tu mencionabas, si se almacenan en un mismo lugar , se producirian errores de logica. Ademas de que con este sistema ordenar los datos es mas rapido y eficiente, tambien el accesar a nuestros datos requeridos (para modificarlos o solo para contemplarlos xD) es mas facil y sin tanto rollo como nos habian enseñado el semestre pasado....no esperen no nos enseñaron!

Anónimo dijo...

Estela Ortiz :D!

Hola ToniluU!
Yo pienso que eso de la normalizacion en este momento lo podemos utilizar con ejemplos y todo eso, pero realmente para algunas compañias o empresas es muy importante utilizarlas porque facilitan el trabajo, y si ya quiero empesar a utilizar SQL me han dicho que esta muy divertido ha, ha...!!! te cuidas!!! Chao! *****

Anónimo dijo...

ola tony yo pienso que la stablas son muy importantes para poder tener organizada tu informacion en orden en los campos son como en excel las columnas y la clave principal la mayoria de las evces es el campo que en cabeza la columna y el campo que lleva la clave es el que hace referencia a los demas campos y tambien sirve para orgabnizar todos tus datos por categoria y cada campo se le puede exigir que tipo de datos quieres que ponga alli
bno eso es todo adiso

isaac
4tpo

Anónimo dijo...

Jesus Ruben VIllarreal Favela
4TPO

Que pasa tony , ps yo pienso que las tablas normalizadas i el SQL son muy importantes para las grandes empresas, ya que es lo que necesitan tener todo ordenado, se me hizo muy interesante y tengo ganas de aprender a saberlas a hacer bien.
Sale asta luego tony ai nos vmos.

Anónimo dijo...

ps no esta tan chido usarlas aunk te acen un buen parote pero tambien yo no las okupo por el momento pero igual algun dia tenga k requerirlas ya se komo acerlas para no pagarle a alguien y acerlas yo jaja sale tony sigo sin akordarme de komo pongo mi nombre...

sticky dick
y mi korreo ya sirve

Anónimo dijo...

Jose Antonio Desiderio Martinez
4° TPO

Mi estimadisimoo tocayo.. ! .. esta chido el rollo de las Tablas Normalizadas, algo complicadas pero entendibles.. ai le dire lo que me fallo.. me parecio algo chido eso del uso junto del SQL y su relacion con las funciones.

Anónimo dijo...

ke pasa tony:

ya stube leyendo eso y ademas de ke es lo ke nos explikaste en la klase las tablas normalizadas sirven para ordenar la informacion aunke depende de la organizacion ke tu le des y de las nececidades ke okupes y ya despues relacionar las informacion
sale tony nos vemos


Messi (Leonel Peña) 4°TPO

Anónimo dijo...

Axelo_kpex!!! ja ja ja... 4º TPO.

K onda Tony!!
Bueno, la verdad entendi mas o menos tu texto. Ja ja ja... pero lo que si entendi, basicamente es que este tipo de tablas (las Normalizadas) sirven para tener un orden en cuanto a los datos. No soy muy bueno interpretando estos textos asi es k solo digo lo que entendi. Bueno, nos vemos. Bye.

Anónimo dijo...

Gaby 4 TPO!

Hi Tony!!
La verdad estuvo interesante le entendi al texto lo unico q m pone en duda va a hacer a la hora de hacerlo o ponerlo en practica.
Ya entiendo la importancia de las tablas normalizadoras son practicas pero para usarlas adecuadamente necesitamos bn los datos a tratar

Anónimo dijo...

fany 4tpo
hello!!!!!!
tony no entendi nada de como hacerlo en sql!!!!!!!!!!!!!
aunque si es muy interesante y si podria ser muy util para una empresa pero la verdad lo lei como 5 veces y no entiendo!!! creo va a ser mas facil ponerlo en practica en el laboratorio sobretodo si se usa en access.. xD

Anónimo dijo...

Brito 4 tpo

Esta muy interesante todo esto tony, de verdad que las tablas normalizadas pueden llegar a ser muy utiles, siempre y cuando sepamos como planear q datos iran en cada tabla y como sera el orden de estos.

Pero en fin, se me ocurren varios usos, sobretodo para algun tipo de empresa

Ojala podamos ponerlo en practica en el laboratorio. Nos vemos tony

Anónimo dijo...

Gerardo 4TPO
pues yo entendi que las talblas normalizadas y sql son para crear mas que nada una base de datos como las de todas las empresas que conocemos para llevar el control de todas las compras , ventas y servicion que rciven o proporciona la empresa y esto es muy interesante y a la vez un poco facil :P .

Anónimo dijo...

Beto (no baldini)
Pues... si las tablas normalizadas son una manera mas facil de guardar la info, lo que si es que hay que aprender mejor el idioma (o la manera en que organiza) la info, d hecho lo encuentro mas facil que usar ese pedorro metodo de Access.
Saludos Tony

Anónimo dijo...

ese tony que passion XD
pues aqui leyendo su super informacion que subio y lei ya detalladamente sobre sql y que puse tanta antencion en su clase de ahora jajajajaja
bueno no soy un experto en esta madre se sql pero le entiendo lo sifuciente como para ser una en access
christian rosales 4tpo

Anónimo dijo...

Esta muy interesante todo esto tony, de verdad que las tablas normalizadas pueden llegar a ser muy utiles,las funciones que se van a requerir al momento de hacerla ademas de que es necesario el uso de las instrucciones del SQL.
las tablas normalizadas son una manera mas facil de guardar la info.
ya detalladamente sobre sql y que puse tanta antencion en su clase de ahora jajajajaja
en fin hay que tener organizado eso y lo que haga especial a ese dato por asi decirlo (como cliente, producto, etc.) tiene que ser tu clave principal para tener controlada la información

Diego velasco vazquez

Anónimo dijo...

Zeydi Martinez 4TPO!!

Pues las tablas normalizadas son para poder tener un orden de informacion y la verdad es que tenemos que pensar muy bien los datos y funciones para lo que van a necesitar las tablas. Necesitas una clave principal para poder tener un margen control de lo que es tu informacion.
cuidate tOny!!! =D

Anónimo dijo...

Que onda Tony:
Pues la neta si te explica bien como hacer tablas eficientes sin repetir cosas y eso que despues te pueden generar problemas, y asi ya normalizadas pues es la mejor forma de prevenir los errores como que se repitan datos o que queden con el mismo index o cosas asi.

Anónimo dijo...

qetaltony

nosirve
mi
espaciador
hahaha
entonces
pslo
hare
bastante
resumido
mmm
bastante
sencillo
de,entender,y,facil,de,usar
mmm,todo,debe,de,tener,un,orden,asi,que,es,bueno,saber,que,contamos,con,el,SQL,espero
utilixarlo,pronto,chao

Carlos,Espinosa,4tpo

Anónimo dijo...

ese tony
pasando a bloggear por aca un raton ya se la sabe pues en lo que se refiere a estructura basica ordenamiento de datos de campos y de como pedir datos ordenadamente pues le entendio bien nada k no se pueda sacar por logica pero como no emos visto codigo asi como tal ps le entendi una leve a como ponerlo en funcion aver ke pasa despues

emilio cendejas 4TPO

Anónimo dijo...

ola tony
bien aki cumpliendo(tarde!)
no pude antes x problemas de causas mayores pero aki ando

lo poco ke entendi
la verdad fue una nada
pero es que las tablas blablabla sirven para ordenar datos(obvio) sin revolver nada, para que despues no salgan errores, y tambien lo que vi en su entrada es que los ordena como en categorias no? asi de producto,provedor etc...
pero aun asi me gustaria una explicacion mas x fa
ke me konfundi un poko ya.


nos vemos en klase!


Carlos 2 4ºTPO

Anónimo dijo...

Q pex tony aqui nomas dejando mi comentario y diciendo q eso de normalizacion de tablas ayuda mucho a prevenir problemas con las bases de datos y aparte de q se tiene q usar SQL aunq no tengo idea de como sea

Anónimo dijo...

PD: El de arriba soy yo profe atte: Fitux

Anónimo dijo...

Hola tony no lo habia hecho antes porque me quede sin internet desde hace como 3 dias y tambien como me saco ayer no escuche a tiempo lo de la tarea pero bueno....
Creo que estas tablas son muy buenas para organizar cuidadosamente y como tu lo prefieras,, aunque no le he entendido bien a lo de los nombres de los archivos pero ya entendiendole ya creo que estaria facil.

Anónimo dijo...

k pasa tony ps a lo que le entendi fue que las tablas normalizadas son programas de empresas que compran en matoria o muchas cosas y las venden a otras empresas menores y a personas.
a lo que yo se un programa de ese tipo es SAE jeje que tiene inventario de lo que compras y a la hora de venderlo automaticamente a la hora de hacer la factura te lo quita de existencia o lo reduce segun lo que tengas aparte que puedes tener la informacion de tus clientes, creditos, etc, etc.

miguel gtz. b. 4 TPO

Anónimo dijo...

Andros Mendoza 4TPO

Pues con las tablas normalizadoras podemos ordenar la informacion en diferentes tablas, ya que si tubieramos toda la información en la misma tabla podriamos tener varios errores.

Anónimo dijo...

Fredy!!
no pues legal k se nesesitan las tablas normalizadas para tener un orden bn ordenado!!pero lo malo esque no se hacen solas y hay que pensar bien como vamos a organizar las tablas ya con eso no puedo poner mas porque fitux me esta quitando su computadora

Anónimo dijo...

Luis Lozano 4TPO

Q onda tony, no pues segun leí las tablas sirven para tener un orden cuando tenemos muchos datos y necesitamos tenerlos todos ordenados y en un lugar facil de acceder.

Anónimo dijo...

LA verdad esta muy interesante pero me quede con la duda de como hacias lo dle inventario si me lo pudieras decir te lo agradeceria
que estes bien

Tony Valderrama dijo...

Lo que pasa es lo de invetarios era solo una idea que tenían que tener en mente a la hora de diseñar las tablas, para que tomaran en cuenta que tenían que incluir campso que gardaran la existencia actual, el máximo permitido y el mínimo (cuando tenga esta cantidad, mandan a pedir más al provedor).

La onda que le avise al usuario cuándo hay que pedir más es una fucnión muy común en los sistemas ERP.

¿Necesitas resolver un módulo de inventario?

Anónimo dijo...

Si y no ya tengo para introducir datos ne las tablas pero no la actualizacion del producto restante con la sentencia sql es un update pero estoy trabajando con visual basic 2005 y sql server.
basicamente seria asi .
try +insert+ select+ update+catch+end try
el insert y el update los tengo pero no se bien como quedaria dentro del try.

Tony Valderrama dijo...

Todas las instrucciones van entre el try y el catch. Lo que sigue del catch es lo que va a hacer si hay un error en alguna de las instrucciones que están después del try.

Anónimo dijo...

si eso lo entiendo perfecto de hehco asi tengo el insert pero no se como acomodar el update y select junto con el insert dentro del try y el catch, seria que cada ves que compren se ajuste el inventario con el update pero no se como se acomodaria
y gracias por la ayuda

Tony Valderrama dijo...

No uses el UPDATE... o úsalo en lugar del INSERT. Update te altera campos, no actualiza una vista de una tabla.

Yo haría un SELECT después del INSERT para reflejar los cambios... pero depende mucho de la manera en que estás trabajando (controles, objetos, etc.)

Anónimo dijo...

Hola tony <3

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...