Jump to content


Photo

[RESUELTO] Where CAMPO IN


  • Please log in to reply
13 replies to this topic

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 27 August 2010 - 05:13 PM

Saludos amigos,

estoy tratando de hacer esto:



sql
  1. SELECT * FROM mi tabla WHERE CAMPO IN (:tipo)





delphi
  1. MiQuery.Active := False;
  2.   MiQuery.ParambyName('TIPO').AsString := '1,2'
  3. MiQuery.Active := True;



Pero me dice que 1,2 no es un entero valido. 

Si lo hago desde ibexpert tampoco, como puedo realizar esto con parametros?
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 27 August 2010 - 05:18 PM

Hola
A ver asi:


delphi
  1. MiQuery.Active := False;
  2. MiQuery.Sql.Text:= 'SELECT * FROM mi tabla WHERE CAMPO IN (:tipo)';
  3. MiQuery.Params[0].Value := '1,2'
  4. MiQuery.Active := True;


Si no camina quitale los parentesis al parametro Tipo a ver.
Saludos
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 27 August 2010 - 05:24 PM

Hola Eduarcol....

La sentencia SQL la agregas en el componente o por código ?

Saludox ! :)
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 27 August 2010 - 05:31 PM

El problema a primera vista es que estás asignando una cadena de texto a un parámetro de tipo entero.
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 27 August 2010 - 05:38 PM

Amigo.... razadi, egostar y tu servidora (después de una mini junta :D) estamos de acuerdo en que lo mejor es que sustituyas la linea de tu sentencia SQL por la cadena construida con tus datos...

Ya sea sobreescribiendo la línea completa o utilizando Format

Saludox ! :)
  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 27 August 2010 - 05:42 PM

Hola

Amigo.... razadi, egostar y tu servidora (después de una mini junta :D) estamos de acuerdo en que lo mejor es que sustituyas la linea de tu sentencia SQL por la cadena construida con tus datos...

Ya sea sobreescribiendo la línea completa o utilizando Format

Saludox ! :)

Y traducido significa :
Saludos

  • 0

#7 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 27 August 2010 - 05:45 PM

Jejejeje... algo como lo que le sugeriste amigo Caral:



delphi
  1. MiQuery.Active := False;
  2. MiQuery.Sql.Text:= 'SELECT * FROM mi tabla WHERE CAMPO IN (1,2)';
  3. MiQuery.Active := True;



o algo así:



delphi
  1. sSQL := 'SELECT * FROM mi tabla WHERE CAMPO IN (%s)';
  2.  
  3. MiQuery.Active := False;
  4. MiQuery.Sql.Text:= Format(sSQL,['1,2']);
  5. MiQuery.Active := True;




O sea sin parámetros.... (y)

Saludox ! :)
  • 0

#8 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 27 August 2010 - 05:53 PM

Hola
Bueno ya que estamos en esto de cosas nuevas me intrigan varias cosas:
1-
CAMPO IN (%s)

2-
sSQL :=

3-
Format(sSQL,['1,2']);

1- Estamos de acuerdo en el uso de % pero s ?.
2-sSQL, me suena a que se puede ver el contenido del sql del componente, pero no entiendo.
3-Bien, se formatea, pero vuelvo a lo mismo sSql, de donde salio esto tan raro ?.

Maestra, aqui el novato no entiende. :
Saludos
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14458 posts
  • LocationMéxico

Posted 27 August 2010 - 07:49 PM

Hola amigo

La función format() permite dar formato a cadenas con comodines que permiten "pasar" datos de tipo entero, decimal, string  a una variable de tipo string, es decir, hace un cast de los datos para convertirlos a string.

Por ejemplo:



delphi
  1. showMessage(format('Esta es una prueba para que %s entienda',['CARAL']));



Esto nos regresa 'Esta es una prueba para que CARAL entienda'



delphi
  1. showMessage(format('Esta es la prueba número %d para que %s entienda',[2,'CARAL']));



Esto nos regresa 'Esta es la prueba número 2 para que CARAL entienda'



delphi
  1. showMessage(format('Esta es la prueba número %d para que %s entienda y su deuda ya asciende a %m Colones',[3,'CARAL',41500.35]));



Esto nos regresa 'Esta es la prueba número 3 para que CARAL entienda y su deuda ya asciende a $41,500.35 Colones'

Ejecutalos en delphi y veras que bonito sale ;)

Salud OS
  • 0

#10 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 27 August 2010 - 08:05 PM

Hola
Ves: No cuesta nada ser claro para que un novato capte. *-) (y)
Algo mas que aprendí hoy, gracias amigo. (y)
Saludos
  • 0

#11 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 28 August 2010 - 10:57 AM

Lo siento amigo Caral, ayer después de responder salí corriendo de la oficina y hasta hoy he vuelto a conectarme  :embarrassed:....

...sSQL no es nada más ni nada menos que una variable de tipo string que guarda la sentencia, misma que después es modificada por el Format (ya explicado por el buen ego (y)) y posteriormente asignada a la propiedad SQL.Text del Query ;)...

Saludox !... y disculpen la confusión :)
  • 0

#12 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 28 August 2010 - 10:59 AM

Saludos.

Eduarcol lo que quieres lograr desgraciadamente no es posible revisa este articulo.

Podrías pensar en armar la sentencia con EXECUTE STAMENT si lo quieres hacer en el mismo Firebird o en Delphi con TQuery.SQL.Add() a razón de los parámetros que tengas a mano.
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14458 posts
  • LocationMéxico

Posted 28 August 2010 - 12:05 PM

Efectivamente, es lo que comentaba con Razadi y Fena, no puede pasar como parámetro la lista de valores, Sin ambargo si la cantidad de valores es fija se puede hacer sin problema.



sql
  1. SELECT * FROM consumos
  2. WHERE cargo IN (:uno,:dos)



Y ahora sí, pasar ambos parámetros.



delphi
  1. MiQuery.Active := False;
  2.   MiQuery.ParambyName('UNO').AsInteger := 1;
  3.   MiQuery.ParambyName('DOS').AsInteger := 2;
  4. MiQuery.Active := True;



Si es dinámica pienso que si se podría aunque con algo de código ;)

Salud OS
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 28 August 2010 - 02:49 PM

Muchas gracias amigos, con el Format estuvo perfecto, son unos genios deberian reunirse mas a menudo jeje
  • 0




IP.Board spam blocked by CleanTalk.