Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Consultas Access en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=66262)

Er0s 10-02-2010 13:04:28

Consultas Access en Delphi
 
Buenos días!!

He estado buscando por el foro y no encuentro nada que satisfazga mi deseo.

Estoy haciendo una aplicacion para mi uso personal "Servicio Tecnico Informatico" en el que tengo de momento dos tablas hechas en access Clientes y Averias. Las tablas estan Bien definidas me funciona todo a la perfeccion añado borro edit, bla bla bla.

Mi problema viene a la hora de sacar las consultas en pantalla digamos que quiero ver el historial de averias del pc de un cliente, en access pide el DNI del cliente y me saca toda la informacion, por lo que funciona perfetamente ,pero... como puedo pasar esa consulta a delphi.

Cada vez que lo intento me saca el mensaje "Pocos parametros se esperaba 1", y supongo que es el DNI que en acces tengo como filtro para que saque la informacion.

No se si me explique bien o me entendereis, espero que si y a ver si me echais un cable. Gracias de antemano.

Caro 10-02-2010 13:14:07

Hola Er0s, bienvenido al foro, sería bueno que pusieras el codigo delphi que tienes.

Para hacer una consulta debes hacerlo de esta forma:

Código Delphi [-]
  Query.Close;
  Query.Sql.Text := 'Select * From Clientes Where DNI='+Edit1.Text;
  Query.Open;

Suponiendo que el DNI lo introduces en un Edit, si tu campo DNI es String debes añadir comillas.

Saluditos

Er0s 10-02-2010 13:21:00

Pues codigo no he metido nada aún, todo esta hecho con clicks de raton.

Estoy utilizando un TADOStoreProc pero como como decia antes me salta el error de Falta un Parametro. Si en lugar de esa consulta que pide un parametro metro una consulta ya filtrada me lo muestra perfectamente.

Y quisiera saber si hay una propiedad de este componente que me pida en pantalla ese parametro que le falta y que supongo que se referirá, en este caso, al DNI que en access pido.

Neftali [Germán.Estévez] 10-02-2010 14:00:56

Cita:

Empezado por Er0s (Mensaje 353551)
Y quisiera saber si hay una propiedad de este componente que me pida en pantalla ese parametro que le falta y que supongo que se referirá, en este caso, al DNI que en access pido.

No.

Como bien ya te ha dicho Caro, lo mejor es que crees las consultas en tu programa Delphi, ya que así tendrás más control sobre lo que haces y si algun día decides cambiar de Base de Datos, el cambio será menos traumático.

Si aun así deseas utilizar las consultas creadas en Access (por que sean muy complejas o porque no deseas reescribirlas) debes utilizar para llamarlas el componente TADOStoredProc.

El tema de los parámetros de Access en las consultas (que te lo pida) no es un tema del motor de Base de Datos, sino del propio Access como programa; Por lo tanto si usas el motor "desde fuera", por ejemplo desde un programa Delphi+ADO como tú estás haciendo, nunca te pedirá esos parámetros.

Debes utilizar un TADOStoredProc y definir como parámetros del Stored, los mismo que tienes definidos en la consulta. Antes de llamarlo, los rellenas y luego haces la llamada.

Cita:

Empezado por Er0s (Mensaje 353551)
...pero como como decia antes me salta el error de Falta un Parametro. Si en lugar de esa consulta que pide un parametro metro una consulta ya filtrada me lo muestra perfectamente.

Por que no estás pasando el parámetro que el ADOStoredProc necesita. POr eso cuando la consulta no tiene parámetros sí funciona.

Haz una búsqueda en los foros por Parametros y ADOStoredProc y verás como te salen unos cuantos hilos al respecto con bastantes ejemplos.

Er0s 10-02-2010 18:01:04

Gracias Caro y neftali por responder

Esta noche mirare porque ando en el curro.... pero si no entiendo mal neftali, me estas diciendo que use codigo para acceder a las BD no? como si de un fichero se tratase no?

Disculpad mi ignorancia

Caro 10-02-2010 19:23:47

Cita:

Empezado por Er0s (Mensaje 353583)
Esta noche mirare porque ando en el curro.... pero si no entiendo mal neftali, me estas diciendo que use codigo para acceder a las BD no? como si de un fichero se tratase no?

Hola de nuevo, lo que te dice Neftali es que lo hagas de la forma del ejemplo que he puesto en mi primer mensaje.

Si quieres hacerlo con tu consulta de access, debes crearte el parametro con el mismo nombre que tienes en access como te dijo Neftalí, y no te olvides ponerle su tipo en la propiedad DataType. El código delphi para ejecutar tu consulta pasandole el prámetro sería así:

Código Delphi [-]
 ADOStoredProc1.Close; //También vale con Active := False;
 ADOStoredProc1.Prepared := True;;
 ADOStoredProc1.Parameters[0].Value := StrToInt(Edit1.Text);
 ADOStoredProc1.Open; //Active := True;

Ahora creo :rolleyes: que si el procediento no devuelve valor se debe ejecutar con ADOStoredProc1.ExecProc, pero mejor si Neftalí nos confirma eso.

Saluditos

Neftali [Germán.Estévez] 11-02-2010 09:48:08

Cita:

Empezado por Er0s (Mensaje 353583)
...pero si no entiendo mal neftali, me estas diciendo que use codigo para acceder a las BD no? como si de un fichero se tratase no?

Intentaré explicarme mejor.

Hay 2 formas de ejecutar una consulta en Access desde un programa Delphi.

OPCION 1: Crear la consulta en Delphi utilizando SQL. Para ello necesitaras un componente TADOQuery; Y como tu consulta tiene una parámetro (valor variable) que comentas que es el DNI, deberás usar algo similar a lo que Caro te ha comentado aquí.

OPCION 2: Si no sabes SQL o quieres usar la consulta que has creado en Access, debes utilizar un componente TADOStoredProc. Como tu consulta tiene un parámetro variable, debes usar para rellenarlo un código similar al que Caro te ha comentado en este otro post.

Si tu consulta no tuviera parámetros podrías utilizar un TADOStoredProc directamente o pegar la SQL en un TADOQuery y ejecutarlo directamente (sin código). Como tu consulta tieve un parámetro variable (DNI) o se lo añades con código al TADOQuery(SQL) o se la pasas al TADOStoredProc. En ambos casos deberás utilizar algo de código.

Un saludo.

Er0s 11-02-2010 10:23:21

El codigo Funciona

Cita:


datamodule1.Consulta.Close;
datamodule1.Consulta.Prepared := True;;
datamodule1.Consulta.Parameters[0].Value := Edit1.Text;
datamodule1.Consulta.Open;
datamodule1.Consulta.ExecProc;

Ahora mi pregunta, dado mi ignorancia, es la siguiente como muestro esos datos filtrados por DNI en pantalla ya sea en DBedits o en una DBGrid, es decir como busco en la tabla dichos datos con el parametro obtenido y como los muestro despues en pantalla?

Caro 11-02-2010 13:51:36

Cita:

Empezado por Er0s (Mensaje 353654)
Ahora mi pregunta, dado mi ignorancia, es la siguiente como muestro esos datos filtrados por DNI en pantalla ya sea en DBedits o en una DBGrid, es decir como busco en la tabla dichos datos con el parametro obtenido y como los muestro despues en pantalla?

Hola de nuevo, en el Edit ya le estas pasando un valor a tu consulta, ahora solo debes añadir un DataSource enlazado a tu TAdoStoredProc y tu dbgrid enlazado a tu datasource y veras el resultado.

Saluditos

Er0s 11-02-2010 16:46:12

Cita:

Empezado por Caro (Mensaje 353660)
hora solo debes añadir un DataSource enlazado a tu TAdoStoredProc y tu dbgrid enlazado a tu datasource y veras el resultado.

Saluditos


Llevaba to la mañana probandolo y no habia manera de mostrar datos...... Toda la mañana metiendo DNI en el Edit y que no salen los datos. Una y mil veces hice lo que acabas de escribir y una y mil veces metia el DNI a ver si encontraba al cliente y nada. hasta que viene la iluminacion y me llega a la mente " Calamar esta consulta necesita un nombre no un DNI" lol.

Todo Ok, ya me muestra datos. Gracias por vuestra rapida ayuda.

Hasta la proxima Duda :P

Er0s 17-03-2011 02:56:59

Despues de un año trabajando con componentes TAdoStoreProc, Gracias a vuestra ayuda, me encuentro hoy con un problemilla.

Ejemplo:

Tenemos dos explotaciones ganaderas, si escojo una explotación ganadera quiero mostrar un listado de las cabezas de ganado que hay en dicha explotacion y si escojo la otra pues obviamente mostrara las cabezas de ganado que existan.

Con los ejemplos que aprendí gracias a vosotros, funciona pero....

1. selecciono explotacion
2. quiero listado
3. no sale el listado... DBGrid vacia
4. quiero listado
5. Sale el listado siempre que lo solicite de aquí en adelante
6. Si selecciono otra explotacion volvemos al punto 1

Código Delphi [-]
    datamodule1.storeproc.Close;
    datamodule1.storeproc.Parameters[0].Value:=ExploId;
    datamodule1.storeproc.Prepared:=true;
    datamodule1.storeproc.open;
    datamodule1.storeproc.exeproc;

Este es el código que utilizo

Alguna idea de porque no me da la información la primera vez que lo solicito?

Caral 17-03-2011 03:24:25

Hola
Bueno, nunca he usado un TAdoStoreProc, de hecho nunca lo habia visto (que despistado).
Lo cierto es que si hay una consulta en access y la quiero usar en mi programa en delphi, tal cual, simplemente la llamo desde un simple ADOTable, como si fuera una tabla mas.
Si se necesita filtrarla, pues se hace un filtro.
Creo que se le llama una vista, en firebird se usan igualmente.
Saludos

Er0s 17-03-2011 13:10:23

Hola Caral!!

Siguiendo tus pasos he creado una AdoTable y se la asigno al datasouce y este a la dbgrid hasta ahí todo correcto.


Siguiendo el ejemplo anterior, el codigo de explotación es un numero que tengo almacenado en una variable global llamada ExploId. Como filtro la tabla con la variable global? Se puede filtrar dicha tabla mirando en un solo campo de ella o revisa toda la tabla?

datamodule1.adotable.filter........

Gracias


La franja horaria es GMT +2. Ahora son las 14:36:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi