Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Uso de sql en vez de locate

Buenas tardes a todos.

Alguna vez he os realizado alguna consulta sobre el metodo locate y siempre me habeis dicho que si el volumen de datos a procesar era importante, este ralentizaba bastante el tiempo de proceso, cosa que he comprobado en mis propias carnes (o datos), tambien me habeis sugerido que use una consulta sql para localizar el registro buscado y asi agilizar el proceso.

En el siguiente código, uso un form para buscar un registro y luego locate para localizarlo en la tabla general y presentarlo en el formulario correspondiente.

He estado dando vueltas en como poder implementar la busqueda por sql pero no doy en el clavo, lanzar la consulta y mostrar el resultado en el formulario.

Código Delphi [-]
 
procedure TF_Parcs.JvDBGrid1DblClick(Sender: TObject);
var cod:Integer;
begin
        cod:= Camions_ParcID.Value;
        begin
                Buscar_Camio.Close;
                Buscar_Camio.SQL.Text:='SELECT ID FROM BOM0001 WHERE ID = '+IntToStr(cod);
                Buscar_Camio.Open;
                if not Assigned(F_Camions) then
                begin
                   F_Camions:=TF_Camions.Create(nil);
                   F_ModulDades.Camions.Locate('ID', Buscar_CamioID.Value, []);  // supongo que aqui es donde iria la busqueda 
                                                                                                        // y acontinuacion la presentacion  
                end
                else
                begin
                  F_ModulDades.Camions.Locate('ID', Buscar_CamioID.Value, []);
                  F_Camions.BringToFront;
                end;
        end;
end;

Perdonad si la consulta resulta banal, pero no veo más allá de mis narices y no me aclaro de como hacerlo, con lo que si alguien me echa un cable pues estaré le eternamente agradecido.

Saludos a todos

Josep
Responder Con Cita
  #2  
Antiguo 14-04-2013
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 Josep.

Una consulta, ¿ Que tipo de componente es F_ModulDades.Camions ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-04-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Gracias Ecfisa.

El componente Camions es un IBDataset de firebird que contiene aproximadamente mil quinientos registros.

Saludos
Responder Con Cita
  #4  
Antiguo 14-04-2013
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
Cita:
Empezado por jafera Ver Mensaje
Gracias Ecfisa.

El componente Camions es un IBDataset de firebird que contiene aproximadamente mil quinientos registros.

Saludos
¡Perfecto! entonces podes usar directamente el TIBDataSet

Algo similar a esto:
Código Delphi [-]
var
  tmp: string;
begin
  with F_ModulDades.Camions do
  begin
    tmp := SelectSQL.Text;  // Salvar consulta original en tmp
    Close;
    SelectSQL.Text := 'SELECT * FROM BOM0001 WHERE ID = :PID';
    ParamByName('PID').AsInteger :=  Camions_ParcID.AsInteger;
    Open;
  end;

  if not Assigned(F_Camions) then
  begin
    F_Camions := TF_Camions.Create(nil);
    F_Camions.ShowModal
  end
  else
    F_Camions.BringToFront;
  
  // al finalizar, restaurar la consulta SQL original en Camions
  with F_ModulDades.Camions do
  begin
    Close;
    SelectSQL.Text := tmp;
    Open;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-04-2013 a las 23:20:17.
Responder Con Cita
  #5  
Antiguo 14-04-2013
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 de nuevo Josep.

Me quedé pensando en que tal vez te resulte mas simple encapsular la acción en F_Camions:
Código Delphi [-]
...
type
  TF_Camions = class(TForm)
    ...
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
  public
    class procedure Mostrar(aID: Integer);
  end;

var
  F_Camions: TF_Camions;
  CodCam   : Integer;

implementation

...

var
  tmp    : string;
  CodCam : Integer;

class procedure TF_Camions.Mostrar(aID: Integer);
begin
  tmp    := F_ModulDades.Camions.SelectSQL.Text;
  CodCam := aID;
  if not Assigned(F_Camions) then
    F_Camions := TF_Camions.Create(nil);
  if not F_Camions.Visible then
    F_Camions.Show;
  F_Camions.BringToFront;
end;

procedure TF_Camions.FormShow(Sender: TObject);
begin
  with F_ModulDades.Camions do
  begin
    Close;
    SelectSQL.Text := 'SELECT * FROM BOM0001 WHERE ID = :PID';
    ParamByName('PID').AsInteger :=  CodCam;
    Open;
  end;
end;

...

procedure TF_Camions.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  with F_ModulDades.Camions do
  begin
    Close;
    SelectSQL.Text := tmp;
    Open;
  end;
  Action:= caFree;
end;

procedure TF_Camions.FormDestroy(Sender: TObject);
begin
  F_Camions := nil;
end;

Llamada desde TF_Parcs:
Código Delphi [-]
procedure TF_Parcs.JvDBGrid1DblClick(Sender: TObject);
begin
  TF_Camions.Mostrar(Camions_ParcID.AsInteger);
  ... 
end;
El problema de usar un solo IBDataSet, es que todos los componentes asociados a Camions quedarán restringidos a la última consulta. En ese caso una solución es usar oto TIBDataSet (o TIBQuery) para realizar el posicionamiento en F_Camiones.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 15-04-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Gracias de nuevo Ecfisa.

He probado con el primer ejemplo que me pusiste y el resultado es que siempre me manda al primer registro de la tabla.

En cuanto al segundo, lo estoy estudiando más detenidamente ya que no acabo de entender exactamente donde se debe colocar el código propuesto.

Tambien hablas de una segunda consulta de localización del registro, esta ya está en el formulario y es BurcarCamio, igual así se puede mejorar algo.

Cuando llegue a casa por la noche lo vuelvo a mirar con calma.

Saludos

Josep
Responder Con Cita
  #7  
Antiguo 15-04-2013
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
Cita:
Empezado por jafera Ver Mensaje
He probado con el primer ejemplo que me pusiste y el resultado es que siempre me manda al primer registro de la tabla.
Hola Josep.

El registro que se selecciona queda determinado por el valor de Camions_ParcID en la línea:
Código Delphi [-]
  ParamByName('PID').AsInteger :=  ...;
Es decir que que Camions se posicionará en el registro cuyo valor ID sea igual al valor que enviemos mediante ParamByName('PID').AsInteger a la consulta.

Por ejemplo:
Código Delphi [-]
  ParamByName('PID').AsInteger := 1251;
Posiciona a Camions en el registro cuyo campo de ID tiene 1251 como valor.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
locate marcosmendozaa Varios 6 29-05-2014 22:37:07
Locate mauqu Varios 9 06-08-2007 17:27:20
Yo uso LOCATE y tu......... JULIOCTORRESG Varios 1 02-03-2007 01:10:47
Uso del Locate jzk Conexión con bases de datos 8 22-04-2005 13:05:03
Locate hgiacobone Conexión con bases de datos 6 08-07-2003 15:33:49


La franja horaria es GMT +2. Ahora son las 19:08:03.


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