"Empezar con SQL", bajo este titular lanzaba Rafael Carmona una cuestión en los foros de Olivares 2000, voy a intentar responderle desde aquí:
Para empezar con SQL, y sobre todo para quien viene de xBase, siga estas instrucciones:
- Mentalicese de que no se tiene acceso directo a las tablas.
- Recuerde que trabaja con imágenes de los datos, no con los datos reales.
- Olvidese por completo de intentar trabajar SQL al estilo xBase.
- Aprenda, por favor, sintaxis SQL. Esto es MUY importante.
Por supuesto para practicar debe contar con un servidor SQL o algo similar en su equipo, así puede descargarse e instalar cualquiera de los que hay circulando por internet. Puede incluso hacer uso de sistemas embebidos que alojaran las tablas SQL de forma local ahorrandose poner un servidor.
Mi recomendación es que se haga con un servidor tipo MySQL, PostGress, MSSQLServer, etc... Así, además, tendrá la oportunidad de aprender algo de administracion de servidores de bases de datos.
Para lo que voy a contar ahora es necesario MySQL.
Existe un estupendo trabajo de Manu Expósito denominado Eagle 1. Eagle 1 es una libreria de funciones y clases para acceder a MySQL de forma directa y sin hacer uso de ningun driver ODBC.
También está disponible mi clase TQuery para trabajar de forma sencilla con Eagle 1 version 2.5. Disponible via correo electronico para quien me la pida a jasm (arroba) chochurro (punto) com.
Jose A., gracias por los consejos, y entiendo ahora como trabaja , mas o menos, el tema en cuestion.
Pero dejame tambien comentarte, que para hacer pruebas simples , no hace falta para nada montarte un servidor de SQL, ya sea MySQL, SQL Server ,etc.
Gracias a un trabajo de Alejandro de Garate, tienes acceso a SqlLite, tienes los fuentes en C y te puedes crearte una libreria estatica para linkar con C , ya tienes tu programa con acceso a SQL.
Creo, que para empezar a experimentar con el SQL, y nada de conexiones , et, con sqlite es mucho mas simple.
Oomo sabes , estoy esperando con ganas una version de Eagle1 para los compiladores gcc, para
poder usar T-Gtk para mostrar los resultados.
Saludos.
Rafa,
Si bien para mostrar resultados esta muy bien el trabajo de Alejandro, intenta editar datos de una consulta resultante de la unión de dos tablas.
O más simple, haz la edición de datos de una sola tabla. Ojo a los tipos ¿eh? Ahí es donde le veo yo agujeros al trabajo de Alejandro.... Llevo ya mas de un mes dandole vueltas al tema.
Saludos.
Comentado por Jose A. Suárez a Jueves, 21 de Julio de 2005A biblioteca Eagle1 parece ótima. Como obter mais informações sobre ela?
Comentado por oliveiros a Jueves, 21 de Julio de 2005Jose A.
>Si bien para mostrar resultados esta muy bien el >trabajo de Alejandro, intenta editar datos de >una consulta resultante de la unión de dos tablas.
No he llegado a ese punto.
Estoy rehaciendo el ejemplo para permitir tener
un browse y ejecutar QUERYS y que el browse se
me actualice segun el query.
>O más simple, haz la edición de datos de una >sola tabla. Ojo a los tipos ¿eh?
Si, eso ya si.
Alejandro devuelve un array con el contenido en cadenas.
Queda pendiente, como podemos saber el tipo de una columna, es MONTAR y TRANSFORMAR el valor devuelto por el query al tipo que le corresponderia y montarlo en el Browse.
Por ejemplo, si el campo CANTIDAD es del tipo FLOAT, pero nosostros tenemos como cadena, "12.22"
deberiamos tranformar el contenido del array a float y en el browse, al menos en t-gtk, podemos
decirle al modelo de datos, que esa columna será del tipo G_TYPE_FLOAT, sin problemas.
>Ahí es donde le veo yo agujeros al trabajo de >Alejandro.... Llevo ya mas de un mes dandole >vueltas al tema.
Yo creo, que alejandro dejo la puerta abierta, y
puso un ejemplo simple de que la puerta estaba abierta!
La verdad , es que queda curro para dejarlo bien,
pero mi idea era solamente DESCUBRIR el como trabajar contra SQL, nada mas.
No se como lo hace Eagle1, al igual nos sacas de duda, pero creo que el sistema debe o deberia ser muy similar, lanzar un query y obtener un array bidimensional con los resultados.
Saludos
Rafa Carmona
Saludos.
Jose A.
>Si bien para mostrar resultados esta muy bien el >trabajo de Alejandro, intenta editar datos de >una consulta resultante de la unión de dos tablas.
No he llegado a ese punto.
Estoy rehaciendo el ejemplo para permitir tener
un browse y ejecutar QUERYS y que el browse se
me actualice segun el query.
>O más simple, haz la edición de datos de una >sola tabla. Ojo a los tipos ¿eh?
Si, eso ya si.
Alejandro devuelve un array con el contenido en cadenas.
Queda pendiente, como podemos saber el tipo de una columna, es MONTAR y TRANSFORMAR el valor devuelto por el query al tipo que le corresponderia y montarlo en el Browse.
Por ejemplo, si el campo CANTIDAD es del tipo FLOAT, pero nosostros tenemos como cadena, "12.22"
deberiamos tranformar el contenido del array a float y en el browse, al menos en t-gtk, podemos
decirle al modelo de datos, que esa columna será del tipo G_TYPE_FLOAT, sin problemas.
>Ahí es donde le veo yo agujeros al trabajo de >Alejandro.... Llevo ya mas de un mes dandole >vueltas al tema.
Yo creo, que alejandro dejo la puerta abierta, y
puso un ejemplo simple de que la puerta estaba abierta!
La verdad , es que queda curro para dejarlo bien,
pero mi idea era solamente DESCUBRIR el como trabajar contra SQL, nada mas.
No se como lo hace Eagle1, al igual nos sacas de duda, pero creo que el sistema debe o deberia ser muy similar, lanzar un query y obtener un array bidimensional con los resultados.
Saludos
Rafa Carmona
Saludos.
Rafa,
Las funciones C de Eagle 1 tambien te proporcionan un array bidimensional con el resultado o un acceso de lectura a un cursor de MySQL. En ese array sólo vienen los datos, nada de incluir los nombres de columna.
La diferencia es que cuando lo desees puedes cargar la estructura completa de la consulta tanto en formato SQL como en su correspondiente xBase.
Como bien apuntas en tu comentario, tenemos un problema para poder tratar los tipos FLOAT. Manu, en Eagle 1, lo trata como un numérico.
Saludos,
Comentado por Jose A. Suárez a Domingo, 24 de Julio de 2005Jose, perdona por mi ignoracia, ojo que al igual meto la gamba, pero no veo cual es el problema que podeis tener.
A efectos de Harbour, se trata como un numerico, y si lo que quereis es pasarle a C desde Harbour, podeis determinar que el paso pasado desde Harbour sea tratado a nivel de C, como FLOAT,DOUBLE, INT, o lo que sea.
Si , ojo, todo teoria...:
Value_to_C( 123.33, TYPE_FLOAT )
HB_FUNC( VALUE_TO_C )
{
PBH_ITEM pItem = hb_param( 1, ANY )
int iType = hb_parni( 2 );
switch( iType )
{
case iType:TYPE_FLOAT
// Typo FLOAT...hcemos..
// Jugamos con el HBITEM..
Break;
}
}
Todo es una aproximacion, claro.
Saludos.
Rafa Carmona