Ir al contenido



Foto

Uso de SQL en bases de Datos Access con Delphi


  • Por favor identifícate para responder
47 respuestas en este tema

#1 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 27 julio 2010 - 08:53

En el hilo
http://www.delphiacc...hp?topic=1555.0
Conversamos con Caral sobre mis dudas en el uso de SQL. Temas como concatenación, parámetros y otros aparecieron y acordamos con Caral iniciar un nuevo hilo a los efectos de que se pueda ilustrar en  una aplicación sencilla y a nivel básico estos tópicos.
Agradecido al Foro y a Caral por hacer posible esto
Adjunto un esbozo de base Academia.mdb para iniciar el trabajo
Un saludo

Archivos adjuntos


  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 28 julio 2010 - 08:58

Hola
He creado un programita que servirá para que todos aportemos nuestro grano de arena.
El programa es sencillo de usar, la idea es que aportéis en este mismo (siguiendo las indicaciones que tiene) y lo coloquéis en un adjunto con la modificación hecha.
Comienzo con lo básico y la explicación, de ahí en adelante se ira llenando.
Espero os guste la idea.
Recordad: Solo SQL.
Saludos

Archivos adjuntos


  • 0

#3 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 29 julio 2010 - 04:13

Buenas,

No tengo Access instalado en mi PC, sólo tengo OO, por lo que abrir la BD puedo pero hacer cambios....

Para completar un poco la base de datos, añadiría alguna tabla para así poder hacer relaciones entre las mismas. Por ejemplo:

Clases -> con esto sabemos qué alumnos van a qué curso y qué profesor imparte dicho curso
K  ID: integer
UK ID_Curso: integer
UK ID_Alumno: integer
UK ID_Profe: integer

K = llave primaria
UK = índice único

Otra tabla podría ser Tutor, que sería una tabla que indicaría qué profesor es tutor de qué alumno, pero como no entiendo muy bien el funcionamiento de la tabla Cursos, os dejo que la planteéis vosotros :D Es decir, un curso no se si es un año escolar (1er de primaria, 2on de primaria, ......) o bien una asignatura (1er primaria, clase A, matemáticas; 1er primaria, clase B, lengua;....). Un tutor, a mi entender, es la persona que "dirigiría" 1er primaria clase A.

Es decir, intentemos crear cuantas más tablas mejor (sin pasarnos) para así poder exprimir lo más posible al SQL.

Yo no se mucho de Access, de echo creo que no he programado nunca una aplicación que lo use, así que... si pregunto alguna animalada no os enfadéis  *-)

Preguntas:
1.- ¿En Access existen los índices únicos? Esto lo digo porque una llave primaria suele ser más eficiente si es de tipo entero (el motor suele indexar más rápido un campo numérico que uno alfanumérico). En el caso de existir, añadiría un campo ID (que puede ser autoincremental) en las tablas Alumnos, Profesores y Cursos y los campos DNI y Código de las mismas los pondría como índices únicos.

2.- Las tablas Alumnos, Profesores y Cursos tienen un campo Comentarios y la tabla NotasU uno llamado Nota que el OO me lo marca de tipo SQL Null. Esto imagino que será un Blob de tipo texto de Firebird, ¿no?


A parte de todo esto, y esto ya es una opinión más personal, creo que escoger Access como motor de base de datos es un error. Creo que se debería de haber escogido uno que fuera un SGBDR para poder ver cosas interesantes como los triggers, procedimientos almacenados, vistas, claves foráneas, índices únicos, claves simples o compuestas, relaciones de integridad, excepciones,.... (quizás se pueda hacer en Access, no lo se, como ya he dicho la desconozco bastante).

Nos leemos

  • 0

#4 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 29 julio 2010 - 05:42

Hola
He creado un programita que servirá para que todos aportemos nuestro grano de arena.
El programa es sencillo de usar, la idea es que aportéis en este mismo (siguiendo las indicaciones que tiene) y lo coloquéis en un adjunto con la modificación hecha.
Comienzo con lo básico y la explicación, de ahí en adelante se ira llenando.
Espero os guste la idea.
Recordad: Solo SQL.
Saludos

