Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta sqlite. Mostrar todas las entradas
Mostrando entradas con la etiqueta sqlite. Mostrar todas las entradas

domingo, 26 de julio de 2015

Nuevo Libro: MapBdVistas: Framework para creación de aplicaciones de Base de Datos en Gambas3


Nuevo Libro: 

MapBdVistas: 

Framework para creación de aplicaciones de Base de Datos en Gambas3


Os presento una herramienta para el desarrollo de aplicaciones de gestión de datos para escritorio, usando el motor de base de datos sqlite y el lenguaje de programación Gambas3, con el que ahorras mucho tiempo en escribir código y permite la creación de aplicaciones muy rápidamente.

En el libro explico con detalle las funciones que nos proporciona el programa, y un ejemplo completo para que veáis como se crearía una aplicación desde cero, a partir de la base de datos.

Con este framework, he desarrollado las aplicaciones siguientes:






Para la compra del manual en lulu.com:
http://www.lulu.com/shop/julio-sanchez-berro/mapbdvistas-framework-para-creaci%C3%B3n-de-aplicaciones-de-base-de-datos-en-gambas3/ebook/product-22289148.html


Para más información y descarga del programa (gratuito):


Saludos

miércoles, 11 de marzo de 2015

Diseño De Una Base de Datos: respondiendo a una pregunta



  Diseño De Una Base de Datos: respondiendo a una pregunta.



Os traigo otra perla, esta vez de Shordi, del foro de gambas-es.org.
Se trata de explicar como se debería diseñar una base de datos.


Para iniciar el diseño, no debes pensar en maneras de entrar los datos o en la cualidad de cada campo. Eso vendrá después.
Para diseñar una base de datos, escribir un programa, hacer un guiso o escribir una novela nuestro cerebro funciona de la misma manera.

Un cocinero no empieza pensando qué ingredientes se echan con los dedos y cuales con la cuchara. Empieza con identificar los ingredientes.
Un Escritor no empieza pensando qué corbatas llevarán los  personajes y de qué color. Empieza identificando los personajes que van a intervenir.
Una base de datos no se empieza pensando qué pantallas vas a rellenar o qué dato será obligatorio: Se empieza identificando las "Entidades" (Clases) que intervienen en ella.
Los Tipos de Entrada, los modos y formatos de salida, la cualidad de sus relaciones, etc. etc. eso vendrá después.

En otras palabras olvídate, de momento, de nada que no sea las propiedades de las Clases. Yo prefiero la palabra "Entidad" que implica que de lo que hablo tiene "existencia" por sí misma, dejando eso de "Clases" para la POO a la hora de diseñar el programa. Como norma general puedes identificar "Entidad" con "Tabla Maestra" (hay entidades complejas, pero eso es otra historia)

Por lo que cuentas en tu diseño hablas de manejar: Libros, Autores, Editoriales, Citas, Tesis.

Empieza por eso: Pregúntate Qué es y de Qué se compone un Libro, un Autor, una Cita, etc.
Eso te dará los campos y su tipo de una forma natural.
Es evidente que 
 -Un libro tiene: Título, Autor, editorial, Nº de páginas, etc.
 -Un Autor tiene: Un nombre, una fecha de nacimiento, un país de nacimiento, una biografía, una bibliografía, etc. etc.
 -Una Cita tiene: Un texto, un libro de referencia, una página donde aparece, un libro, o varios, donde es citada, etc. etc.

En el desarrollo de esto verás que el tipo de dato lo marca la naturaleza del mismo y empezarán a surgir las relaciones entre ellos. Por ejemplo el número de página donde aparece la cita no puede ser mayor que el número de páginas del libro, etc. También te encontrarás que, a lo mejor, te aparecen entidades en las que, de entrada, no habías pensado. Por ejemplo, una Tesis tiene un Autor, no confundir con el autor de los libros que se citan ¿Será necesario también una tabla de autores de Tesis? ¿Qué características tendría?, etc. etc.

Una vez que tengas diseñadas las características (campos) de tus "Entidades" (tablas maestras), tendrás que relacionarlas entre sí (esta es la esencia de las Bases de Datos Relacionales), de forma que se constituyan en una estructura de datos coherentes y eficaz. Para ello necesitas encontrar primero de todo la Clave Primaria de cada Entidad, es decir qué identifica cada fila de una forma única y definitiva entre todas las de su clase y construir los índices que apunten a esas claves.
Así una editorial tiene un Id del registro mercantil, Un libro un ISBN, etc. Esto es básico: Dos libros pueden tener el mismo título, dos Autores el mismo nombre, etc.
Puedes construir tus claves mediante la unión de varios campos, Título+Autor o puedes crear campos que sirvan de índice (autonuméricos) para ello.

