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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2017
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Este código es super lento

Hola, os dejo el código aquí abajo:

Resulta que demora y se me congela el formulario 1 o 2 segundos:

Como lo podemos optimizar?
Código Delphi [-]
with DBGridProveedores.DataSource do
  begin
    DataSet.First;
    SetLength(provSelecc, DBGridProveedores.SelectedRows.Count); //Establecer el largo del array
    SetLength(provSeleccNames, DBGridProveedores.SelectedRows.Count); //Establecer el largo del array
    while not DataSet.Eof do
    begin
      if DBGridProveedores.SelectedRows.Find(DataSet.Bookmark, inx) then  //Si la fila fue seleccioanda
      begin
         provSelecc[i] := DBGridProveedores.Columns[0].Field.AsString;  //Guardo en el array
         provSeleccNames[i] := DBGridProveedores.Columns[1].Field.AsString;  //Guardo en el array
         Inc(i);
      end;
      DataSet.Next;
    end;
    //   ShowMessage(IntToStr(length(provSelecc)));  //Muestro cantidad de filas seleccionadas
  end;

Última edición por Casimiro Notevi fecha: 20-09-2017 a las 18:50:31.
Responder Con Cita
  #2  
Antiguo 20-09-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Lo que se me ocurre que podes hacer y que suele mejorar la performance, es deshabilitar el refresco de los componentes visuales mientras realizas tu proceso, y decirle que haga todo de un plumazo al final:

Código Delphi [-]
  DataSet.DisableControls;
  try
    { codigo de procesamiento aca }
  finally
    DataSet.EnableControls;
  end;

Hace tiempo que no trabajo con componentes Data-Aware, no estoy seguro de si hay algun metodo similar en el componente DataSource
Responder Con Cita
  #3  
Antiguo 20-09-2017
Avatar de Young
Young Young is offline
Miembro
 
Registrado: abr 2006
Ubicación: San Felipe, Chile
Posts: 86
Poder: 18
Young Va por buen camino
Me parece que 1 o 2 segundos no es mucho dependiendo de la cantidad de registros, lo que si molesta en estas situaciones es que se congele el formulario, por lo tanto te sugiero que lo hagas en una tareas separada:

Código Delphi [-]
uses System.Threading;

.
.

TTask.Run(
    procedure
    begin
with DBGridProveedores.DataSource do begin DataSet.First; SetLength(provSelecc, DBGridProveedores.SelectedRows.Count); //Establecer el largo del array SetLength(provSeleccNames, DBGridProveedores.SelectedRows.Count); //Establecer el largo del array while not DataSet.Eof do begin if DBGridProveedores.SelectedRows.Find(DataSet.Bookmark, inx) then //Si la fila fue seleccioanda begin provSelecc[i] := DBGridProveedores.Columns[0].Field.AsString; //Guardo en el array provSeleccNames[i] := DBGridProveedores.Columns[1].Field.AsString; //Guardo en el array Inc(i); end; DataSet.Next; end; // ShowMessage(IntToStr(length(provSelecc))); //Muestro cantidad de filas seleccionadas end;
end);

¿Por otro lado porque haces la operacion sobre el dbgrid y no sobre el dataset?

Saludos.
Responder Con Cita
  #4  
Antiguo 20-09-2017
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Cool

Muchas gracias a ambos, sin embargo, parece que le erré, no es esa la función que causa que el formulario se congele entre 1 y 2 segundos.
Es cuando llamo al procedimiento relacionarProv
¿Puedo hacer lo siguiente?

Código:
         TTask.Run(
          procedure
          begin
              relacionarProv;
          end);
Responder Con Cita
  #5  
