PDA

Ver la Versión Completa : Consultas En Sql delphi 7 con Base de Datos access


luisraad
20-09-2011, 20:57:31
Buenas Tardes
Bienvenidos Todos a este nuevo tema que hoy abro..

hoy quiero aprender y tambien que los demas aprendan como se pueden realizar consultas en SQL mediante delphi hacia una BD creada en microsoft access y conectada a delphi mediante componentes ADO.

los temas que me interesan aprender son;

.como realizo una consulta sensilla en SQL mediante delphi en una sola tabla de access.

.como se manejan dos consultas en una misma tabla. de access osea consultar 2 campos de la tabla y aplicar condiciones

. como hacer mas de tres consultas en diferentes tablas en la misma BD de access, osea consultar varios campos entre diferentes tablas en la misma BD

espero que agreguen y aporten su granito de arena para conocer este excelente tema de intereses para todos nosotros ((los novatos)):D
un saludo a todos los del foro especialmente a caral

saludos...

Casimiro Notevi
20-09-2011, 21:15:55
Amigo luisraad, por favor, el trabajo del colegio no nos lo encargues a nosotros, ya que entonces tú no aprenderás ;)
¿Hace falta que te recuerde nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?

Casimiro Notevi
20-09-2011, 21:19:34
.como se manejan dos consultas en una misma tabla. de access osea consultar 2 campos de la tabla y aplicar condiciones


Por cierto, si ese es el enunciado de la pregunta de tu tutor, entonces tu tutor no tiene ni idea. Supongo que lo has "traducido" tú.

Consultar 2 campos, 1 campo, 84 campos o cien mil campos... no es hacer 2 consultas, 1 consulta, 84 consultas, etc.

¿Por qué no miras un simple tutorial de SQL?, una búsqueda en google devuelve millones de entradas para "tutorial sql".

Caral
20-09-2011, 22:11:49
Hola
Access tiene un generador de consultas, que a mi parecer es muy bueno.
Se puede hacer con el asistente, este ira colocando los datos que se necesiten o se puede hacer directamente en sql.
Yo lo que hago es usar el asistente y una vez que me genera la consulta, si se como, la modifico a mi antojo.
Creo que la mejor forma de aprender SQL es usando este generador.
La pregunta que haces es muy genérica, sera muy difícil contestarla.
Saludos

oscarac
20-09-2011, 22:14:26
seria bueno que colocaras tus dudas, solo asi podremos ayudarte
coloca algo concreto, no olvides describir brevemente la estrutura de las tablas y algo de la informacion. como esta distribuida y como la quieres ordenar o agrupar en las consultas

luisraad
20-09-2011, 22:24:52
oscar en primer lugar esto no es una tarea de colegio la verdad me ofende demasiado ese comentario.
y si se refieren a mi como ignorante pues todo esta bien, abri estos temas porque la verdad hay mucha gente como yo que estamos principantes en este tema y si uno tiene un error pues lo idoneo es ayudar al que no sabe es corregirlo de buena manera, no juzgarlo porque no sabe, de todas formas creo que me equivoque de foro, me madan a esta pagina porqe en verdad me vieron ganas de aprender pero lo que no justifico es que personal que ya sabe ((ustedes)) vengan a juzgar la manera en la que se pregunta aqui... agrego, uno no nace corriendo uno primero gatea luego camina y despues corre.

posdata..
caral gracias por toda la ayuda suministrada no se como votar por toda tu ayuda pero me despido de estos foros.. odio que critiquen al que quiere aprender

oscarac
20-09-2011, 22:31:21
y yo que dije?????

Caral
20-09-2011, 22:38:26
Hola
Amigo, no te critican, solo te guían.
Te cuento:
Yo no soy programador ni me dedico a esto, por eso soy el novato del foro.
Tienes que saber llevar esto de los foros, es un asunto de aprender que las opiniones no son para molestar la mayoría de las veces es que no se entiende lo que se pregunta y se tiene que responder con otra pregunta.
Yo mismo hago muchas veces una broma que otra al no saber de que va la cosa.
Cuando conozcas a estas personas veras que ademas de excelentes seres humanos, verdaderos amigos, son lo mejor que hay en esto de la programación.
Estas en tu derecho de no volver, pero creo que no sera tu mejor opción.
Saludos