Con los indices construidos estableceremos las relaciones entre las tablas. Así , en la tabla de libro, campo editorial, almacenaremos la clave de la tabla editoriales, para lo que crearemos una relación Padre-Hijo (Foreign key) y la base de datos misma se encargará de mantener la coherencia y de que no haya claves perdidas o referencias ciegas.
En este paso verás que no es posible, muchas veces, establecer una relación directa y sencilla, por ejemplo:
Un autor ha escrito varios libros. Un libro puede tener varios co-autores. La solución más sencilla entonces es la creación de una tabla de enlace intermedia. Una tabla que se componga exclusivamente de tres campos: índice de la relación, clave el autor, clave del libro.

Finalmente, una vez que tengas la estructura creada, es conveniente hacer una serie de vistas que simplifiquen las consultas más frecuentes que luego usaremos en el programa.
Por ejemplo: una vista que contenga todos los campos del libro y todos los de su autor (recordemos que en la tabla de libros sólo tenemos la clave de la tabla del autor).
Almacenando estas vista, seremos capaces de mostrar al usuario los datos que necesite de manera muy sencilla.

Hay mucho más, claro, pero más o menos estos son los pasos básicos para el diseño de una base de datos.
Todo el tiempo que dediques a esto, será tiempo ganado en la programación. Un error de programación se arregla, a las malas, en unas horas. Un error en el diseño de la base de datos puede costarte meses o, incluso, hacer inútil todo tu proyecto. (Créeme, me ha pasado)

El diseño de tu base de datos es la esencia de tu programa.

Mi cita favorita:
"Enséñame tu código y mantén ocultas tus estructuras de datos, y me seguirás engañando. Muéstrame tus estructuras de datos y normalmente no necesitaré que me enseñes tu código: resultará evidente." (Fred Books.)


Fuente:
http://www.gambas-es.org/viewtopic.php?f=3&t=4419

martes, 10 de marzo de 2015

Sql: Filtrar datos entre fechas en gambas3

 

Sql: Filtrar datos entre fechas en gambas3


Hoy me ha hecho falta tirar del botón de buscar del foro de gambas-es.org.
Necesitaba que un programa me listara unos registros entre dos fechas, y no había manera. Al final, jguardon en el hilo (ver fuente), lo explica muy bien como hacerlo para no tener problemas con los dichosos formatos de fechas:



"Voy a explicar un par de detalles que van a facilitar la vida en gambas, cuando tratamos con fechas en las bases de datos:

Es muy importante trabajar con controles de gambas que manejen las fechas nativamente, como datebox o datechooser, cuya propiedad Value recibe o establece su valor como tipo Date (de gambas). Es decir, vas siempre a manejar una variable de tipo Date para almacenar fechas y NUNCA debes convertirlas a String para trabajar con fechas, ¿de acuerdo?

Cuando vayamos a usar esos valores de tipo date en una consulta sql, vamos a emplear una sintaxis de gambas que internamente usa Subst() que es una función que sustituye las variables dentro de la cadena sql usando comodines. Ya sea que almacenes una fecha en una variable de tipo Date o directamente uses el valor de un control que maneje fechas, no tendrás que hacer conversiones excepto para representar esa fecha en un control de texto.

Un ejemplo vale más que mil palabras:


conexion.hconn.Exec("Select * from delitos where fecha_delito between &1 and &2", fecha_inicio, fecha_fin)

Vamos a explicar ese código:

Lo que vemos es que hemos empleado los caracteres &1 y &2 como comodines para que la función Exec los sustituya posteriormente por los argumentos que van a continuación de la consulta sql. En este caso hemos usado unas variables (que me he inventado) que representan la fecha de inicio y la fecha final sobre la que quieres hacer la consulta. También podrías haber empleado directamente los valores de los controles, como por ejemplo datechooser_inicio.Value y datechooser_final.Value. Esta sintaxis nos asegura que siempre funcione la consulta ya que las conversiones las hace gambas internamente, evitando que tengas que poner comillas, concatenar, etc... lo cual siempre es bastante confuso.

