Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Uso de sql en vez de locate (https://www.clubdelphi.com/foros/showthread.php?t=82796)

jafera 14-04-2013 15:50:11

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

ecfisa 14-04-2013 20:48:38

Hola Josep.

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

Saludos.

jafera 14-04-2013 21:43:36

Gracias Ecfisa.

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

Saludos

ecfisa 14-04-2013 22:13:54

Cita:

Empezado por jafera (Mensaje 458604)
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 :)

ecfisa 14-04-2013 23:41:50

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.:)

jafera 15-04-2013 18:57:10

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

ecfisa 15-04-2013 19:47:38

Cita:

Empezado por jafera (Mensaje 458625)
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.:)


La franja horaria es GMT +2. Ahora son las 14:53:44.

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