Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-01-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
Quiero liberar my query para usar el mismo varias veces

Hola Chicos muchas gracias por leer esta duda.. necesito que me hechen una mano .. resulta que tengo un programa que realiza un monton (pero de verdad un monton) de consultas mysql por lo que al principio re-usar los querys de alguna manera "limpiarlos" antes de volver a usarlos pero me marcaba errores con referencia a parametros antes usados.. por lo que mi solucion mas viable fue hacer uno para cada busqueda.. Despues de eso no tuve ningun problemas porque trabajaba localmente.. pero ahora el problema es que al usarlo en forma no local el programa se hace lentisiimo y no se si sea por la cantidad de querys que tengo en el programa.. miren asi es como los uso:
Código SQL [-]
DModulo.QBuscar.Active:=false;
    DModulo.QBuscar.SQL.Clear;
   DModulo.QBuscar.SQL.Text:='select distinct * from  '+
                      'alumnos,tipodealumno,municipio,grados ' + 
                      'where tipodealumno.tipo_alumno=alumnos.tipo_alumno '+  
                      'and alumnos.grado=grados.id_grado and ' + 
                   'alumnos.id_mpio=municipio.id_mpio and alumnos.matricula=:mat'; 
               DModulo.QBuscar.Parameters.ParamByName('mat').Value:=BuscaMatricula.Text;
    DModulo.QBuscar.Active:=true;



en un foro anterior me dijeron que agregara esta linea:
Código SQL [-]
  DModulo.QBuscar.Parameters.Clear;


primero me dijeron que la pusiera aqui:
Código SQL [-]
DModulo.QBuscar.SQL.Clear;
   DModulo.QBuscar.SQL.Text:='select distinct * from  '+  
                      'alumnos,tipodealumno,municipio,grados ' +  
                      'where tipodealumno.tipo_alumno=alumnos.tipo_alumno '+ 
                          'and alumnos.grado=grados.id_grado and ' + 
              'alumnos.id_mpio=municipio.id_mpio and alumnos.matricula=:mat';
  DModulo.QBuscar.Parameters.Clear;
 DModulo.QBuscar.Parameters.ParamByName('mat').Value:=BuscaMatricula.Text;
   DModulo.QBuscar.Active:=true;


pero me marca un error me dice: parametro 'mat' no encontrado

entonces alguien mas me sugirio que pusiera la linea aqui:

Código SQL [-]
DModulo.QBuscar.SQL.Clear; 
 DModulo.QBuscar.Parameters.Clear; 
      DModulo.QBuscar.SQL.Text:='select distinct * from  '+ 
                     'alumnos,tipodealumno,municipio,grados ' +
                      'where tipodealumno.tipo_alumno=alumnos.tipo_alumno '+ 
                      'and alumnos.grado=grados.id_grado and ' +  
             'alumnos.id_mpio=municipio.id_mpio and alumnos.matricula=:mat';  
 DModulo.QBuscar.Parameters.ParamByName('mat').Value:=BuscaMatricula.Text;
    DModulo.QBuscar.Active:=true;

pero me arroja el error incial el que me dice de que no encuentra algun parametro que anteriormente use en el query anterior.

Por favor si a alguien se le ocurre algo o que encuentre el error que no logro visualizar de verdad se lo agradeceria, ya que el programa ya esta terminado pero el cliente no lo quiere por la lentitud.

Última edición por zcatzz fecha: 24-01-2007 a las 00:56:02.
Responder Con Cita
  #2  
Antiguo 24-01-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Una gran solución es el uso de procedimientos almacenados en mysql. Que Ojo con delphi yo no he conseguido ejecutarlos, unicamente lo he conseguido en mis proyectos de php. Pero en un post AzidRain mencionaba que era posible, desgraciadamente no posteó la manera que era posible invocar los Sps desde delphi.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 24-01-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
No olvides que el metodo Clear lo que hace no es borrar el contenido del parametro sino borrar completamente los parametros
Código Delphi [-]
^
 DModulo.QBuscar.SQL.Clear; //Borramos la instruccion SQL