Lo segundo es conocer un poco de sql para emplear la sintaxis más sencilla o más efectiva, dependiendo de lo que queramos hacer. En este caso he usado el operador BETWEEN que busca entre dos valores máximo y mínimo o viceversa. ( http://www.w3schools.com/sql/sql_between.asp ). También podríamos haber usado la sintaxis propuesta por shordi, la cual quedaría así:

conexion.hconn.Exec("select * from tabla where fecha_delito >= &1 and fecha_delito <= &2", fecha_inicio, fecha_fin)


En ambos casos, independientemente del motor de bases de datos que uses, esto funcionaría. No hay conversiones, no hay comillas, no hay concatenaciones de cadenas y variables, por lo tanto hay menos posibilidades de cometer errores, el código es mucho más limpio y comprensible y además más sencillo de mantener.

Resumiendo un poco, no hay que preocuparse mucho por las fechas y su formato siempre que usemos controles diseñados para tal fin, porque internamente van a representar un objeto de tipo fecha en el formato de nuestro idioma. Por lo tanto, si no rompemos la cadena, no tendremos problemas. Las bases de datos como mysql, tienen un tipo de campo DATE o DATETIME, que podemos extraer en gambas como un objeto de tipo date de gambas, pero si lo hacemos como cadena, empezarán nuestros problemas. En sqlite3 aunque no tiene realmente tipos de datos (todo son strings) si usamos objetos date para guardar y consultar de la manera que he explicado, gambas hará las conversiones por nosotros y sólo en casos muy concretos tendremos que formatear una fecha para representarla en un control de texto, pero repito, nunca para guardarla en la BD."



Como siempre, las explicaciones de jguardon, muy útiles.



Saludos

Fuente:

http://www.gambas-es.org/viewtopic.php?f=3&t=3563&highlight=buscar+entre+fechas+base+datos

jueves, 7 de agosto de 2014

Sqlite Maneger : Complemento de Firefox para gestionar Bases de datos Sqlite en tu navegador

Sqlite Maneger : Complemento de Firefox 

para gestionar Bases de datos Sqlite en tu navegador


 Algunas veces nos interesa tener a mano un gestor de base de datos sqlite, a mano. Y más a mano que el navegador Firefox, no hay nada :)


Os dejo aqui el enlace del descarga:





 Se instala en el menu Herramientas, es muy facil definir las tablas y sus campos

Creando tabla: definiendo campos

Ademas nos permite copiar la sentencia de como se crea la tabla:

Viendo la estructura de la tabla

Además tambien podemos añadir datos a las tablas y relizar sentencias de busqueda de consultas usando el lenguaje SQL

Formulario para añadir Datos


Consulta realizada sobre la base de datos  y muestra de resultados


Saludos


jueves, 12 de septiembre de 2013

Mi primer triggers en Sqlite: un ejemplo

 Mi primer triggers en Sqlite: 
un ejemplo de borrado en cascada
¿que es un trigger o disparador? 
Un trigger (o disparador) en una Base de datos, es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Dependiendo de la base de datos, los triggers pueden ser de inserción (INSERT), actualización (UPDATE) o borrado (DELETE). Algunas bases de datos pueden ejecutar triggers al crear, borrar o editar usuarios, tablas, bases de datos u otros objetos. (fuente: http://es.wikipedia.org/wiki/Trigger_(base_de_datos))
Bueno, una vez explicado que es, os voy a hacer un ejemplo de "borrado en cascada", osea que cuando se haya borrado un registro de una tabla, se borre también los registros que estén relacionados de otra tabla.

El ejemplo:
Se trata de dos tablas "alumno" y "asignatura", las cuales contienen los datos de los alumnos (nombre) y las asignaturas y notas que tienen esos alumnos.

El caso es que queremos que cuando se borre un alumno, de la tabla "alumno", automáticamente, se borren las asignaturas y las notas que tenia dicho alumno en la tabla "asignatura" . La relación entre las tablas es que un alumno puede tener una o varias asignaturas. A continuación el esquema.

Esquema:


Solución con triggers o disparador:
CREATE TRIGGER borradoAlumnosBEFORE DELETE ON alumno
FOR EACH ROW BEGIN
    DELETE FROM asignatura WHERE asignatura.idalumno = OLD.idalumno;
END;

¿que hace?
1) Se crea un trigger llamado "borradoAlumnos"
2) Despues de borrar un alumno, se ejecuta por cada registro (fila = row) de la tabla "asignatura", la instrucción:
    DELETE FROM asignatura WHERE asignatura.idalumno = OLD.idalumno;
Osea que cada registro de la tabla "asignatura" que tenga el mismo idalumno del alumno borrado (OLD.idalumno), también se va a borrar.

3) Este trigger se ejecuta automáticamente (como si se disparara, por eso del nombre "triggers"), siempre que se produzca el evento de borrado de un alumno.

Para ver más ejemplos y como se pueden crear , visita esta página:
Generador automático de Triggers
http://www.rcs-comp.com/site/index.php/view/Utilities-SQLite_foreign_key_trigger_generator

Saludos


lunes, 9 de abril de 2012

InformeHtml: Crear informes rápidos de consultas de bases de datos en Gambas

Una de las preguntas mas frecuentes que veo de los que empiezan con gambas  es de como crear informes de las consultas realizadas a bases de datos de una  manera rápida.