Hola Caral:
Muchas gracias. El programa promete por lo simple y operativo.
Sólo decir a los que aporten que no olviden poner en la nota el códgo SQL usado y un comentario explicativo para novatos (aunque sea algo obvio). Creo que ese es el espíritu del programa.
Un saludo y hasta pronto
  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 29 julio 2010 - 05:58

Hola

Es decir, intentemos crear cuantas más tablas mejor (sin pasarnos) para así poder exprimir lo más posible al SQL.

Totalmente de acuerdo amigo.

2.- Las tablas Alumnos, Profesores y Cursos tienen un campo Comentarios y la tabla NotasU uno llamado Nota que el OO me lo marca de tipo SQL Null. Esto imagino que será un Blob de tipo texto de Firebird, ¿no?

Si el campo NotasU, que es el que usaremos para comentar el sql que hagamos es de tipo Blob en firebird.

A parte de todo esto, y esto ya es una opinión más personal, creo que escoger Access como motor de base de datos es un error. Creo que se debería de haber escogido uno que fuera un SGBDR para poder ver cosas interesantes como los triggers, procedimientos almacenados, vistas, claves foráneas, índices únicos, claves simples o compuestas, relaciones de integridad, excepciones,.... (quizás se pueda hacer en Access, no lo se, como ya he dicho la desconozco bastante).

En access se puede hacer casi de todo, menos Gatitos (triggers).

Se escogio access por simpleza, para novatos y por el uso de ADO.
Se puede hacer un programa ejemplo, paralelo, con Firebird, pero si el sql de este esta bien se puede trasladar a firebird sin problemas.

Nos gustaria que aportaras en este amigo. (y), si requieres que se hagan mas tablas solo di cuales con sus campos y yo las incluyo.

Saludos

  • 0

#6 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 29 julio 2010 - 07:22

Hola Caral:
No sé si estoy haciendo algo mal pero cuando intento visualizar un nuevo ejemplo me sale un mensaje de error que te adjunto.
Saludos

Archivos adjuntos


  • 0

#7 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 29 julio 2010 - 07:50

Hola
Coloca el Archivo con el codigo del programa en un zip, a ver que paso.
Saludos
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 29 julio 2010 - 08:18

Buenas,

En access se puede hacer casi de todo, menos Gatitos (triggers).

Pues ya tardas en explicar cómo se hace todo eso, así me entero :D

Y tablas nuevas... pues al menos las dos que te he mencionado arriba, con eso ya podemos empezar "a jugar" :)
Por cierto, pueden crearse con sentencias SQL esas tablas? Sería bueno ver cómo se hace en Access si se puede :)

Nos leemos

  • 0

#9 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 29 julio 2010 - 08:20

Hola
Coloca el Archivo con el codigo del programa en un zip, a ver que paso.
Saludos

No sé si es esto lo que pedís. Te mando un zip con la aplicación completa. La única modificación es la ruta de la base. EL resto no se graba porque da el mensaje del que te he hablado.
Saludos

Archivos adjuntos


  • 0

#10 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 29 julio 2010 - 04:47

Hola
Creo que no me hice entender como funciona el programa, disculpa amigo.
El programa contiene hojas.
Cada hoja es un ejemplo que hace el usuario (esto se hace en diseño, no en ejecución).
Cada hoja tiene un nombre que se coloca en la propiedad Name de la hoja (TabSheet).
Ese nombre es el que se pone en el edit que dice Pagina (en ejecucion, en el DBEdit1).
El boton (ir al Ejemplo) lo que hace es abrir la pagina, osea, el nombre de la pagina tendra que ser el mismo nombre que se pondra en el edit (DBEdit1, en ejecucion para que se guarde en la BD)
He modificado el programa para que veas de lo que hablo.
Saludos
PD: La idea es crear una especie de cuaderno de ejemplos.

Archivos adjuntos


  • 0

#11 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 29 julio 2010 - 05:09

Hola

A parte de todo esto, y esto ya es una opinión más personal, creo que escoger Access como motor de base de datos es un error. Creo que se debería de haber escogido uno que fuera un SGBDR para poder ver cosas interesantes como los triggers, procedimientos almacenados, vistas, claves foráneas, índices únicos, claves simples o compuestas, relaciones de integridad, excepciones,.... (quizás se pueda hacer en Access, no lo se, como ya he dicho la desconozco bastante).

Bueno: Amplio un poco esto.
Primero, no creo que sepa todo de access, mucho menos de sql, pero lo que si se (que es poco) :

Que se puede hacer en access:

triggers = NO.
procedimientos almacenados = No se ni que son  :
Vistas = SI
Claves Foraneas = CREO que si, pero no estoy seguro.
Indices Unicos = SI
Claves Simples o Compuestas = Creo que no se ni como se comen  :
Relaciones de integridad = Bueno, se que relaciones SI, pero no se de integridad.
Excepciones = SI, sobre todo con ADO.

Ademas:
Transacciones, Commit, rolback etc. = SI

Saludos
  • 0

#12 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 29 julio 2010 - 05:46

Hola
Creo que no me hice entender como funciona el programa, disculpa amigo.
El programa contiene hojas.
Cada hoja es un ejemplo que hace el usuario (esto se hace en diseño, no en ejecución).
Cada hoja tiene un nombre que se coloca en la propiedad Name de la hoja (TabSheet).
Ese nombre es el que se pone en el edit que dice Pagina (en ejecucion, en el DBEdit1).
El boton (ir al Ejemplo) lo que hace es abrir la pagina, osea, el nombre de la pagina tendra que ser el mismo nombre que se pondra en el edit (DBEdit1, en ejecucion para que se guarde en la BD)
He modificado el programa para que veas de lo que hablo.
Saludos
PD: La idea es crear una especie de cuaderno de ejemplos.

No creo que sea culpa tuya Caral. Soy yo el que no lo entiende. Más aún sigo sin entenderlo.
Cuando publiques otro ejemplo o un paso a paso lo intentaré de nuevo.
Disculpa las molestias que te genera este novato.
Saludos
  • 0

#13 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 29 julio 2010 - 05:51

Hola
Para nada amigo.
Voy a ver si hago otro ejemplo, no te preocupes.
Saludos
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.259 mensajes
  • LocationArgentina

Escrito 29 julio 2010 - 08:34

Hola,
He estado mudo sobre esto... no es que no quiera aportar, sino que considero que ustedes pueden hacer sin problemas porque veo que tienen conocimiento y la capacidad para ello.
Solamente vengo para hacer algunas aclaraciones y pequeñas correcciones sobre los SI/NO que mencionó Carlos:

Claves foráneas: SI. De no existir no se podría realizar relaciones y fallaría por tanto el concepto del álgebra relacional. La clave foranea no es más que un campo cualquiera que "apunta" a una clave primaria. No hay que hacer nada. Al establecer la relación Access solito sabrá que dicho campo será la clave foránea.

El único requisito que debe cumplir el campo es que sea, obviamente, del mismo tipo que la clave primaria a la que apunta. Por ejemplo: si PK es autonumérico o numérico, entonces la clave debe ser numérico.

Claves Simples/Compuestas: SI a ambas. La clave compuesta no es más que dos campos marcados con la llavecita... El procedimiento es idéntico a la clave primaria simple... únicamente que en vez de seleccionar una sola, se seleccionan dos o mas y luego se hace clic en "crear clave" o la llavecita (al menos ese dibujo tenía hasta la versión 2003).
Aunque se desaconseja el uso de clave compuestas.

Relaciones de Integridad: SI, aunque Parcial. En Access se puede (y lo aconsejo) armar las relaciones de integridad referencial. Permite, si no me falla la memoria de actualizaciones y eliminación en cascada solamente.

Respecto al soporte de transacciones y excepciones, eso solo es posible mediante el manejo de ADO. De forma nativa Access no posee manejo a nivel de transacciones ni de excepciones. Al menos eso es lo que tengo entendido.

Recuerden que Access no es más que una simple (y limitada) fachada del motor Jet4 y no un motor per sé.

Saludos,
  • 0

#15 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 30 julio 2010 - 02:40

Buenas,

Entiendo, entonces Access se comporta igual que Paradox, que sin el BDE (o dbExpress) no es nada  :D

Entonces lo de generar tablas, índices y demás "tonterías" mediante sentencias SQL desde Delphi lo olvidamos, ¿no? :D Vamos, que nos quedamos con la cláusula Select (que no es moco de pavo).