// Ahora escribimos la sentencia con su parametro
 DModulo.QBuscar.SQL.Text:='select distinct * from  '+ 
                     'alumnos,tipodealumno,municipio,grados ' +
                      'where tipodealumno.tipo_alumno=alumnos.tipo_alumno '+ 
                      'and alumnos.grado=grados.id_grado and ' +  
             'alumnos.id_mpio=municipio.id_mpio and alumnos.matricula=:mat';  
//Ponemos el parametro
 DModulo.QBuscar.ParamByName('mat').AsString :=BuscaMatricula.Text;
//Corremos el query
 DModulo.QBuscar.Open;

//oh...Ahora quiero correr otra vez el query pero con otro valor para el parametro
 DModulo.QBuscar.ParamByName('mat').AsString :=OtroControl.Text;
 DModulo.QBuscar.Open;

// Listo...no hay que inicializar nada ni el parametro ya que Delphi se encarga
//Ahora bien, quiero usar el mismo control pero para correr un query diferente

DModulo.QBuscar.SQL.Clear; // Borramos la sentencia que ya no queremos
//Cambiamos el query

//Esta vez usare otra forma de añadir la sentencia pero puedes usar la forma de arriba
 DModulo.QBuscar.SQL.Add( 'select distinct * from  ');
 DModulo.QBuscar.SQL.Add('alumnos,tipodealumno,municipio,grados ' );
 DModulo.QBuscar.SQL.Add( 'where ');
 DModulo.QBuscar.SQL.Add('tipodealumno.tipo_alumno=alumnos.tipo_alumno ');
 DModulo.QBuscar.SQL.Add( 'and alumnos.grado=grados.id_grado and ');
 DModulo.QBuscar.SQL.Add(  'alumnos.id_mpio=:municipio');  

// Aplicamos el nuevo parametro
 DModulo.QBuscar.ParamByName('municipio').AsString :=OtroControl.Text;
//Corremos el query.
 DModulo.QBuscar.Open;
Como vemos en el código, Delphi se encarga de borrar y añadir los parametros que vamos creando con las sentencias SQL. Así vemos que en el ejemplo la primera sentencia usa "mat" como parametro y la seguna "municipio". En el primer caso delphi crea en automático "mat", al meterle la segunda sentencia crea "municipio". Con la sentencia "Clear" delphi borra ademas de la sentencia los parametros que se crearon.

Los parametros los puedes usar tambien en sentencias INSERT, DELETE o UPDATE en la misma forma, solo que en esos casos no se usa "Open" sino "ExecSQL" para ejecutar el query ya que estas sentencias no devuelven datos.

Sobre los procedimientos almacenados Zeos incluye un control especial para eso "TStoredProc" , ademaás de que se de pueden llamar or medio del control "TSQLScript" de Zeos.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 24-01-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
pero sigue siendo la misma instruccion

aqui en este ejemplo que me estas dando el query es el mismo con la misma instruccion pero diferente parametro, lo que yo quiero hacer es limpiar completamente todo lo de ese query y usarlo nuevamente con otra instruccion y otros parametros.. eso no lo puedo hacer? , porque necesito hacer menos cantidad de querys para ver si asi el programa se libera un poco y se hace mas rapido...

Cn tu respuesta (que agradezco de antemano) me siguen saliendo los mismos errores.
Responder Con Cita
  #5  
Antiguo 24-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si bien puede afectar, no estaría yo tan seguro de que la lentitud del programa se deba a la cantidad de componentes query. Por el ejemplo de la consulta que pones veo que utilizas muchos joins. Asegúrate de tener bien definidos todos tus índices. Creeme que la diferencia entre tener y ne otener índices es monumental en cuestión de tiempo.

// Saludos
Responder Con Cita
  #6  
Antiguo 24-01-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Estoy de acuerdo con Roman, la velocidad de los Querys no tiene nada que ver con la cantidad de componentes que uses para correrlos. Puedes tener 5 objetos para cada query o uno solo y reutilizarlo pero si tus consultas no estan optimizadas obtendrás la misma lentitud en uno y otro esquema.
Lo unico que consigues al reutilizar un mismo query es un mejor uso de la memoria pero realmente esto no es un gran factor como para afectar el rendimiento del mismo.