oscarac
20-09-2011, 22:40:56
no seas humilde caral... con mas de 6K de mensajes... tienes muy buenos aportes y ese subnick de siempre novato ya esta quedando gastado:D
yo si soy novato jejejeje

P.D. Luisraad... que hice????

Casimiro Notevi
21-09-2011, 00:16:04
P.D. Luisraad... que hice????

Lo dice por mí, oscarac, no por tí :)
En fin, Caral lo ha explicado, si quiere aprender tendrá que esforzarse, no se puede copiar el enunciado de los ejercicios que le han puesto, sea del colegio o sea algo personal. Nosotros resolvemos, o eso intentamos, las dudas de los demás, yo mismo he puesto hoy una pregunta de algo simple, pero que no he sido capaz de conseguir. Pero, tal y como dice la guía de estilo, he explicado detalladamente todo, lo que hecho, lo que he probado, lo que he buscado, he puesto mi código para que lo puedan ver, etc.
Lo que no se puede pretender, como ya sabemos, es llegar y soltar una pregunta "de libro" y esperar a que te pongan el código para copiar y pegar.
Así no se aprende, amigo luisraad, porque por mucho que leas, por mucho que veas cómo lo hacen los demás, por mucho que te expliquen, etc. JAMÁS conseguirás aprender a nadar si no te tiras al agua TÚ.
Así que ya sabes, lee nuestra guía de estilo, no tardarás ni 2 minutos. piensa bien la pregunta y... adelante. Aquí nadie está ofendido ni menospreciamos a nadie porque no sepa, ni nos creemos unos "sabiondos", ni somos unos orgullosos, ni nada de eso. Esas cosas las verás en otros foros, pero no aquí.

Caral
21-09-2011, 01:41:43
Hola
Amigo, no es un asunto de leer la guía de estilo, yo nunca lo he hecho, pero que conste que se donde esta.:D
El asunto es, en mi concepto, tratar lo mejor posible, de explicar la duda que se tenga.
El problema es que muchos creen que en los foros se responderá a todo, no importa como se explique la duda.
Otros creen que en los foros hay maquinas que les harán la tarea.
Otros mas creen que en los foros se puede decir lo que se quiera y no se respeta, no la guía, si no la decencia, los buenos modales.
A mi parecer luisraad no entra en estos pero le falta tomarse su tiempo para analizar mejor las dudas que tiene.
Carácter tenemos todos, malos días también, así que lo mejor es comenzar de nuevo y seguir tratando de aprender que es lo que buscamos todos.
Yo recomendaría a luisraad que se tome un cafecito, a mi que me invite un carajillo (para los que saben:D) y que sigamos como siempre, amigos.
Saludos

luisraad
22-09-2011, 15:42:14
Bueno, Yo solo queria dejar en claro que mi idea no es copiar y pegar, porque la verdad a mi no me han dejado tarea y mucho menos ((creo)) que he posteado una pregunta de "colegio" y mucho menos pretendí jamás que me adjuntaran archivos para resolver la tarea, soy novato Pero bien novato y por ende es que aveces pregunto mal he visto en otros foros de esta web en donde una persona posteó una pregunta en donde queria que le explciaran todo el manual de SQL y todos le colaboraron no se porque dicen que yo vengo a hacer mis tareas aqui, lo siento pero eso no es así

caral saludos

oscarac
22-09-2011, 15:49:11
ok
entonces pondras tus preguntas?

no se los demas pero a mi me gusta leer las preguntas de los demas, y ver si tengo la capacidad (o al menos la idea) de como solucionarlo, y si no la tengo me alimento de las ideas de los demas para resolver una situacion similar