Bien, centrándonos en dicha cláusula.... imagino que Access (o el motor Jet en su defecto) permitirán sentencias SQL complejas, es decir, realizar subselects en las cláusulas select, from o where, realizar unions, especificar la cantidad de registros que quieres que te devuelva una consulta (first de Firebird), uso de condicionales (como el case o ifnull o coalesce o algo por el estilo) en la cláusula select...

Es decir, qué se puede hacer y hasta dónde se puede llegar con Access y el motor Jet? <:o)
Lo del motor lo digo porque, al menos con Paradox y el BDE, donde no llegaba la base de datos sí lo hacía el BDE.

Con esto ya se podría empezar a pensar en consultas divertidas :)

Nos leemos

  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.259 mensajes
  • LocationArgentina

Escrito 30 julio 2010 - 08:15

Entiendo, entonces Access se comporta igual que Paradox, que sin el BDE (o dbExpress) no es nada  :D


Algo así. Hay quienes dicen que cada vez que se menciona a Access se muere un gatito, pero fuera de bromas, quizá Access no pueda compararse con un motor serio y no tenga demasiada escalabilidad pero funciona muy bien en su ambiente.

Y es una alternativa barata, sencilla a considerar para proyectos relativamente medianos a chicos.

Entonces lo de generar tablas, índices y demás "tonterías" mediante sentencias SQL desde Delphi lo olvidamos, ¿no? :D Vamos, que nos quedamos con la cláusula Select (que no es moco de pavo).

No es tan así... Access no cuenta con muchas cosas como la de generar eso via SQL pero con el uso de ADO se puede llegar a armar tablas temporales, índices, y más.

Bien, centrándonos en dicha cláusula.... imagino que Access (o el motor Jet en su defecto) permitirán sentencias SQL complejas, es decir, realizar subselects en las cláusulas select, from o where, realizar unions, especificar la cantidad de registros que quieres que te devuelva una consulta (first de Firebird), uso de condicionales (como el case o ifnull o coalesce o algo por el estilo) en la cláusula select...

Es decir, qué se puede hacer y hasta dónde se puede llegar con Access y el motor Jet? <:o)
Lo del motor lo digo porque, al menos con Paradox y el BDE, donde no llegaba la base de datos sí lo hacía el BDE.

Con esto ya se podría empezar a pensar en consultas divertidas :)

Nos leemos

Así es... gracias a ADO y al motor Jet4 se pueden generar consultas complejas. Access, de forma nativa, soporta los JOINS, WHERE, UNION, tiene su propia versión de COALESCE... si no recuerdo mal, se llama IIF (hace tiempo que no uso Access), ORDER BY, GROUP BY, IN, subconsultas, FIRST (incluso... creo que tiene un LAST).

Access se vé limitado por la escalabilidad. Los archivo .mdf (¿Era esa la extensión?) están limitados a un máximo de 2GB, aunque se puede solventar esta deficiencia valiéndose de tablas compartidas (varios archivos de access ligados, se reparte el diseño de la base de datos en varios archivos). Como ya he dicho, no tiene manejo de transacciones ni control de recurrencia. Se puede trabajar en red modestamente. Posee poco niveles de seguridad y si te se va la luz a llorar...

Si, Access tiene sus limitaciones... como todas las cosas. Pero para ciertos escenarios se comporta bien. Gracias a ADO puede llegar a ser, si se me permite la expresión, un mini MS SQL Server.

El diseño de Access está centrado en aplicaciones monousuarios de tamaño moderado, aunque para una red pequeña funcionará bien. Ofrece un entorno visual y unas herramientas muy interesantes, la posibilidad de emitir informes, diseñar formularios para la entrada de datos, un generador de consultas. Es más, incluye asistentes para todo ello. Unos clics y ya tienes todo funcionando.

Saludos,
  • 0

#17 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 30 julio 2010 - 08:17

Hola
Veamos algunas sentencias sql que he hecho en access:

Uso de first + Sum + LEFT JOIN + Where + Group By + Parametros:


sql
  1. SELECT DISTINCTROW Materiales.CodMaterial, Materiales.Descripcion, FIRST(TransMaterial.Fecha) AS [Primero De Fecha],
  2. FIRST(TransMaterial.Tipo) AS [Primero De Tipo], FIRST(TransMaterial.Usuario) AS [Primero De Usuario], SUM(TransMaterial.Cantidad) AS [Suma De Cantidad]
  3. FROM Materiales LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial
  4. WHERE TransMaterial.Tipo="Salida" AND TransMaterial.Usuario= :prod
  5. TransMaterial.Cantidad >0  AND TransMaterial.Fecha >= F1 AND TransMaterial.Fecha <= F2
  6. GROUP BY TransMaterial.Fecha, Materiales.CodMaterial, Materiales.Descripcion



Concatenar + subselect + RIGHT JOIN:


sql
  1. SELECT SerieMaterial.NumSerie, OrdenProdItem.CodOrden, OrdenProdItem.CodParte, [Articulos.Descripcion]+" "+[Categoria]+" "+[SubCategoria] AS Descr,
  2. SerieMaterial.CodMaterial, Materiales.Descripcion, Materiales.Unidad, SerieMaterial.Cantidad, Materiales.Costo, OrdenProdItem.FinProd, SerieMaterial.CostoALaFecha,
  3. (SELECT COUNT(*) FROM OrdenProdItem)
  4. FROM Articulos RIGHT JOIN (OrdenProdItem INNER JOIN (Materiales RIGHT JOIN SerieMaterial ON Materiales.CodMaterial = SerieMaterial.CodMaterial)
  5. ON OrdenProdItem.NumSerie = SerieMaterial.NumSerie) ON Articulos.CodParte = OrdenProdItem.CodParte
  6. WHERE OrdenProdItem.FinProd >= F1 AND OrdenProdItem.FinProd <= F2 +1



Uso de IIF + ORDER BY:


sql
  1. SELECT IIf([TipoTransac]="FA","Factura","Nota Débito") AS Documento, CxCobrar.CodTransac, CxCobrar.FechaTransac, CxCobrar.CodCliente,
  2. Clientes.NombreCliente, CxCobrar.Balance, CxCobrar.PagosRec, [Balance]-[PagosRec] AS Saldo, DATE()-[CxCobrar]![FechaTransac] ASAS
  3. FROM Clientes RIGHT JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente
  4. WHERE (((CxCobrar.CodCliente)>=[PRI] AND (CxCobrar.CodCliente)<=[FIN]) AND (([Balance]-[PagosRec])>0) AND ((CxCobrar.TipoTransac)="FA" OR (CxCobrar.TipoTransac)="ND"))
  5. ORDER BY CxCobrar.CodCliente, CxCobrar.OrdTrans;



Todas estas y mas complicadas funcionan en access y con algunos cambios funcionan en Firebird.

Doy fe ya que estas las use mucho tiempo en mi programa con access y ahora, con algunos cambios las uso en firebird.

Saludos

  • 0

#18 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 31 julio 2010 - 09:09

Hola
Este ejemplo (Caral2) es para:
Ver, Modificar e Insertar Alumnos, Cursos y Profesores.
Todo esto lo hace con sql y usando un solo AdoQuery.
Se usa Un select normal, un Update para modificar y un Insert para incluir.
Todo esto con Parametros.
Es muy sencillo y repetitivo lo que hace que el codigo sea facil de entender.
Espero os sirva y sigamos aprendiendo.
Esperamos vuestros aportes.
Saludos

Archivos adjuntos


  • 0

#19 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 31 julio 2010 - 02:45

Hola
Siguiendo con estos ejemplos creo que se deberia de crear dos tablas adicionales.
Alumnos/Cursos/Profesores
Profesores/Cursos.
De esta manera se podra ver:
Que alumnos tienen que cursos y con que profesor y Que profesores tienen que cursos.
Ademas se podra modificar o ampliar lo que se necesite.
Esto es interesante para hacer consultas cruzadas en SQL y asi aprender.
Saludos
  • 0

#20 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 31 julio 2010 - 05:04

Hola Caral. Finalmente he conseguido utilizar tu programa. Te mando este ejemplo no tanto por su valor ya que es elemental, como mis conocimientos, sino para practicar con el programa.
Un saludo y gracias por tu paciencia

Archivos adjuntos


  • 0