Existe un componente, el gb.report, que realiza esta misión, aunque aun esta en desarrollo, y se supone que en la versión 3.1 ya vendrá más optimizado.

Yo me he hecho una clase que genera un informe "rápido" en formato .html, pudiendose indicar colores de filas pares/impares, campos y el titulo.

Este informe lo podemos editar con cualquier programa de procesamiento de texto para terminar de darle forma al informe o publicar / imprimir directamente.

Lo mejor que tiene es que con solo pasarle el "result" de una consulta, el automaticamente detecta el nombre de las columnas y escribe completa la tabla (titulo, y filas de distinto color, segun le hayamos indicados).

Os dejo aqui el resultado que se puede obtener.

La forma de usar la clase es la siguiente:
0 º Definimos varias variables que vamos a usar...
Private conexion As Connection
Private resultado As Result
Private inf_html As New InformeHtml 'clase que genera el informe de la base de datos

1º Conectamos a la base de datos (en este caso una sqlite, con nombre "pruebasBD"):
-->
    conexion = New Connection
    conexion.type = "sqlite3"
    conexion.host = User.home
    conexion.name = "pruebasBD"



2º Obtenemos el resultado de una consulta: (resultado)
  sentenciaSql = "Select nombre,estrellas from hotel"
  resultado = Conexion.Exec(sentenciaSql)
 3º Definimos las caracteristicas de la instancia a la clase informeHtml

 'definos colores y titular
    inf_html.titulo = "<h3>2 Ejemplo de resultado de la consulta:</h3> <br>" & sentenciaSql

    'para ver colores en hexadecimal para hmtl: http://es.wikipedia.org/wiki/Colores_HTML
    inf_html.nombretablas = False ' si nombretabla es false, no se escribe el nombre de la tabla, si es true se escribe el nombre de la tabla
    inf_html.ColorCampos = "#7B68EE"
    inf_html.ColorFondoImpar = "#FFA07A"
    inf_html.ColorFondoPar = "#D3D3D3"

    'genero el codigo html del resultado (y con &= lo añado al anteriormente creado)
    textohtml &= inf_html.crea(resultado)

La variable textohtml contiene el codigo de la tabla, este lo podemos ver o editar en navegador o procesador de texto.

Os dejo tambien como es la clase informehtml:
' Gambas class file

Public nombretablas As Boolean 'si es true se escribe el nombre de la table, si es false, se escribe solo el nombre del campo
Public titulo As String 'titulo superior de la tabla resultante
Public ColorCampos As String 'color de los campos
Public ColorFondoPar As String 'color fondo filas pares
Public ColorFondoImpar As String  'colo fondo filas impares

Public Function Crea(resultados As Result) As String

    Dim devuelve As String
    Dim campo As New String[]
    Dim hfield As ResultField
    Dim a As Integer
    Dim contador As Integer
    Dim nombrecampo As String
    Dim campotemp As String

    devuelve = " <table  border=\"2\">\n"
    devuelve &= "<caption>" & Me.titulo & "</caption>\n"
    devuelve &= "<tr>\n"

    'escribe los campos
    For Each hField In resultados.Fields
        If nombretablas = True Then
            nombrecampo = Str$(hfield.name)
        Else
            campotemp = Str$(hfield.name)
            nombrecampo = Mid$(campotemp, RInStr(campotemp, ".") + 1, Len(campotemp))

        Endif

        devuelve &= "<th bgcolor=\"" & colorcampos & "\" scope=\"col\">" & nombrecampo & "</th>"
        campo.add(Str$(hfield.name))
    Next
    devuelve &= "</tr>\n"

    'escribir los datos
    Do While resultados.available
        contador += 1
        If (Int(contador / 2) * 2) = contador Then

            'es par
            devuelve &= "<tr bgcolor=\"" & ColorFondoPar & "\">"

        Else
            devuelve &= "<tr bgcolor=\"" & ColorFondoImpar & "\">"
        Endif

        For a = 0 To campo.count - 1

            devuelve &= "<td>" & resultados[campo[a]] & "</td>"
        Next
        devuelve &= "</tr>"
        resultados.MoveNext
    Loop

    devuelve &= "</table>"

    Return devuelve

End


Enlace de descarga del codigo fuente de ejemplo:

Enlace interesante: colores para html
http://es.wikipedia.org/wiki/Colores_HTML

lunes, 9 de enero de 2012

Videotutoriales: Programa paso a paso en Gambas con MapBD

Os dejo 6 video tutoriales, donde resumo, lo que comenta el manual del anterior post, para que veais como diseñar un programa usando Gambas y la herramienta MapBD


1 de 6


2 de 6


3 de 6


4 de 6


5 de 6



6 de 6




Saludos