bienvenido de nuevo:)

luisraad
22-09-2011, 17:55:52
bueno siguiendo con la cronologia del tema...
me gustaria aprender cuales son los pasos a seguir para hacer consultas en dos tablas diferentes, pero en la misma BD ¿¿me hago entender??, osea sea el ejemplo:

BD: INVENTARIO.
Tablas: Cliente, Ventas

quiero consultar el nombre del cliente y su direccion, sabiendo de que en la tabla cliente hay unos campos que son: cod, nombre, direccion, telefono... pero a su vez quiero conocer que ventas tiene el cliente aun sabiendo que la tabla ventas tiene estos campos: fechaventa, dtalleventa, codventa .mas o menos asi:

'select cliente.nombre, cliente.direccion from INVENTARIO'
hasta alli se ((creo que es asi)) me corrigen si me equivoque ((según entiendo, esto me traera a un DBgrid el nombre de los clientes, su direccion de la BD INVENTARIO))

como hago para hacer la consulta en las dos tablas siguiendo el enunciado que mencione arriba ((no es tarea es solo un ejemplo)). aún no se como se consulta de esa manera.

aqui en clases dicen que este tema se le denomina consultas dobles

saludos

Caral
22-09-2011, 18:00:05
Hola
Tabla Clientes:
Campos: Cod, nombre, direccion, tel etc...
Tabla Ventas:
Campos: ???
Saludos

oscarac
22-09-2011, 18:00:53
ok
lo primero que debes tener en cuenta, es que en el diseño de las tablas debes colocar algun campo en comun y luego unir las 2 tablas mas o menos asi



Select Tabla1.Campo1, Tabla1.Campo2, Tabla2.Campo3
From Tabla1
Left Join Tabla2 on Tabla1.CampoEnComun = Tabla2.CampoEnComun
Weher Tabla1.Campo = Condicion

Casimiro Notevi
22-09-2011, 18:21:57
quiero consultar el nombre del cliente y su direccion, sabiendo de que en la tabla cliente hay unos campos que son: cod, nombre, direccion, telefono... pero a su vez quiero conocer que ventas tiene el cliente aun sabiendo que la tabla ventas tiene estos campos: fechaventa, dtalleventa, codventa .mas o menos asi:

tabla clientes (cod, nombre, direccion, telefono)
tabla ventas (cod, codigocliente, fechafecha, detalleventa, codventa, etc.)

Necesitas un campo en la tabla de ventas para saber a qué cliente pertenece la venta.

luisraad
22-09-2011, 18:38:19
Bueno Explico Un poco Mas:

BD: INVENTARIO

tabla cliente
Codcliente Nombrecliente direccion telefono

tabla ventas
codclientes codventa fechaventas totalventa

entonces miren la manera en como me explican a mi es asi:


'select cliente.codcliente, cliente.nombrecliente, cliente.direccion,cliente,telefono, ventas.fechaventas,ventas.totalventa from cliente,ventas';


se que hay una forma mas detallada de hacer este tipo de consulta la pregunta es ¿¿¿esta bien asi??? ¬¬ no creoo!!!

por favor me dicen que error tengo

segun esto me va a traer estos campos ((según)):D

Caral
22-09-2011, 18:40:48
Hola
Esa consulta te traera todos los datos de los campos de esas dos tablas, esta bien si es lo que necesitas.
Saludos

oscarac
22-09-2011, 18:45:45
como dice caral... esa consulta te traera TODOS los datos, si quisieras extraer solo algunos deberias usar condiciones

yo siempre recomiendo usar Joins, a mi parecer es una manera mas ordenada de extraer los datos

luisraad
22-09-2011, 18:50:29
Gracias Caral y Oscar...

Bueno oscar me interesaria que colocaras de la manera en que tu lo harias y la explicaras mejor... es nueva para mi pero me parece mas detallada y mas facil de aplicar... explicame eso y despues yo coloco ejemplos con condiciones..

Gracias