Antiguo 20-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Y que hace relacionarProv?
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 20-09-2017
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Código Delphi [-]
var
inicio, fin : Integer;
begin
    inicio := 1;      //Empiezo de la 1, porque 0 es el título de columna
    fin := vlRelacionarProveedores.RowCount; //Cantidad de filas
    SetLength(self.provBDprovHojaCal, fin, 2); //Seteo alto y ancho del array
    while(inicio < fin) and (vlRelacionarProveedores.Cells[1, inicio] <> '')  do
    begin
        self.provBDprovHojaCal[inicio-1, 0] := vlRelacionarProveedores.Cells[0, inicio]; //Guardo columna 1
        self.provBDprovHojaCal[inicio-1, 1] := extraerIDProveedor(vlRelacionarProveedores.Cells[1, inicio]); //Guardo columna 2  ID
        Inc(inicio);
    end;
    SetLength(self.provBDprovHojaCal, inicio-1, 2); //Ajustar el array a los elementos insertados
end;


Resulta que fin = 2, porque solo estoy relacionando 2 mmmm...

Última edición por Casimiro Notevi fecha: 20-09-2017 a las 20:30:40.
Responder Con Cita
  #7  
Antiguo 20-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Para detectar el motivo de la demora, también sería necesario ver el código de la función extraerIDProveedor (así como también conocer con cuantos registros estas trabajando).

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 21-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Y también sería necesario saber qué estás haciendo y qué quieres conseguir.
Responder Con Cita
  #9  
Antiguo 21-09-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
El problema es que meter en hilos en segundo plano codigo que actualiza la interfaz de usuario te va a traer problemas de sincronizacion, ya que solo el hilo principal (es decir, en donde corre la Vcl) se pueden actualizar los controles.

Para poder usar hilos debes separar completamente los datos de tu interfaz grafica, de esta manera podes procesarlos en segundo plano y luego actualizar cuando este procesamiento termina
Responder Con Cita
  #10  
Antiguo 21-09-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
De primeras decir que das pocos datos para hablar de rendimiento.
Es decir, lo lento o rápido de este código, aparte del código dependerá de qué tipo de consulta estás utilizando, números de registros, qué tipo de cursos estás utilizando,...

Por otro lado, sin saber muy bien lo que quieres obtener, hay una línea que no me queda clara:

Código Delphi [-]
      if DBGridProveedores.SelectedRows.Find(DataSet.Bookmark, inx) then  //Si la fila fue seleccioanda

¿Si ya estás recorriendo los "seleccionados", porqué haces un Find para ver si la línea está seleccionada (segun el comentario)?
Revisa la ayuda sobre GotoBookmark.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 21-09-2017
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
El extraerID se los dejó por aquí:


Código:
var
IDprov: String;
i: Integer;
begin
   IDprov := '';
   i := 0;

   for i:= 1 to length(dato) do
   begin
      if(dato[i] = '-') then Break
      else IDprov := IDprov + dato[i];
   end;

   result := IDprov;
end;
Responder Con Cita
  #12  
Antiguo 21-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Aparte de todo, yo diria que meter hilos en si mismo es un problema. Un algoritmo secuencial deberia ser rapido antes de pensar en ponerlo paralelo (ademas que es poco comun que se usen hilos correctamente).

-----

Una optimizacion obvia si la idea es marcar que filas estan o no seleccionadas es reaccionar al evento de "seleccion/des-seleccion" de forma directa y actualizar el array, no al final en batch. Esto deberia SUSTANCIALMENTE reducir los tiempos.
__________________
El malabarista.
Responder Con Cita
  #13  
Antiguo 21-09-2017
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Tienes razón, voy a intentarlo y comento más tarde o mañana.

Gracias a todos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
ayuda con este codigo kurono Varios 5 02-04-2014 01:25:11
Porque este código me da error (adjunto código) David JAVA 1 12-03-2009 21:07:27
ayuda con este codigo kurono Varios 4 13-06-2008 02:03:29
Editor BRIEF super lento D2007 El_Raso Varios 0 02-05-2008 01:38:22
Que significa este codigo? D-MO PHP 14 23-01-2006 11:08:21


La franja horaria es GMT +2. Ahora son las 19:26:34.


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