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 base de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta base de datos. Mostrar todas las entradas

martes, 5 de mayo de 2015

Gambas3: Crear por código una base de datos añadiendo tablas y campos.



Gambas3: Crear por código una base de datos añadiendo tablas y campos.


He encontrado un ejemplo (ver fuente)  de como crear una base de datos desde Gambas3.

El proceso es el siguiente:
1) Si existe, borra un test.sqlite archivo en el directorio personal del usuario.
2) Crea un test.sqlite base de datos SQLite y define una tabla "sampletable" con dos campos enteros, uno va ha ser autonumerico. Y el otro un número aleatorio.
3) Rellena la tabla con 10.000 registros
4) Muestra los resultados en un gridview utilizando el caso de manipulación de datos ya se ha descrito en una sección separada.
En el formulario de Gambas, solo se necesita un gridvew.
' Gambas class file
PRIVATE $hConn AS NEW Connection
PRIVATE $res AS Result
'-------------------------------------------------
PUBLIC SUB Form_Open()
DIM iCount AS Integer
DIM hTable AS Table
DIM rTest AS result
DIM sql AS String

'define the gridview layout
GridView1.header = GridView.Horizontal
GridView1.grid = TRUE
GridView1.Rows.count = 0
GridView1.Columns.count = 2
GridView1.Columns[0].text = "ID"
GridView1.Columns[1].text = "Value"
GridView1.Columns[0].width = 55
GridView1.Columns[1].width = 55


WITH $hConn
    .Type = "sqlite"
    .host = User.home
    .name = ""
END WITH

'delete an existing test.sqlite
IF Exist(User.home & "/test.sqlite") THEN
    KILL User.home & "/test.sqlite"
ENDIF

'create test.sqlite
$hConn.Open
    $hConn.Databases.Add("test.sqlite")
$hconn.Close

'define the table sampleTable
$hconn.name = "test.sqlite"
$hConn.Open
    hTable = $hConn.Tables.Add("sampleTable")
    hTable.Fields.Add("s_seq", db.Integer)
    hTable.Fields.Add("s_rndm", db.Integer)
    hTable.PrimaryKey = ["s_seq"]
    hTable.Update

'fill the table with generated data
$hconn.Begin
    rTest = $hConn.Create("sampleTable")
    FOR iCount = 1 TO 10000
        rTest!s_seq = iCount
        rTest!s_rndm = Int(Rnd(0, 100))
        rTest.Update
    NEXT
$hConn.Commit

'read the database
sql = "select s_seq as ID, s_rndm as Value from sampleTable"
$res = $hconn.Exec(sql)

CATCH
$hConn.Rollback
Message.Error(DConv(Error.Text))

END
'-------------------------------------------------
PUBLIC SUB Form_Activate()
'change the rowcount of the gridview from 0 to the number of records.
'This triggers the data handling event

GridView1.Rows.Count = $res.Count
END
'-------------------------------------------------
PUBLIC SUB GridView1_Data(Row AS Integer, Column AS Integer)
    $res.moveTo(row)
    GridView1.Data.text = Str($res[GridView1.Columns[column].text])
END
'-------------------------------------------------
PUBLIC SUB Form_Close()
    $hconn.Close
END
'-------------------------------------------------

Fuente:
https://kalaharix.wordpress.com/gambas/creating-a-databases-and-tables-from-gambas/
http://gambaswiki.org/wiki/comp/gb.db
http://gambaswiki.org/wiki/comp/gb.db/db
http://gambaswiki.org/wiki/comp/gb.db/result

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