Casimiro Notevi
22-09-2011, 18:51:01
se que hay una forma mas detallada de hacer este tipo de consulta la pregunta es ¿¿¿esta bien asi??? ¬¬ no creoo!!!

Debe probar ese sql en el programa que estés usando "manager sql".
Así vas probando y depurando, cambiando, etc. hasta dar con lo que exactamente necesitas.

Caral
22-09-2011, 18:57:56
Hola
El join es una condicion, se usa de muchas maneras, pero si no se sabe aveces no trae los datos que se quiere.
La consulta que as puesto es muy sencilla, no se necesita un join con solo un where funciona:

'select cliente.codcliente, cliente.nombrecliente, cliente.direccion,cliente,telefono, ventas.fechaventas,ventas.totalventa from cliente,ventas
Where cliente.codcliente = ventas.codclientes';
Saludos

oscarac
22-09-2011, 19:02:14
Gracias Caral y Oscar...

Bueno oscar me interesaria que colocaras de la manera en que tu lo harias y la explicaras mejor... es nueva para mi pero me parece mas detallada y mas facil de aplicar... explicame eso y despues yo coloco ejemplos con condiciones..

Gracias

en el post anterior te explicaba como hacer los joins, para esto en cada tabla debe haber un campo en comun, por ejemplo imageinate 2 tablas de facturas de ventas las clasicas cabecera y detalle
ambas tablas tendrian en comun el tipo de documento y el numero de documento


entonces seria mas o menos asi


Select CAB.Tipo, Cab.Doc, Cab.FechaDOC, Det.Producto, Det.Cantidad, Det.Total
From Cabecera Cab
Left Join Detalle Det on Cab.Tipo = Det.Tipo and Cab.Doc = Det.Doc
Where Cab.FechaDoc = '15/01/2010'


en este ejemplo dice... sacame todos los documentos, con el detalle de ops productos su cantidad y su precio que sean del dia 15/01/2010

se entiende?

Casimiro Notevi
22-09-2011, 19:13:32
Aquí tienes (http://w3schools.com/sql/default.asp) un estupendo tutorial SQL, a la izquierda tienes las palabras y a la derecha sale explicando para lo que sirve y ejemplos variados.

luisraad
25-09-2011, 20:35:58
Hola como estan??

bueno siguiendo el hilo de la consulta ahora veamos si de esta manera esta bien planteada la consulta con condiciones:

vamos a suponer que en el campo de direccion de la tabla clientes en la BD tiene unos registros en el campo direccion de las personas que viven en tolu y otros en puebla, ahora quiero que me liste en un DBgrid solo los clientes pertenecientes a tolu ustedes me guian y me dicen si esta malo asi:


var
c:string

begin
c:'select clientes.nombres, clientes.direccion from clientes where clientes.direccion='quotedstr('tolu');
adoquery1.sql.clear;
adoquery1.sql.add(c);
adoquery1.open:=true;
end;
end.


me imagino que esto esta bien, espero sus respectivas opniones y correcciones.

Caral
25-09-2011, 20:54:26
Hola
Yo lo haria asi:

begin
adoquery1.sql.Text:= 'select clientes.nombres, clientes.direccion from clientes where clientes.direccion = :A';
adoquery1.Parameters[0].Value:= 'tolu';
adoquery1.open:= true;
end;
Saludos

Taburiente
25-09-2011, 21:52:58
Aquí tienes (http://w3schools.com/sql/default.asp) un estupendo tutorial SQL, a la izquierda tienes las palabras y a la derecha sale explicando para lo que sirve y ejemplos variados.


Gracias por el link,esta bastante bien.

Saludos

luisraad
25-09-2011, 23:26:44
hola Como va todo

Caral con respecto a tu forma de consultar quiero saber o mejor dicho quiero aprender porque no usas una variable 'c' (consulta) en las consultas que realizas tu usas esto

ADOquery.SQL.text:=(consulta);

y te sale bien...
la otra es como trabajar con parametros para consultas de ese tipo, o mejor dicho como se define un parametro para hacerconsultas

saludos

luisraad
25-09-2011, 23:31:16
Hola
Yo lo haria asi:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)begin adoquery1.sql.Text:= 'select clientes.nombres, clientes.direccion from clientes where clientes.direccion = :A'; adoquery1.Parameters[0].Value:= 'tolu'; adoquery1.open:= true; end;

Saludos

no entiendo lo de :A osea los parametros

Caral
25-09-2011, 23:33:35
Hola
No uso una variable por que es repetir código, me da pereza.
Uso Text por que me parece mucho mejor que add.
con add hay que limpiar la consulta siempre con clear antes, con text NO.
Para colocar un parametro simplemente se ponen dos puntos antes del nombre del parametro, asi: :Nombredelparametro
Saludos

Caral
25-09-2011, 23:35:12
Hola
A es un nombre, como podria ser :Caral, o :Pepe, o el que se te antoje, es un nombre, simplemente.
Saludos

luisraad
25-09-2011, 23:55:54
Bueno veamos otro tipo de condicion.

esta vez suponemos que en la tabla CLIENTES tenemos registros en el campo NOMBRE. pero resulta que ahora quiero listar los nombres especificando una letra es decir, traigame todos los nombres que empiezen por P, ya he visto lo que es el codigo like aca en clases pero esta explicito de una manera mas o menos asi, en la forma donde estoy diseñando la apicacion se debe insertar un edit y en su propiedad text ponerle la comilla simple ' (ya oscar me explico como hacerlo con quotedstr), y aparte debo insertar otro edit con el simbolo de % y otra comilla simple osea en su popiedad text %' el codigo me queda de la siguiente manera.

((basandome en lo aprendido en clases))
supongamos que el edit1.text es el de la comilla simple, el edit2.text en donde se colocan las letras y el edit3.text el que contiene la comilla y el %

var
c:string;
begin
c:='select clientes.nombre from clientes where clientes.nombre like'+edit1+edit2.text+edit3.text;

end;
end.

según comprendo en el edit2.text al poner una letra en especifico este traera los nombre que empiezen por la letra que coloco en ese espacio, aun sabiendo de que es complicado de esta manera deseo saber como podria solucionar lo del codigo LIKE y cuando tenga esa duda clara aplico tu forma de consultar caral haber si apredi

saludos

Caral
26-09-2011, 00:03:13
Hola
No entiendo como un profesor le dice a sus alumnos que programen así, no lo entiendo.
Esto no creo que sea la manera de iniciarse en delphi, no lo creo.
Saludos

luisraad
26-09-2011, 00:12:37
Hola
No entiendo como un profesor le dice a sus alumnos que programen así, no lo entiendo.
Esto no creo que sea la manera de iniciarse en delphi, no lo creo.
Saludos


bueno acabo de ver un foro con lo del tema LIKE y lo que vi fue esto:

'select clientes.nombre from clientes Where Nombres like'+ quotedstr('%'+edit2.text+'%');

lo hize bien???

Caral
26-09-2011, 00:18:09
Hola
Depende.
Algunas BD lo aceptan otras no.
En access es algo diferente:
'select clientes.nombre from clientes Where Nombres Like '''+ Edit2.Text + '*'''
Como ves no uso quotedstr para nada.
Osea, si quieres lo usas, si no, no.
Hay muchas maneras de hacer las cosas, todo depende del novato que te las explique.:)
Saludos

luisraad
26-09-2011, 00:38:26
Hola
Depende.
Algunas BD lo aceptan otras no.
En access es algo diferente:
Código SQL [-] (http://www.clubdelphi.com/foros/#)'select clientes.nombre from clientes Where Nombres Like '''+ Edit2.Text + '*'''

Como ves no uso quotedstr para nada.
Osea, si quieres lo usas, si no, no.
Hay muchas maneras de hacer las cosas, todo depende del novato que te las explique.:)
Saludos

ok gracias por el aporte

