Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Crear Bd Inventario Pequeño Con Sqlite3
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Crear Bd Inventario Pequeño Con Sqlite3 
 
estoy armando la tabla con sqlite studio   http://sqlitestudio.pl/?act=download

 tablas


[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/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Manejo De Inventario jj231089 Bases de Datos 8 Lunes, 09 Septiembre 2013, 15:54 Ver último mensaje
shordi
No hay nuevos mensajes Calcular El Estado Del Inventario jj231089 Bases de Datos 2 Sabado, 16 Noviembre 2013, 19:29 Ver último mensaje
jguardon
No hay nuevos mensajes Sistema De Inventario Lauri Bases de Datos 20 Miercoles, 02 Marzo 2016, 20:19 Ver último mensaje
Lauri
No hay nuevos mensajes Inventario willyanjose Aplicaciones/Fragmentos de Código 5 Viernes, 17 Junio 2016, 15:19 Ver último mensaje
willyanjose
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron