PDA

Ver la Versión Completa : problemas en consulta al pasar parametros


leofuentes21
28-12-2012, 00:21:48
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 ^\||/

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

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í:


Q.First;
while (not Q.eof) do begin

... hacer lo que necesites ...

Q.Next;
end;

leofuentes21
28-12-2012, 16:00:16
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 [-] (http://www.clubdelphi.com/foros/#)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


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.


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