Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consultas En Sql delphi 7 con Base de Datos access (https://www.clubdelphi.com/foros/showthread.php?t=75814)

luisraad 20-09-2011 20:57:31

Consultas En Sql delphi 7 con Base de Datos access
 
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?

Casimiro Notevi 20-09-2011 21:19:34

Cita:

Empezado por luisraad (Mensaje 412768)
.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

Cita:

Empezado por oscarac (Mensaje 412790)
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

ok
 
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:
Código Delphi [-]
'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


Código Delphi [-]
 
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

Cita:

Empezado por luisrad
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:


Código Delphi [-]
'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

Cita:

Empezado por luisraad (Mensaje 413072)
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:
Código SQL [-]
'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

Cita:

Empezado por luisraad (Mensaje 413076)
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

Código Delphi [-]
 
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 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:

Código Delphi [-]
 
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:
Código Delphi [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 413084)
Aquí tienes 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
 
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

Cita:

Empezado por Caral (Mensaje 413394)
Hola
Yo lo haria asi:
Código Delphi [-]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 %

Código Delphi [-]
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

Cita:

Empezado por Caral (Mensaje 413417)
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:

Código Delphi [-]
'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:
Código SQL [-]
'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

Cita:

Empezado por Caral (Mensaje 413419)
Hola
Depende.
Algunas BD lo aceptan otras no.
En access es algo diferente:
Código SQL [-]'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:
Código Delphi [-]
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

Código Delphi [-]
  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


La franja horaria es GMT +2. Ahora son las 14:13:37.

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