|
Página 1 de 1
|
Crear Bd Inventario Pequeño Con Sqlite3
Autor |
Mensaje |
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Crear Bd Inventario Pequeño Con Sqlite3
buenas...
hace pila que quiero agregarle un inventario al programa taller.
pero e decidido no tocar la base principal para no hacer un lio.
la idea es aprender por tanto voy hacer una nueva base de datos para el inventario.
tomando un poco la idea de aca voy tirando mi primer croquis.
https://foro.gambas-es.org/viewtopic.php?f=3&t=3360
Proveedores:
idprov as integer
nombre string
datos as texto
Productos:
idproducto as integer
idproveedor as integer
nombre as string
idgrupo as string
detalles as texto
p_costo as float
p_venta as float
cantidad as float
Salida:
fecha as datetime
idproducto as integer
cantidad as float
Entrada:
fecha as datetime
idproducto as integer
cantidad float
Grupos:
idgrupo as integer
nombre as string
objetivos:
base de datos lo mas sencilla posible.
trabajar con tablas vinculadas. (llaves foráneas)
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#1 Lunes, 16 May 2016, 14:37 |
|
|
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
estoy armando la tabla con sqlite studio http://sqlitestudio.pl/?act=download
[Tipo: table] [Nombre: sqlite_sequence] [Nombre tabla: sqlite_sequence]
CREATE TABLE sqlite_sequence(name,seq)
[Tipo: table] [Nombre: proveedores] [Nombre tabla: proveedores]
CREATE TABLE proveedores (idproveedor INTEGER PRIMARY KEY AUTOINCREMENT, nombre VARCHAR (32) NOT NULL, datos TEXT)
[Tipo: table] [Nombre: grupos] [Nombre tabla: grupos]
CREATE TABLE grupos (idgrupo INTEGER PRIMARY KEY AUTOINCREMENT, nombre VARCHAR (32) NOT NULL, detalles TEXT)
[Tipo: table] [Nombre: productos] [Nombre tabla: productos]
CREATE TABLE productos (idproducto INTEGER PRIMARY KEY AUTOINCREMENT, idproveedor INTEGER NOT NULL REFERENCES proveedores (idproveedor), idgrupo INTEGER NOT NULL REFERENCES grupos (idgrupo), nombre VARCHAR (32) NOT NULL, p_costo DOUBLE DEFAULT (0), p_venta DOUBLE DEFAULT (0), cantidad DOUBLE DEFAULT (0), detalles TEXT)
[Tipo: table] [Nombre: entradas] [Nombre tabla: entradas]
CREATE TABLE entradas (identrada INTEGER PRIMARY KEY AUTOINCREMENT, fecha DATETIME NOT NULL, idproducto INTEGER NOT NULL REFERENCES productos (idproducto), cantidad DOUBLE NOT NULL)
[Tipo: table] [Nombre: salidas] [Nombre tabla: salidas]
CREATE TABLE salidas (idsalida INTEGER PRIMARY KEY, fecha DATETIME NOT NULL, idproducto INTEGER NOT NULL REFERENCES productos (idproducto), cantidad DOUBLE NOT NULL)
Informe InfoDataBaseSql
la primera pregunta que me va surgiendo es commo resuelvo la cantidad
si tengo 5 pilas y doy salida a 1 como resto al 5, por medio de codigo gambas o sql tiene algo previsto?
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#2 Lunes, 16 May 2016, 16:14 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
Citar:
la primera pregunta que me va surgiendo es commo resuelvo la cantidad
si tengo 5 pilas y doy salida a 1 como resto al 5, por medio de codigo gambas o sql tiene algo previsto?
No lo resuelvas. No es necesario. Hay un principio elemental en el diseño de las bases de datos: No dupliques la información. Es decir, si tienes y dos y un dos, no almacenes el cuatro: Ya lo tienes.
Si anotas las entradas y anotas las salidas siempre tienes disponible la cantidad. No la almacenes, por cuanto un fallo en un proceso, una transacción incompleta o lo que sea, te de-sincroniza la información.
Elimina el campo cantidad de la tala producto. Cuando necesites saber la cantidad que hay haz una consulta sobre eso y ya está.
Algo así:
SELECT sum(entradas.cantidad) - sum(salidas.cantidad) `Cantidad` FROM productos LEFT JOIN entradas ON productos.idproducto=entradas.idproducto LEFT JOIN salidas ON productos.idproducto=salidas.idproducto WHERE producto = 1
o algo así para ver una lista:
SELECT producto.nombre, sum(entradas.cantidad) - sum(salidas.cantidad) `Cantidad` FROM productos LEFT JOIN entradas ON productos.idproducto=entradas.idproducto LEFT JOIN salidas ON productos.idproducto=salidas.idproducto GROUP BY producto.idproducto
Con eso nunca te falla la cantidad, siempre es correcta y te ahorras el grabarla, modificarla o sincronizarla.
Saludos
=================== No podemos regresar
última edición por shordi el Lunes, 16 May 2016, 17:34; editado 1 vez
|
#3 Lunes, 16 May 2016, 17:33 |
|
|
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
shordi como se hace para restringir la eliminación de una fila de la tabla grupos, si existe un producto con el id de ese grupo?
y que se pueda borrar ese grupo si no existe ningún producto de ese grupo o categoría?
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#4 Martes, 17 May 2016, 18:46 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
Eso lo establece la integridad referencial de la base de datos, que para eso está.
Previamente en la creación de las tablas has establecido la relación:
CREATE TABLE grupos (
idgrupo INT PRIMARY KEY,
nombre VARCHAR
);
CREATE TABLE productos (
id INT PRIMARY KEY,
nombre VARCHAR,
grupo INT ,
FOREIGN KEY (grupo) REFERENCES grupos(idgrupo)
);
Con eso cualquier intento de borrar un grupo o de cambiar el campo idgrupo fracasa si existen productos en él.
Esto es así porque RESTRICT es el comportamiento por defecto de la relación. Tienes otras opciones CASCADE y SET NULL
Yo lo que suelo hacer es establecerlas así:
FOREIGN KEY (grupo) REFERENCES grupos(idgrupo) ON UPDATE CASCADE ON DELETE RESTRICT
Así si se cambia el contenido de idgrupo en un grupo, automáticamente se le cambia a todos los productos del grupo también, pero si se intenta borrar no se permite mientras tenga productos
Para que todo esto funcione tienes que ejecutar ésta sentencia justo después de abrir la base de datos:
miconexion.Exec("PRAGMA foreign_keys = ON")
Si no haces eso todo lo anterior no funciona.
Saludos
=================== No podemos regresar
|
#5 Martes, 17 May 2016, 21:01 |
|
|
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
shordi he añadido unique a los campos nombres de las tablas producto, grupo (categoría) y proveedores creo que ayuda a la integridad de la base de datos
por lo que entendí de unique significa que es una restricción que no permite ingresar un dato igual a uno ya existente en la columna.
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#6 Miercoles, 18 May 2016, 00:49 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
Citar: por lo que entendí de unique significa que es una restricción que no permite ingresar un dato igual a uno ya existente en la columna.
Efectivamente. La clave primaria, por definición, es unique. Los campos establecidos a unique impiden duplicidades en esos campos... pero hay que asegurarse de que, efectivamente son únicos. Si no, luego te toca ir modificando estructuras de bases de datos "en caliente" y eso es muy peligroso.
Un ejemplo del peligro:
Una vez desarrollé una aplicación en la que intervenían empresas y trabajadores. El campo nombre de la empresa era unique. Así lo pregunté y así me lo aseguraron. Cada trabajador pertenecía a una empresa. Así me lo dijeron y así lo relacioné. Dos meses después de la puesta en marcha del sistema hago una depuración de datos y me encuentro trabajadores duplicados y empresas duplicadas (José Pérez y José Pérez2 y Construcciones Mariano y Construcciones Mariano2, y cosas así). Llamo diciendo que lo están haciendo mal y me dicen que es que el programa no funciona bien. ¿Por qué? Porque hay trabajadores que trabajan en dos o tres empresas a tiempo parcial y hay empresas que tienen distintos centros de trabajo pero que son la misma empresa. La estructura de tablas a hacer puñetas, los procesos de altas y bajas a hacer puñetas y todas las vistas sobre la base de datos basadas en esas relaciones a hacer puñetas.
Dejando aparte la mala información que me dieron y mi error de asumir que lo que me decían era correcto (el paciente siempre miente, según House), si me hubiese limitado a establecer las relaciones con las claves primarias y me hubiese dejado de zarandajas de uniques todo hubiese sido más sencillo de arreglar.
Por otro lado la falta de unique donde es necesario puede llevarte a una cantidad insospechada de problemas con los duplicados.
Es un equilibrio.
Saludos
=================== No podemos regresar
|
#7 Miercoles, 18 May 2016, 08:24 |
|
|
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
shordi...
sigo trabajando en la base de datos añadí DEFAULT (DATETIME('now') ) a todas las columnas fecha o ingreso que manejan datatime,
creo que así facilita el trabajo, de ultima el usuario podrá cambiar esa fecha.
CREATE TABLE proveedores (
idproveedor INTEGER PRIMARY KEY AUTOINCREMENT,
ingreso DATETIME NOT NULL
DEFAULT (DATETIME('now') ),
nombre VARCHAR (32) NOT NULL
UNIQUE,
datos TEXT
);
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#8 Miercoles, 18 May 2016, 19:25 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Crear Bd Inventario Pequeño Con Sqlite3
No te lo aconsejo. Es mucho más fácil que el usuario grabe fechas incorrectas así antes que comprobar si son buenas o no. Coloca, eso sí, el now() como valor por defecto del valuebox o el datebox o lo que sea que uses para el formulario antes de ir grabando directamente cosas que pueden ser falsas.
En éste caso más aún: Mi experiencia me dice que es muy raro eso de ir metiendo al día todo lo que entre. Es mucho más frecuente que la gente acumule los albaranes y papelitos y se siente frente al ordenador cuando tenga un rato libre a meter todo lo atrasado. En ese caso el valor por defecto es más un estorbo que una ayuda.
Saludos
=================== No podemos regresar
|
#9 Miercoles, 18 May 2016, 20:22 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|