Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   2 TADOQueries (https://www.clubdelphi.com/foros/showthread.php?t=46182)

Deiv 25-07-2007 23:01:48

2 TADOQueries
 
Hola,
Tengo el siguiente código delphi con una Tabla relacionada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  sqlMuchos1 = ' Select * from muchos where IdTipo = "NM" ';
  sqlMuchos2 = ' Select * from muchos where IdTipo = "M" ';  
var
  P,S,T : string;
begin
  ADOQuery1.Sql.text := sqlMuchos1;
  ADOQuery2.Sql.text := sqlMuchos2;
  ADOQuery1.Active:= True;
  ADOQuery2.Active:= True;
  with ADOQuery1 do
    begin
       first;
       while not eof do
         begin
             P:= FieldByName('prefijo').AsString+ FieldByName('nom').AsString+FieldByName('sufijo').AsString+'  ';
             with ADOQuery2 do
                begin
                   first;
                   while not eof do
                      begin
                         S:= FieldByName('prefijo').AsString+ FieldByName('nom').AsString+FieldByName('sufijo').AsString;
                         T:=P+S;
                         ListBox1.Items.Add(T);
                         next;
                      end;
                end;
             next;
         end;
    end;  
end;
Adjunto la BD hecha en Access.
Me preguntaba: ¿se puede realizar la misma operación con UN SOLO TADOQuery?

o ¿Necesariamente debo utilizar los 2 ADOQueries porque son 2 consultas diferentes? (pregunto porque son mis primeros pasos con SQL)

Caral 25-07-2007 23:09:26

Hola
Para mi se puede con un solo query, ya que la sentencia que usas esta en una constante, en vez de llamar al query uno o dos, llamaria a la costante, recuerda que Text elimina todo, asi que se puede usar solo uno.
Saludos

Deiv 25-07-2007 23:30:42

¿Cómo?
Pues me parece que en la linea:

Código Delphi [-]ADOQuery1.Active:= True;


no puede existir dos Consultas Activas.
Cita:

Empezado por Caral
llamaria a la costante, recuerda que Text elimina todo

Entonces mi 2do bucle ya no funcionaría
¿Cuál sería la modificación de mi código para que realice el mismo trabajo con un solo TADOQuery?

Caral 25-07-2007 23:41:23

Hola
Ve por ejemplo un pedacito de mi programa:
Código Delphi [-]
QTemp.SQL.Text := 'Select CodUsuario From Usuarios WHERE Graficar =True';
QTemp.Active := True;
      While not QTemp.Eof do
      begin
      CBUsuarios.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
      end;
QTemp.Active := False;
QTemp.SQL.Text := 'Select Descripcion From Estaciones WHERE Graficar =True';
QTemp.Active := True;
      While not QTemp.Eof do
      begin
      CBEstaciones.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
Aqui con un ADOQuery (QTemp.) llamo primero a la tabla Usuarios cargo los datos en un combobox (CBUsuarios.) y luego con el mismo query llamo a la tabla Estaciones y cargo los datos en CBEstaciones.
El concepto que aplicas es esencialmente el mismo, solo que la sentencia sql la pones en una constante, nada mas.
Bueno es mi humilde opinion.
Saludos

Deiv 25-07-2007 23:50:50

En este momento no tengo Delphi a mano, pero probaré tu sugerencia y mañana os comento.

Deiv 26-07-2007 20:13:30

Hola,
Cita:

Empezado por Caral
El concepto que aplicas es esencialmente el mismo, solo que la sentencia sql la pones en una constante

no me había percatado que tiene una opción que desactiva la consulta, y mi código lo que hace es recorrer la tabla con un "sqlMuchos1" primero, luego recorre con "sqlMuchos2", me gustaría que observasen el fichero Access y lo probasen con Delphi para ver que realmente intento hacer. El consejo de Caral está bueno pero en la línea:
Código Delphi [-]
QTemp.Active := False;
desactiva la consulta y EMPIEZA de nuevo otra consulta, y si se fijan Yo tengo una línea que dice FIRST después de recorrer todos los registros del segundo bucle, si desactivara la anterior consulta a FALSE cada vez empezara la nueva repitiendo lo mismo.
Código:

OBJETO    USO      TIPO
Compu    Nueva    Externo
Compu    Vieja    Externo
Monitor  Nuevo    Externo
Monitor  Viejo    Externo
Tarjetas  Nuevas  Interno
Tarjetas  Viejas  Interno
Pernos    Nuevos  Interno

Filtro por Tipo=Externos (1er Bucle) y Filtro por Tipo=Internos (2do Bucle)

Compu Nueva TIENE Tarjetas Nuevas
Compu Nueva TIENE Tarjetas Viejas
Compu Nueva TIENE Pernos Nuevos
Compu Vieja TIENE Tarjetas Nuevas
Compu Vieja TIENE Tarjetas Viejas
Compu Vieja TIENE Pernos Nuevos

Monitor Nuevo TIENE Tarjetas Nuevas
Monitor Nuevo TIENE Tarjetas Viejas
Monitor Nuevo TIENE Pernos Nuevos
Monitor Viejo TIENE Tarjetas Nuevas
Monitor Viejo TIENE Tarjetas Viejas
Monitor Viejo TIENE Pernos Nuevos

De repente mi Tabla no esté muy bien encarada (es decir la BD) pero lo que intento es demostrar con este ejemplo lo que quiero hacer con los nombres de compuestos químicos (esa es mi tabla Access).

Caral 26-07-2007 20:33:09

Hola
Perdona mi ignorancia pero sigo sin entender, tal vez analizando el codigo paso a paso lo pueda entender mejor, me ayudas?.
Primera parte:
Aqui defines una constante y las variables que haran una operacion final.
Código Delphi [-]
const
  sqlMuchos1 = ' Select * from muchos where IdTipo = "NM" ';
  sqlMuchos2 = ' Select * from muchos where IdTipo = "M" ';
var
  P,S,T : string;
Segunda parte:
Identificas las tablas con las constantes y las activas,
Con la primera tabla haces que la variable P contenga unos datos de la misma.
Código Delphi [-]
 with ADOQuery1 do
 P:= FieldByName('prefijo').AsString+ FieldByName('nom').AsString+FieldByName('sufijo').AsString+'  ';
Tercera Parte:
En el mismo ciclo haces que la variable S contenga los mismos datos que la variable P solo que con una una diferencia en el IdTipo, sumas las dos y luego colocas todo en un listBox.
Código Delphi [-]
S:= FieldByName('prefijo').AsString+ FieldByName('nom').AsString+FieldByName('sufijo').AsString;
  T:=P+S;
   ListBox1.Items.Add(T);
   next;
No se pero a mi me parece que se repiten un poco de todo, no es asi?.
Saludos

Deiv 27-07-2007 00:31:41

Hola,
Gracias Caral por preocuparte de mi asunto, disculpa si estoy muy torpe con mis preguntas (quizá inentendibles) es lo que me pasa por ser más novato (autodidacta) que muchos novatos.
No tengo conexión a Internet en Casa y me valgo de Cibers, me he percatado que tengo una nueva respuesta tuya, por ello no respondí antes.
Toda tu comprensión está clarísima, solo que me parece que no me estoy dejando entender. Quiero hacer algo parecido a:
Código Delphi [-]
 
for i:=1 to 100 do  //100 digamos
   begin    
       P:=..... //Primero guardo el nombre BASE (en mi código = No Metales) revisando cada registro filtrado por "NM"
       for j:=1 to 50 do  //50 digamos
           begin              
              S:= .....//Segundo guardo el nombre (en mi código = Metales) revisando cada registro filtrado por "M"
              T:= P+S; // Junto las Cadenas para que me resulte un Nombre Completo de la SAL y mostrarlo en un TListBox
           end;
   end;
En realidad mi código trabaja con 2 TADOQueries, pero más era la curiosidad (por aprender mejor a programar) de ver si se podía con 1 solo TADOQuery
Digo una cosa.... ¿Podrías copiar mi código del post#1 readecuarlo y obtener el mismo resultado pero con 1 solo TADOQuery?

Caral 27-07-2007 00:48:47

Hola
Que problema ser mas novato que el que pregunta, pero bueno, si te animas.
Me extraña la palabra Guardo, donde guardas, supongo que en memoria, porque no veo que sea en ninguna tabla.
Ahora a tu curiosidad, casi estoy convencido que se puede hacer lo que quieres con una sentencia sql distinta en un solo query, pero no veo el porque preocuparse de tener 2 query en un form para una misma consulta.
Como soy mas novato que tu y tambien autodidacta en ocasiones he usado mas de dos querys en una consulta, por lo menos al inicio, casi un año.
Yo no me preocuparia de estas cosas, seguiria adelante, sobre todo porque funciona, y con el tiempo te daras cuenta de mas cosas, se llama practica, nos pasa a todos.
Me parece muy bien tu curiosidad, pero no lo veo como algo grave que te tenga que preocupar ahora, para mi vas mejor que yo.
Saludos

Deiv 27-07-2007 01:12:15

Gracias por los ánimos, en verdad no mentía: si soy supernovato puedes leer en este hilo, en el post #9
Me hubiera gustado salir de esta duda, pero si no hay problema, entonces seguiré con mis 2 TADOQueries.

cHackAll 27-07-2007 02:13:44

Lastimosamente concuerdo con el amigo Caral con lo de "dejarlo pues funciona", pero no por "iniciar" en programación, pues si te metiste a hacerlo es porque puedes; si no porque es importante tener en mente que si quieres volverlo "perfecto", perderás la relación costo - beneficio y acabarás quemando tu cerebro y muchas horas en optimización.

Paradójicamente y al igual que tu me gusta que las cosas queden lo más parecido a perfecto (¿?) posible; asi que si estas dispuesto vamos a analizar las alternativas. Por lo que tengo entendido quieres hacerlo todo simplemente con una sentencia SQL; en tal vaso te dejo la siguiente corrección:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 ADOQuery1.SQL.Text := 'select nm.prefijo + nm.nom + nm.sufijo + ''  '' + m.prefijo + m.nom + m.sufijo from muchos nm, muchos m where nm.idtipo = ''NM'' and m.idtipo = ''M'' order by nm.prefijo + nm.nom + nm.sufijo + ''  '' + m.prefijo + m.nom + m.sufijo';
 ADOQuery1.Active:= True;
 with ADOQuery1 do
  begin
   First;
   while not EOF do
    begin
     ListBox1.AddItem(Fields.FieldByNumber(1).AsString, nil);
     Next;
    end;
  end;
end;

No dejes de comentarnos como te va!

Edito: Tambien debemos ver cual de las dos alternativas es la más optima. En ESTE caso lo es la última por usar solo un bucle, pero si trabajamos en red debemos analizar qué es lo mas importante, pues con ésta le estamos reduciendo trabajo a las PCs Clientes; con tu solución le aumentamos un poco a las mismas, pero en teoria le reducimos algo al Servidor.

Deiv 28-07-2007 00:54:41

Gracias cHackAll,
Como indique no tengo conexión a un Internet y en este momento estando en un Ciber no tengo acceso a Delphi, probaré tu propuesta, luego les comento además he podido observar que el código sql de tu consejo se ha vuelto un poco mas extenso (en línea), hummmm, veremos.
Saludos

Deiv 29-07-2007 23:43:46

Cita:

Empezado por cHackAll
No dejes de comentarnos como te va!

Bueno lo he probado, es nuevo para mi eso de las varaiables en SQL, pero en fin he probado tu código y no me muestra nada, en cambio si le cambio el AND por el OR, si me muestra pero no como mi código funciona (¿Probaste mi código con la BD de Access?), muestra los prefijos de los No Metales+Nombre, pero..... nada de los Metales.
No sé donde está la falla......

cHackAll 30-07-2007 09:35:13

Claro que si probe el código y funciona a la perfección. Me parece que la posible causa es el diseño de la BD, pues yo trabajé a ciagas... (suponiendo los campos)... en todo caso pásame los campos + ejemplos; y lo que se debería visualizar y veremos que sucede en realidad.

PD: Delphi7 + ADO + Access 2003, BD 2000

Saludos

Deiv 30-07-2007 19:29:09

Hola,
Disculpa si respondo de tiempo en tiempo, lo q sucede me valgo de un Ciber para conectarme a Internet (no os extrañeis)
Los Campos en Access está ahí en el archivo adjunto que puse en el primer post ForADO, el ejemplo completo (hecho en Delphi) lo adjuntaré mas tarde ya que en este momento no lo dispongo.

Deiv 31-07-2007 01:01:44

1 Archivos Adjunto(s)
Aquí dejo el código en Delphi+BD en Access,
Haber si le echas una miradita Ok?
Y si comparas con el código que me mencionaste, y le cambias como dije AND por OR, notarás la diferencia.

cHackAll 31-07-2007 05:20:32

Es una lástima pero el Club aún tiene dificultades técnicas con los datos adjuntos. Sube tu archivo de nuevo aquí (es la ftp del club realizada por Dec), me dejas el link y lo vemos mañana...

PD: no te preocupes por los retrazos en las repuestas... yo entiendo muy bien esto de los cafes interneeeee (yo estoy en uno ahora) :p

Saludos

roman 31-07-2007 05:40:47

Ahí lo acabo de poner

(¿es la ftp o el ftp?)

// Saludos

cHackAll 01-08-2007 01:17:09

Código Delphi [-]
// ListBox1.Sorted := True; {si es que no interesa el orden, caso contrario coméntanos}
 
 ADOQuery1.SQL.Text := 'select iif(isnull(nm.prefijo),'''',nm.prefijo) + nm.nom + nm.sufijo + ''  '' + iif(isnull(m.prefijo),'''',m.prefijo) + m.nom + m.sufijo from muchos nm, muchos m where nm.idtipo = ''NM'' and m.idtipo = ''M''';

// Saludos

Deiv 01-08-2007 15:07:12

El código Funciona.


La franja horaria es GMT +2. Ahora son las 22:52:35.

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