Ir al contenido


Foto

problemas en consulta al pasar parametros


  • Por favor identifícate para responder
8 respuestas en este tema

#1 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 27 diciembre 2012 - 05:05

Hola amigos espero tenga un buen dia. (y)
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 OC ) 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 8o|.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 OC ) 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  :( solo me muestra las documentos que empiesan con folio OV (li).
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  (y)solo es cuando utilizo en 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
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 28 diciembre 2012 - 02:12

Buenas

Has probado a debuguear y ver qué consulta SQL estás montando y probar esa misma consulta que montas (no la que crees que montas) en el SQL Express? Es casi seguro que no estás montando la consulta SQL que crees montar (si desde SQL Express te funciona, desde Delphi no tiene por qué no funcionar)

Nos leemos

  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 28 diciembre 2012 - 06:47

.
.
.


.
.
.
        Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');
.
.
.
            Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');

.
.
.
por siento trabajo en Sql express 2005 y delphi 7...


También trabajo con MSSQLServer y el problema podría radicar en las dos líneas que te marco. Invierte el orden, es decir '%'+Trim(TuCampo)+'%', para que el texto quede utilizable para SQLServer.
  • 0

#4 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 28 diciembre 2012 - 08:18

Gracias amigos  por responder  (y)


Buenas

Has probado a debuguear y ver qué consulta SQL estás montando y probar esa misma consulta que montas (no la que crees que montas) en el SQL Express? Es casi seguro que no estás montando la consulta SQL que crees montar (si desde SQL Express te funciona, desde Delphi no tiene por qué no funcionar)

Nos leemos


amigo esta es la consulta que digo que pruevo en el sql y es la misma que hago en el delphi

SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE '%OV%' ) AND (TIP_DOC ='F') AND (STATUS <> 'C')
AND (FECHA_DOC >='18/12/2012') AND (FECHA_DOC <= '19/12/2012')  OR (CVE_DOC LIKE '%IR%' ) AND (TIP_DOC = 'F') AND
(STATUS <> 'C') AND (FECHA_DOC >= '18/12/2012') AND (FECHA_DOC <= '19/12/2012')


solo que en el delphi
 CVE_DOC LIKE :doc 
lo hago por parametros al igual que las fechas porque son filtros que el usuario hace y he ayi el problema
entonces logicamente creo que son los parametros que los estoy pasando mal pero no encuentro donde el problema 8o| (li)




.
.
.


.
.
.
        Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');
.
.
.
            Params[C].Text:=Trim('%'+Q_fol.FIELDBYNAME('FOLUSER').Text+'%');

.
.
.
por siento trabajo en Sql express 2005 y delphi 7...


También trabajo con MSSQLServer y el problema podría radicar en las dos líneas que te marco. Invierte el orden, es decir '%'+Trim(TuCampo)+'%', para que el texto quede utilizable para SQLServer.


ya lo prove de esa manera y sigue igual (li) 8o|. he puesto un Memo para ver la consulta el query y tod esta bien (y) no se que mas puedo hacer ?
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 diciembre 2012 - 08:48

Amigo tu problema es  de lógica, observa bien lo que estás haciendo en el procedimiento que  dices que te da problemas..

1. Cierras qry1.
2. Estás creando una consulta con tres parámetros.
3. Recorres el query Q_fol para  obtener y asignar los parámetros. Y es aquí donde las cosas no tienen lógica, porque los valores para los parámetros que recibe qry1, son los del último registro de Q_fol, por lo tanto solo obtendrás los resultados que cumplan con las condiciones encontradas en el último registro de Q_fol.

Además te recomiendo ser cuidadoso con los paréntesis a la hora de agrupar las condiciones de tus consultas.

Si lo crees conveniente puedes postear la estructura de las tablas involucradas en la consulta que te da problemas, y describir un ejemplo de los resultados que quieres obtener, para ayudarte a organizar la consulta.

Saludos.
  • 0

#6 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 28 diciembre 2012 - 09:08

...

ya lo prove de esa manera y sigue igual (li) 8o|. he puesto un Memo para ver la consulta el query y tod esta bien (y) no se que mas puedo hacer ?


Utiliza SQL.SaveToFile(NombreDeArchivo) e intenta correr las sentencias SQL resultantes en SQLServer. Seguramente ésto te dará más armas para completar una depuración y modificaciones a tu código. No desesperes, SQLServer es muy "diva" y quisquilloso con las sentencias que ejecuta, pero una vez que lo dominas, hace maravillas.
  • 0

#7 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 28 diciembre 2012 - 10:21

Gracias amigos por su ayuda despues de tanto provar y quebradera de cabeza lo logre (y).

el problema estaba  cuando pasaba los parametros.


Q_fol.First;    /// me va al primer registro
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 error yo le habia asignado el valor C:=1 entonces no le asignaba el primero parametros 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 por su ayuda se las debo  (b)  y espero pasen un feliz año nuevo <:o)
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 diciembre 2012 - 10:57

Amigo me alegra que hayas resuelto tu problema, pero con todo respeto, te aseguro que tu código carece de sentido, a menos que dispares un proceso en uno de los eventos Before - After u OnScroll de Q_fol.

Incluso si insistes en tu solución, también hay serios errores en la lógica del procedimiento:

Tu posteas esto, que tiene varios errores:


delphi
  1. Q_fol.FIRST;    /// me va al primer registro
  2. WITH  qry1 DO 
  3.   BEGIN
  4.     Active:=FALSE;
  5.     SQL.Clear;                                                                                                                 
  6.     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+' '); 
  7. //  C:=1;///aqui estaba el error yo le habia asignado el valor C:=1 entonces no le asignaba el primero parametros se lo saltaba
  8.       ParamByName('DOC').Text:='%'+TRIM(Q_fol.FIELDBYNAME('FOLUSER').Text)+'%';
  9.       C:=1 ;
  10.       Params[C].AsDate:=DateTimePicker1.DATE;
  11.       C:=C+1 ;
  12.       Params[C].AsDate:=DateTimePicker2.DATE;
  13.       Q_fol.NEXT;
  14.       while NOT Q_fol.Eof do
  15.         BEGIN
  16.         C:=C+1 ;
  17.         Params[C].Text:='%'+TRIM(Q_fol.FIELDBYNAME('FOLUSER').Text)+'%';
  18.         C:=C+1 ;
  19.         Params[C].AsDate:=DateTimePicker1.DATE;
  20.         C:=C+1 ;
  21.         Params[C].AsDate:=DateTimePicker2.DATE;
  22.         C:=C+1;
  23.         Q_fol.NEXT;
  24.         END;
  25.   Active:=TRUE;
  26. END;



Algo un poco mas depurado de tu código, sería:


delphi
  1. begin
  2.   Q_fol.FIRST;
  3.   while NOT Q_fol.Eof do
  4.   BEGIN
  5.     WITH qry1 DO
  6.     BEGIN
  7.       Active := FALSE;
  8.       SQL.Clear;
  9.       SQL.ADD('SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE :DOC ) AND (TIP_DOC ='
  10.         + QUOTEDSTR('F') + ') AND (STATUS <>' + QUOTEDSTR('C') +
  11.         ') AND(FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2) ' + BUSCA + ' ');
  12.       ParamByName('DOC').Text := '%' +
  13.         TRIM(Q_fol.FIELDBYNAME('FOLUSER').Text) + '%';
  14.       ParamByName('f1').AsDate := DateTimePicker1.DATE;
  15.       ParamByName('f2').AsDate := DateTimePicker2.DATE;
  16.       Active := TRUE;
  17.     END;
  18.     Q_fol.NEXT;
  19.   END;
  20. END;



Aunque insisto que no tiene sentido recorrer un dataset para que finalmente solo tome los parámetros del último registro ( a menos que hagas algo al paso por cada registro).

Saludos
  • 0

#9 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 28 diciembre 2012 - 11:12

Algo un poco mas depurado de tu código, sería:


delphi
  1. begin
  2.   Q_fol.FIRST;
  3.   while NOT Q_fol.Eof do
  4.   BEGIN
  5.     WITH qry1 DO
  6.     BEGIN
  7.       Active := FALSE;
  8.       SQL.Clear;
  9.       SQL.ADD('SELECT * FROM FACT01 WHERE  (CVE_DOC LIKE :DOC ) AND (TIP_DOC ='
  10.         + QUOTEDSTR('F') + ') AND (STATUS <>' + QUOTEDSTR('C') +
  11.         ') AND(FECHA_DOC >= :F1) AND (FECHA_DOC <= :F2) ' + BUSCA + ' ');
  12.       ParamByName('DOC').Text := '%' +
  13.         TRIM(Q_fol.FIELDBYNAME('FOLUSER').Text) + '%';
  14.       ParamByName('f1').AsDate := DateTimePicker1.DATE;
  15.       ParamByName('f2').AsDate := DateTimePicker2.DATE;
  16.       Active := TRUE;
  17.     END;
  18.     Q_fol.NEXT;
  19.   END;
  20. END;



Aunque insisto que no tiene sentido recorrer un dataset para que finalmente solo tome los parámetros del último registro ( a menos que hagas algo al paso por cada registro).

Saludos


Gracias amigo tomare en cuenta tu recomendacion y mejorare mi codigo (y). aunque ya estaba en eso :p pero gracias  (y)
Y en cuanto al query que recorro es porque los folios pueden varias pueden ser solo un registro o pueden ser mas de 2. y no tomo solo el ultimo sino que desde el primero cada uno que encuentra lo va agarrando para utlizarlo en la consulta anterior.

saludos


  • 0