Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta Select con if (https://www.clubdelphi.com/foros/showthread.php?t=82788)

giantonti 13-04-2013 20:28:25

Consulta Select con if
 
buen dia foro. estoy haciendo una aplicacion firemonkey con adoquiery, quiero hacer esta consulta antes de abrir un from con showmodal, pero algo esta mal porque no funciona, es decir que me abre el from y me muestra informacion en el grid.
lo que quiero hacer es: un from con un campo edit1.text y el valor que coloque alli debe buscarlo en una tabla y si lo consigue abre el showmodal de lo contrario que salga un mensaje (no lo encontre) y que no habra el fromshowmodal. adjunto sentencia que estoy colocando:

Código Delphi [-]
adoQuery3.Close;
      adoQuery3.Sql.Clear;
      adoQuery3.Sql.Add('Select * From mov');
      adoQuery3.Sql.Add('where cod_cli = '+ADOQuery1rif.asstring+'');
      begin
      While Not Adoquery3.Eof do
      ShowMessage('No se ha incontrado ningun articulo relacionado con el Cliente');
      adoQuery3.Open;
      begin
      Application.CreateForm(TFormSelequipo , FormSelequipo);
      if FormSelequipo.ShowModal = mrOk then
      begin
      ADOQuery1equipo.asstring := ADOQuery3articulo.AsString;
      ADOQuery1serial.AsString := ADOQuery3serial.AsString;
      end
      else
      ShowMessage('No se ha incontrado ningun articulo relacionado con el Cliente');
      end;
      end;
      end;

Agradezco su ayuda

ecfisa 13-04-2013 20:50:04

Hola giantonti

Proba así:
Código Delphi [-]
    ...
    adoQuery3.Sql.Add('where cod_cli = '+QuotedStr(ADOQuery1rif.asstring));
    ...

Saludos.

Al González 13-04-2013 21:06:26

Está un poco extraño tu código, giantonti, pero intentaré mejorarlo:
Código Delphi [-]
  { Suponiendo que el campo "cod_cli" es alfabético o alfanumérico.  NOTA:
    Esta asignación se encargará de cerrar el conjunto de datos en caso de
    estar abierto por una consulta previa, por lo cual no es necesaria una
    llamada explícita al método Close. }
  adoQuery3.SQL.Text := 'Select * From mov where cod_cli = ' +
    QuotedStr (ADOQuery1rif.AsString));

  adoQuery3.Open;

  If Adoquery3.IsEmpty Then
    ShowMessage ('No se ha "e"ncontrado ning"ú"n art"í"culo relacionado ' +
      'con el "c"liente.')
  Else
  Begin
    Application.CreateForm (TFormSelequipo, FormSelequipo);

    Try
      If FormSelequipo.ShowModal = mrOK Then
      Begin
        // Lo que deba hacer aquí
        ...
        ...
      End;
    Finally  // Nos aseguramos de destruir el objeto FormSelequipo
      FormSelequipo.Free;
    End;
  End;
Saludos.

Al González.

P.D. Veo que ecfisa ya arrojó algo de luz. :) ^\||/

AzidRain 13-04-2013 21:33:34

Como te lo sugiere Al es lo más correcto y eficiente ya que el form que quieres crear no es mas que un mero visor de lo que devuelve el Dataset. De esta manera ahorras tiempo y memoria .

giantonti 14-04-2013 00:25:02

funciona perfecta la solucion de al gonzalez, sin embargo sucede que cuando ejecuto el select y la condicion cumple con el "if" me muestra todo lo que esta en la tabla y yo quiero que me muestre solo la conulta
Código Delphi [-]
adoQuery3.SQL.Text := 'Select * From mov where cod_cli = '+QuotedStr (ADOQuery1rif.AsString);

ecfisa 14-04-2013 01:03:44

Cita:

Empezado por giantonti (Mensaje 458570)
funciona perfecta la solucion de al gonzalez, sin embargo sucede que cuando ejecuto el select y la condicion cumple con el "if" me muestra todo lo que esta en la tabla y yo quiero que me muestre solo la conulta
Código Delphi [-]
adoQuery3.SQL.Text := 'Select * From mov where cod_cli = '+QuotedStr (ADOQuery1rif.AsString);

Hola.

Eso indudablemente sucede por que la propiedad DataSource del TDBGrid no está relacionada con el TDataSource asociado a adoQuery3 (o de estarlo, fué modificada la sentencia SQL que mostras arriba).


Saludos.

giantonti 14-04-2013 01:57:01

por un momento lo dude, pero revise todo y creeme el datasource esta con el adoquery
Código Delphi [-]
FormSelequipo.adoQuery1.SQL.Text := 'Select * From mov where cod_cli = '+QuotedStr(ADOQuery1rif.asstring);
    FormSelequipo.adoQuery1.Open;
    //If FormSelequipo.adoQuery1.Eof Then
    If FormSelequipo.adoQuery1.IsEmpty Then
    ShowMessage ('No se ha encontrado ningun articulo relacionado ' +
      'con el cliente.')
  Else
  Begin
    Application.CreateForm (TFormSelequipo, FormSelequipo);
     Try
      If FormSelequipo.ShowModal = mrOK Then
      Begin
        ADOQuery1equipo.asstring := FormSelequipo.adoQuery1articulo.AsString;
       ADOQuery1serial.AsString := FormSelequipo.adoQuery1serial.AsString;
      End;
    Finally  // Nos aseguramos de destruir el objeto FormSelequipo
      FormSelequipo.Free;
    End;
  End;

ecfisa 14-04-2013 02:52:42

Hola.

Pero así pareciera que estas llamando a FormSelequipo.adoQuery1 antes de que esté creado FormSelequipo !!

Si no te lanza una excepción, es que no lo has quitado de [ Proyect -> Options -> Forms -> Auto-create forms ] y por lo tanto si adoQuery3 tiene algún dato, estas creando otra instancia de aquél ...

Si TFormSelequipo esta en Auto-create forms no es necesaria la creación, basta con llamar al método ShowModal.

Particularmente quitaría a FormSelequipo de Auto-create forms y cambiaría mi código por:
Código Delphi [-]
  with TFormSelequipo.Create(Self) do
  try
    adoQuery3.Close;  // (1)
    adoQuery3.SQL.Text := 'Select * From mov where cod_cli = ' +QuotedStr(ADOQuery1rif.asstring); // (2) 
    adoQuery3.Open;
    if adoQuery3.IsEmpty then
      ShowMessage ('No se ha encontrado ningun articulo relacionado con el cliente.')
    else
    begin
      if ShowModal = mrOK then
      begin
         ShowMessage('Aquí las acciones a realizar');
        //...
        //...
      end;
    end;
  finally
    Free;
  end;
Donde:
(1) ADOQuery3 es el TADOQuery que reside en FormSelequipo.
(2) ADOQuery1 es el TADOQuery que reside en el form que invoca al al form anterior.

Saludos.


La franja horaria es GMT +2. Ahora son las 14:07:39.

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