Te recomiendo que te cheques "MySQL CookBook" que trae muchisimas "recetas" para hacer querys segun el tipo de necesidad que tengas además te explica como optimizar los querys. Aunque es para MySQL la mayoría de los querys los puedes usar en otros motores.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #7  
Antiguo 25-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En el oro hilo que iniciaste dije lo mismo que ya hay dicho aquí.

Además te advierto de los problemas colaterales que vas a tener al usar la misma query para varios "procesos". Espero que hayas pensado muy bien y todos los casos posibles que el usuario puede usar, ya que si una consulta la tiene abierta seleccionando productos y ahora desde otra ventana cambias el sql de esa misma consulta, obviamente vas a tener muchos errores.

Ya es un dolor de cabeza tener 40 consultas cada una con su SQL, para ahora por el hecho de "querer ahorrar recursos" (que en definitiva no ahorras tanto), hacer que el programa tenga muchísimos más fallos.

Digo que no ahorras, porque si una consulta la tienes cerrada, realmente no consume tantos recursos, es cuando se abre cuando empieza a comer recursos... pero si se abre, es que ¡¡hace falta!!.

Que quieres ahorrar, crea una función llamada

Código Delphi [-]
var Q :Tquery;
begin

function CreateQuery('select * from tabla'):TQuery

// para crearla:
Q := CreateQuery('select * from tabla');

// para liberarla
FreeAndNil(Q);
Pero lo dicho, si en un momento determinado necesitas 3 consultas, por mucho que ahorres las vas a seguir necesitando.

Me da la sensación de que estas "algo obsesionado con el tema", quizás porque te urge, quizás por otros temas que no vengan al caso, pero ten en cuenta que ClubDelphi sigue funcionando después de 10 años porque siempre intentamos dar la mejor respuesta posible, y como has visto, ya somos varios los que coincidimos en lo mismo, haznos caso .

.. Y como alguien dijo alguna vez..."ClubDelphi sigue funcionando después de 10 años y aún tengo presente lo más importante: ¡¡ Aún seguimos aquí!!" jeje.

Saludos

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 25-01-2007 a las 12:44:36.
Responder Con Cita
  #8  
Antiguo 27-01-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
Smile Muchas Gracias a todos!

Asi es como Lepe me acaba de decir estoy un poco obsesionada con el tema jejej.. pero ya con todo lo que me han dicho no han hecho mas que reafirmar lo que me imaginaba... que no hay ninguna relacion con la lentitud del programa con la cantidad de querys que tengo que hacer... Gracias a sus respuestas puedo mostrarle esta informacion a mis colaboradores para que confirmen nuestras sospechas y busquemos por otro lado la lentitud del programa.

Estuve leyendo otros foros y descubri que si utilizo ODBC, DELPHI para una base de datos que tiene millones de registros el programa se vuelve sumamente lento ( que es lo que sucede ene ste caso) y que la solucion era mudarlo a ZEOS, el problema es que ya investigue y zeos trabaja para mysql (que es donde hago las prubas) pero a la hora de mudarlo a informix que es la base de datos final no es compatible... Lastima pero no veo otra solucion, ahora si que si el cliente me pidio DELPHI 5, INFORMIX es la unica forma que veo de manejar los datos con odbc..

Gracias por sus consejos y aqui seguimos para seguir aprendiendo de uds
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿liberar memoria despues de usar una Query? mrmanuel Conexión con bases de datos 25 01-11-2006 14:20:14
FreeReport-Imprimir dos veces el mismo reporte MeArevalo Impresión 1 05-11-2004 20:34:00
Abrir varias veces el mismo form Phacko Varios 7 25-09-2004 05:22:01
Imprimir algo varias veces. aoiTo Impresión 0 20-07-2004 19:12:49
Obtener dos veces el mismo campo. Jose_Pérez SQL 11 27-02-2004 05:51:06


La franja horaria es GMT +2. Ahora son las 18:38:08.


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
Copyright 1996-2007 Club Delphi