entonces aplicando este tipo de consultas con parametros como quedaria ??
gracias de antemano

Caral
26-09-2011, 01:23:57
Hola
Me imagino que algo asi:

begin
adoquery1.sql.Text:= 'select clientes.nombre from clientes Where Nombres Like :luisraad';
adoquery1.Parameters[0].Value:= ''+ Edit2.Text + '*''';
adoquery1.open:= true;
end;

Saludos

luisraad
26-09-2011, 04:23:10
hola

vamos con otra consulta mas compleja
dada la situacion tengo una BD llamada biblioteca en dicha BD hay 3 tablas

tabla1=suscriptor
tabla2=libro
tabla3=prestamo

en la tabla1 hay los siguientes campos:
cod nombre direccion

en la tabla2
codlib nombrelib autor descripcion

en la tabla3
cod nombre nombrelib cantprest

dada la sircustancia la aplicacion caturará los datos del codigo del suscriptor, el codigo del libro o el nombre del libro... estos datos seran guardados en la tabla prestamo supongamos que ya hay registros en las tablas 1 y 2


condicion: cuando el suscrptor haya pedido tres libros el programa arroje un mensaje que diga no puede tener mas prestamos...

tengo algo hecho pero no se entiende tengo unos edit donde capturo esa informacion en el edit1 cpturo el codigo, en el edit2 capturo el nombre y en el edit3 el codigo del libro... ((no viene al caso que lo diga pero es para una guia..))

saludos

luisraad
26-09-2011, 04:29:03
aqui hay una muestra pero esta muy enrredada lo que uqiero hacer es mas sensillo

begin
if(suiComboBox1.Text='') or (suiComboBox1.Text='Seleccione Número de Identificación')then
begin
showmessage('DEBE DIGITAR EL NUMERO DE IDENTIFICACION DEL USUARIO');
suiComboBox1.SetFocus;
end
else
begin
if(suiedit3.Text='')then
begin
showmessage('DEBE DIGITAR EL CODIGO DEL LIBRO');
suiedit5.SetFocus;
end
else
begin
consulta:=suiedit1.text;


table1.TableName:='prestamo';
table1.open;
if not table1.Locate('idprestamo',consulta, []) then
begin
table1.insert;
if(suiComboBox1.Text<>'')then
begin
table1.fieldbyname('cod_libro').Asstring:=(suiedit3.text);
table1.fieldbyname('documento_usuario').Asstring:=(suicombobox1.text);
table1.fieldbyname('idprestamo').Asstring:=(suiedit1.text);
table1.fieldbyname('fecha').AsDateTime:=(datetimepicker1.Date);
Table1.FieldByName('estado').AsString:=(ESTADO1.text);



table1.Post;
table1.Close;



//abriendo tabla 2///
table2.open;
table2.insert;
if (ESTADO1.Text='ABIERTO')then
begin
table2.fieldbyname('cod_libro').Asstring:=(suiedit3.text);
table2.fieldbyname('idprestamo').Asstring:=(suiedit1.text);

begin

consulta:='select prestamo.idprestamo, from prestamo where idprestamo >=4';
if (consulta>='4') then
begin
ShowMessage('No Puede Ingresar Mas Prestamos Para Este Usuario');
end
else

table2.Post;
table2.Close;







Application.MessageBox('TODOS LOS DATOS HAN SIDO ALMACENADOS SATISFACTORIAMENTE','SIBIBLIO',MB_OK);




suiedit1.Clear;
suiedit3.Clear;
suiComboBox1.Text:='Seleccione Número de Identificación';
suiedit5.Clear;
suiedit5.SetFocus;
end;
end;

end;
end;
end;
end;
end;


veo que mezclan 2 tablas etc... ((no es tarea, es solo que quiero aprender una forma diferente y mas sensilla)).

saludos

oscarac
26-09-2011, 16:13:27
hola Luisraad

segun las reglas del foro dice que a nua nueva pregunta es mucho mas conveniente colocar nu nuevo hilo o pregunta..