Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   problemas en consulta al pasar parametros (https://www.clubdelphi.com/foros/showthread.php?t=81872)

leofuentes21 28-12-2012 00:21:48

problemas en consulta al pasar parametros
 
Hola amigos espero tenga un buen dia.
espero me puedan ayudar en lo siguiente.

tengo un problema con un filtro.

esta es una query donde busco unos folios segun los que encuentre va asignar la linea de codigo a la variable 'Busca' los folios que encuentra son 2 pero pueden ser mas por ejemplo encuentra 2 el IR y OV
esta me va bien ^\||/
Código Delphi [-]
  with Q_fol do
  begin
    Active:=False;
    sql.Clear;
    sql.Add('SELECT DISTINCT FOLUSER FROM AGENFOL WHERE (CLV_AGN =:CLVE)');
    ParamByName('CLVE').AsInteger:=FrmOffices.qry1.fieldbyname('CLV_OFC').AsInteger;
    Active:=True;
  end;

  Q_fol.First; // me voy al primer registro el cual no interesa asignar porque se lo paso mas adelante
  Q_fol.Next;  // me voy al segundo este si porque es el que agrego en la variable 'Busca'
  while not Q_fol.Eof do
  begin
    busca:=busca+' OR (CVE_DOC LIKE :DOC ) AND (TIP_DOC = '+
        QUOTEDSTR('F')+') AND (STATUS <> '+QUOTEDSTR('C')+
        ') AND (FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2)';
    Q_fol.Next;
  end;
hasta aqui todo bien ,pero el problema es en esta.La query donde hago el filtro y donde paso los parametros
Código Delphi [-]
  WITH  qry1 DO
  BEGIN
    Active:=False;
    SQL.Clear;
    SQL.Add('SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE :DOC ) AND (TIP_DOC ='+
        QUOTEDSTR('F')+') AND (STATUS <> '+QUOTEDSTR('C')+
        ') AND (FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2) '+BUSCA+' ');
    Q_fol.First;
    C:=0;
    Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');
    C:=C+1 ;
    Params[C].AsDate:=DateTimePicker1.DATE;
    C:=C+1 ;
    Params[C].AsDate:=DateTimePicker2.DATE;
    Q_fol.Next;
    while not Q_fol.Eof do
    begin
      C:=C+1 ;
      Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');
      C:=C+1 ;
      Params[C].AsDate:=DateTimePicker1.DATE;
      C:=C+1 ;
      Params[C].AsDate:=DateTimePicker2.DATE;
      C:=C+1;
      Q_fol.Next;
    end;
    Active:=True;
  end;

por algun motivo no se que estoy haciendo mal :confused:solo me muestra las documentos que empiesan con folio OV.
La misma consulta la he provado en el Sql express 2005 que es donde tengo la base de datos y me muestra bien los resultados solo es cuando utilizo el delphi en el dbgrid que no me esta mostrando bien la informacion.

por siento trabajo en Sql express 2005 y delphi 7
les agradeceria mucho su ayuda
saludos

Neftali [Germán.Estévez] 28-12-2012 10:11:04

Hola.
Creo que cuando haces el recorrido te sobra el primer Next (antes del While), ya que si lo pones como está ahora te dejas el primer registro.

Es decir, la estructura debería ser algo así:

Código Delphi [-]
Q.First;
while (not Q.eof) do begin

  ... hacer lo que necesites ...

  Q.Next;
end;

leofuentes21 28-12-2012 16:00:16

Cita:

Empezado por Neftali (Mensaje 452585)
Hola.
Creo que cuando haces el recorrido te sobra el primer Next (antes del While), ya que si lo pones como está ahora te dejas el primer registro.

Es decir, la estructura debería ser algo así:

Código Delphi [-]Q.First; while (not Q.eof) do begin ... hacer lo que necesites ... Q.Next; end;

Gracias por responder amigo^\||/

esto lo hago asi porque el primer registro no interesa pasarcelo a la variable ya que lo mando en la consulta siguiente

Código Delphi [-]
  WITH  qry1 DO   BEGIN     
Active:=False;     
SQL.Clear;     
SQL.Add('SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE :DOC ) AND (TIP_DOC ='+         QUOTEDSTR('F')+') AND (STATUS <> '+QUOTEDSTR('C')+         ') AND (FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2) '+BUSCA+' ');     
Q_fol.First;     
C:=0;     
Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');  
/// Aqui le mando el primer registro      
C:=C+1 ;     
Params[C].AsDate:=DateTimePicker1.DATE;     
C:=C+1 ;     
Params[C].AsDate:=DateTimePicker2.DATE;     
Q_fol.Next;   
/// aqui siguen los demas folios y aqui si aplica el next     
while not Q_fol.Eof do       begin       
C:=C+1 ;       
Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');       
C:=C+1 ;       
Params[C].AsDate:=DateTimePicker1.DATE;       
C:=C+1 ;       
Params[C].AsDate:=DateTimePicker2.DATE;       
C:=C+1;       
Q_fol.Next;     
end;     
Active:=True;   
end;

leofuentes21 28-12-2012 18:03:36

Gracias amigos por su ayuda despues de tanto provar y quebradera de cabeza lo logre
el problema estaba cuando pasaba los parametros.

Código SQL [-]
       Q_fol.First;
       WITH  qry1 DO
       BEGIN
         Active:=False;
         SQL.Clear;                                                                                                                  
         SQL.Add('SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE :DOC ) AND (TIP_DOC ='+QUOTEDSTR('F')+') AND (STATUS <> '+QUOTEDSTR('C')+') AND(FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2) '+BUSCA+' ');
       //  C:=1;  // aqui estaba el erro yo le asiganaba el valor c:=1 entonces no le asiganaba el primer parametro y se lo saltaba
         ParamByName('DOC').Text:='%'+Trim(Q_fol.FIELDBYNAME('FOLUSER').Text)+'%';
         C:=1 ;
         Params[C].AsDate:=DateTimePicker1.DATE;
         C:=C+1 ;
         Params[C].AsDate:=DateTimePicker2.DATE;
         Q_fol.Next;
         while not Q_fol.Eof do
         begin
            C:=C+1 ;
            Params[C].Text:='%'+Trim(Q_fol.FIELDBYNAME('FOLUSER').Text)+'%';
            C:=C+1 ;
            Params[C].AsDate:=DateTimePicker1.DATE;
            C:=C+1 ;
            Params[C].AsDate:=DateTimePicker2.DATE;
            C:=C+1;
            Q_fol.Next;
         end;
         Active:=True;
       end;
gracias espero pasen un feliz año nuevo


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

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