Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtro Numerico y String con Like y ADO me Urge!!! por favor :( (https://www.clubdelphi.com/foros/showthread.php?t=74238)

ivantj24 07-06-2011 01:59:13

Filtro Numerico y String con Like y ADO me Urge!!! por favor :(
 
Hola que tal buenas tardes de nuevo, regreso con un problema que ya habia dejado en paz, pero que despues de todo no quiero dejar pasar desapercibido, lo que he intentado hacer de todos los modos posibles y que no me ha dado resultado es hacer una busqueda filltrando en un TAdoquery un numero y un string, lo que intento es que me muestre los datos en un DataGrid que sean similares entre si, y utilizo el like filtrando.

con los Strings no tengo ni un problema, puedo filtrar atraves de mas de un campo, pero cuando intento filtrar agregando un dato entero me sale un error, por no decirlo horror xD ya que le he intentado de todas las formas posibles, tengo apenas unos 3 meses aprendiendo el lenguaje y esta parte en verdad que si la requiero, el mensaje de error que arroja es el siguiente:

No se encontro el elemento en la coleccion que corresponde al nombre o el ordinal solicitado.

y la busqueda la hago de esta manera:

Código Delphi [-]
if edtBuscar.Text<> '' then
    begin
      with ADOTableTicket do
      begin
        Active:= False;
        Filtered:= False;
        Filter:= '(TicketID) LIKE ' + QuotedStr('*' + edtBuscar.Text + '*') + 'OR (Usuario) LIKE ' + QuotedStr('*' + edtBuscar.Text + '*');
        Filtered:= True;
        Active:= True;
      end
    end

se que el problema esta por que intento filtrar un dato numerico junto con otros strings, pero eso es lo que quiero y ya busque por todas partes y no se como puedo llegar a solucionar este problema, me falta ese pequenio de detalle les agradeceria que si ustedes saber como puedo resolverlo me dijeron, y de antemano muchas gracias.

como decia anteriormente, el problema es que trato de filtrar un campo numerico, atraves de un Adoquery, usando LIKE, pero lo que intento hacer es hacer una busqueda por varios campos, el primero es numerico, los demas son strings, espero alguien me pueda ayudar, y muchas gracias de antemano.

ya intente cambiar esta parte
Código Delphi [-]
QuotedStr('*' + edtBuscar.Text + '*')
por '%', ya intente quitar el QuotedStr y dejarlo asi se que esa parte se sintaxis esta mal, pero de todos modos quitandola no me lo resuelve, lo dejo asi
Código Delphi [-]
Filter:= '(TicketID) LIKE ' + edtBuscar.Text +  'OR (Usuario) LIKE ' + QuotedStr('*' + edtBuscar.Text + '*');
y tampoco resulta :(:(

ivantj24 07-06-2011 02:21:52

Disculpen la molestia, solo una aclaracion, no es ADOQuery por donde Filtro ya que no pongo ningun query, es por medio del Filtro de un ADOTABLE, disculpen mi error, pero y de todas formas mi error sigue, ya que no encuentro la forma de solucionar el problema.

Caral 07-06-2011 04:35:36

Hola
El concepto no parece complicado.
Aparte de que no tienes separacion entre parentesis entre el primer like el or y el segundo like, me parece que podrias evitarte disgustos usando variables ya que el filtro con table me parece que no acepta parametros.
Saludos

ivantj24 07-06-2011 05:01:43

Holas que tal Caral, pues entiendo mas o menos lo que dices, pero que tipos de variables, ya que no entiendo bien la parte de como o en donde ponerlas, si fueras un poco mas concreta me alegrarias la noche :) de antemano gracias por tomarte la molestia de responder a mi pregunta, y si es que tienes un ejemplo seria de gran utilidad, gracias

Caral 07-06-2011 05:10:46

Hola
Código Delphi [-]
Var 
Tiq: integer;
Usu: String;
begin
Tiq:= StrToInt(edtBuscar.Text);
Usu:= edtBuscar.Text;
if edtBuscar.Text <> '' then
    begin
      with ADOTableTicket do
      begin
        Active:= False;
        Filtered:= False;
        Filter:= 'TicketID LIKE ' +Tiq+ 'OR Usuario LIKE ''' +Usu+ '*''';
        Filtered:= True;
        Active:= True;
      end
    end
Saludos

ivantj24 07-06-2011 05:27:29

Caral disculpa la molestia de nuevo, pero asi como esta el codigo, di copy-paste sin exagerar, y me dice tipos imcompatibles: 'string' and 'integer' marcandome la variable
+Tiq+

no pongo el codigo, ya que como te digo es el mismo, lo copie y pegue, para evitar errores de dedo xD, y te repito me marca ese error, el cual ya antes me habia salido, pero sin usar variables y solo poner edtbuscar.text, que vendria siendo algo parecido, no se si tengas alguna idea del problema o como solucionarlo. gracias

Caral 07-06-2011 05:32:08

Hola
No esperes mucho de este novato.:D
Código Delphi [-]
Var 
Tiq: integer;
Usu: String;
begin
Tiq:= StrToInt(edtBuscar.Text);
Usu:= edtBuscar.Text;
if edtBuscar.Text <> '' then
    begin
      with ADOTableTicket do
      begin
        Active:= False;
        Filtered:= False;
        Filter:= 'TicketID LIKE ' +intTostr(Tiq)+ 'OR Usuario LIKE ''' +Usu+ '*''';
        Filtered:= True;
        Active:= True;
      end
    end
Saludos

ivantj24 07-06-2011 05:41:13

Muchisimas Gracias por tu ayuda Caral, pero tengo malas noticias, me sale un error ya familiar al hacer esto:

Argumentos Incorrectos, fuera del intervalo permitido o en conflicto con otros.

este error era otro de los que salian anteriormente, y no entiendo por que, una cosa mas, al convertir
intTostr(Tiq),
no seria necesario poner
Tiq:= StrToInt(edtBuscar.Text);

ya que el primero lo pasa de Entero a String, y Despues lo convierto de String a Integer, por lo cual quitando la variable y dejandolo como edtbuscar.text seria suficiente, por que estaria regresando al origen del tipo variable, bueno es una pequenia observacion que no tiene mucho que ver, solo para ahorrar codigo, :S:S:S pero de todos modos el problema persiste gracias por la ayuda, y espero poder solucionarlo o si alguien del foro pudiera echarnos la mano xD por que no entiendo el problema.

ivantj24 08-06-2011 20:28:31

Al parecer a nadie le ha salido este error, o acaso nadie ha heco un tipo de consulta de este tipo??? solo pregunto por que el ultimo post fue del error que tengo y no he podido resolverlo, espero alguien pueda decirme o ayudarme en esto, por que como decia con un campo numerico junto con un string no me genera la busqueda :( espero aun alguna sugerencia, gracias

oesqueda 08-06-2011 21:13:04

Porque no mejor usas la funcion Format


const
FILTRO = '(TicketID) LIKE "*%d*") OR (Usuario) LIKE ("*%s*")';
var
sCad:string;


if edtBuscar.Text<> '' then
begin
with ADOTableTicket do
begin
Close;
Filtered:= False;

sCad := Format(FILTRO, [Tiq, usu]);
Filter:= sCad;


Filtered:= True;

Open;
end
end

oesqueda 08-06-2011 21:14:08

Creo que lo mejor es que usaras parametros o rehacer la consulta SQL porque a final de cuentas estas cerrando y abriendo el Dataset

oesqueda 08-06-2011 21:17:55

Perdon puse dobel comilla en vez de una:

const
FILTRO = '(TicketID) LIKE ''*%d*'') OR (Usuario) LIKE (''*%s*'')';
var
sCad:string;

if edtBuscar.Text<> '' then
with ADOTableTicket do begin
Close;
Filtered:= False;

sCad := Format(FILTRO, [Tiq, usu]);
Filter:= sCad;

Filtered:= True;

Open;
end

Casimiro Noteví 08-06-2011 21:29:41

Recuerden usar las etiquetas para código:




.

ivantj24 08-06-2011 21:45:09

Hola que tal muchisimas gracias por ayudarme :(, pero el problema persiste, me sale el mismo error
Argumentos Incorrectos, fuera del intervalo permitido o en conflicto con otros.

y enserio no entiendo ni por que, ya he hecho muchos cambios y nada, le he intentad de todas formas y nada, por cierto, solo cambie una pequenia parte al codigo que me enviaste, quite el Open, y lo deje como Active:= True; lo mismo con Close;. pero de todas formas ni haciendo eso me lo resolvio. intente tal y como me lo enviaste y nada, se agradece mucho la ayuda enserio, solo que el problema persiste como decia :(

Asi queda el codigo y nada :(
Código Delphi [-]
procedure TfrmTicket.btnBuscarClick(Sender: TObject);
const
  FILTRO = '(TicketID) LIKE ''*%d*'') OR (Usuario) LIKE (''*%s*'')';
var
  sCad:string;
  Tiq : Integer;
  Usu : String;
begin
  if edtBuscar.Text<> '' then
    with ADOTableTicket do
    begin
      //Close;
      Active:= False;
      Filtered:= False;
      sCad := Format(FILTRO, [Tiq, usu]);
      Filter:= sCad;
      Filtered:= True;
      Active:= True;
      //Open;
    end
end;

ivantj24 09-06-2011 02:33:21

oesqueda, cierto estaba mal yo :S:S:S deje el open y el close, tal y como lo tienes tu y funciona perfectamente, muchisimas gracias!!! enserio, ya termine las partes que me estaba haciendo quebrar la cabeza xDDDD jajaja gracias y saludos :))))))))))))))))))

ivantj24 09-06-2011 02:38:33

Negativo :( por algun detalle o algo volvio a salir error

Argumentos Incorrectos, fuera del intervalo permitido o en conflicto con otros.

y no entiendo por que, pense que todo iba bien pero al correo de nuevo el programa me volvio a generar el mismo problema, :S:S:S y no entiendo por que, enserio no se que show con esto de verdad :(, espero alguien me pueda ayudar con esto por favor!!! :(

Caral 09-06-2011 03:00:14

Hola
Me parece que esta algo mas complicado de la cuenta, mucho codigo para un filtro, pero intenta asi:
Código Delphi [-]
procedure TfrmTicket.btnBuscarClick(Sender: TObject);
const
  FILTRO = '(TicketID) LIKE ''*%d*'') OR (Usuario) LIKE (''*%s*'')';
var
  sCad:string;
  Tiq : Integer;
  Usu : String;
begin
  if edtBuscar.Text <> '' then
    with ADOTableTicket do
    begin
      Filtered:= False;
      sCad := Format(FILTRO, [Tiq, usu]);
      Filter:= sCad;
      Filtered:= True;
    end
end;
Es un adotable, si no esta activo no reconoce el filtro, me da la impresion.
Saludos

ivantj24 09-06-2011 03:15:02

Caral Gracias por retomar el tema, y enserio que mala onda, que aun no se pueda, intente como me dices en el mensaje, solo quite los Active:=False; y Active:=True;. y no tampoco con eso se pudo:( ya no se que hacer enserio!!!! :( de plano al parecer no se puede hacer un filtro en delphi, con ADO numeriro y string??? :( muchas gracias por tomarse las molestias pero aun asi de plano no puedo aun :(

Caral 09-06-2011 03:16:13

Hola
Que base de datos usas?.
Saludos

ivantj24 09-06-2011 03:18:23

Sql Server 2005

Caral 09-06-2011 03:21:02

Hola
Que pena por que me hubiera gustado echarle un vistazo al programa para ayudar mejor.
Pregunto:
Por que si el filtro te esta dando tantos problemas por que no haces la consulta con un AdoQuery via sql, ademas sera mucho mas eficiente y rapida.
Saludos

ivantj24 09-06-2011 03:26:41

Mira ahora mismo voy de salida ya del trabajo,e ste es un proyecto de la universidad que tengo que terminar en este mes :S:s y para todos los diferentes ventanas utilizo a fuerza buscar por el ID de usuario, ticket, departamento etc etc, entonces si no me queda de otra tendre que ver como hacerle pero con el ADOquery como dices, lo que pasa es que el Grid esta relacionado pero con el ADOTable entonces, si lo cambio a un ADOquery tendre, supongo no se mucho de Delphi, que si cambio a ADOquery, tendria que cambiar muchas cosas por que todo lo demas esta relacionado al ADOTable utilizo componentes DBEdits y cosas que estan relacionadas directamente al ADOtable, por eso es mi complicacion cambiarme por que tendria que cambiar algunas partes de codigo, ya ya voy a terminar, de todos modos muchas gracias enserio, y probare en casa a hacer una consulta, o sino esperare a ver si alguien tiene una idea, sino entonces empezare a hacer pruebas, gracias Caral

Caral 09-06-2011 03:31:23

Hola
Puedes usar un adoquery, presentar los datos en el dbgrid, enlazar el adotable etc., etc., etc, sin tener que hacer grandes cambios, es sencillo.
La consulta sql seria muy sencilla.
Saludos
PD: Si insistes en el filtro le entramos y lo resolvemos, todo tiene solucion.

Caral 09-06-2011 04:07:00

Hola
Vamos a resolver esto paso a paso:
1- Tienes que filtrar o un dato (interger) o un dato (string) en el mismo adotable.
2- Tratamos de usar OR pero se niega.;)
Entonces lo podemos atacar por otro lado, definiendo el filtro dependiendo de si es uno u otro:
Primero creamos una variable global, esta la colocamos publica:
Código Delphi [-]
 public
    { Public declarations }
   tipo: integer;
Esta variable nos servira para que guarde simplemente un numero.
Ahora nos colocaremos en el evento onKeyPress del edit (edtBuscar) que es el que da el dato al filtro.
En ese evento colocamos esto:
Código Delphi [-]
if (Key in ['0'..'9',#8]) then
  begin
  Tipo:= 1;
  end
  else
  Tipo:= 0;
Esto lo que hace es simplemente indicar si escribimos numeros o letras, de ser numeros el valor de Tipo sera 1 de lo contrario 0.
Bien ahora si hacemos el filtro:
Código Delphi [-]
procedure TfrmTicket.btnBuscarClick(Sender: TObject);
var
   Filtro : String;
begin
  ADOTableTicket.Filtered := False; // desconectamos el filtro

  if edtBuscar.Text <> '' then // si no esta vacío
  begin

  If Tipo = 1 then begin // si tipo es igual a 1 filtra por el tiquet (integer)
  Filtro := 'TicketID Like '+edtBuscar.Text;
  end;

  If Tipo = 0 then begin // si tipo es igual a 0 filtra por el usuario (string)
  Filtro := 'Usuario Like '''+ edtBuscar.Text + '*''';
  end;

  ADOTableTicket.Filter := Filtro; // obtiene el filtro
  ADOTableTicket.Filtered := True // lo Filtro

  End;
end;
Bien, creo que es un codigo mas claro.
Primero definimos si queremos filtrar por numeros o letras.
Segundo con el valor generado en la variable hacemos o un filtro u otro.
Espero que si no te sirve por lo menos ayas aprendido algo mas, aunque sea sencillo.
Saludos

ivantj24 09-06-2011 06:41:38

Cara que tal, muchisimas gracias pro la ayuda enserio, y entiendo lo que dices muy bien, muy buena idea eso de usar expresiones regulares para detectar si es numerico o string, pero el detalle es que lo que queria era que con el OR me trajera los datos parecidos ya sean del campo, TicketID(Numerico) o Usuario(String), era como una busqueda dinamica, enserio te lo agradesco el esfuerzo, solo que de plano en este caso no aplicaria, pro que como te digo la idea es hacer la busqueda en ambos si yo busco 1, me traiga de TicketID los resultadosqu etengan en si el numero 1, y tambien todos los registros del campo Usuario, que contengan el 1, la opcion que me das te la agradesco y esta bien, solo que me trae ya sea de un campo o del otro, pero no de ambos :( hoy tratare de hacer como quedamos con el ADOquery, muchas gracias :) se agradece la ayuda enserio

oesqueda 09-06-2011 16:17:49

Perdon por no poner el codigo marcado como codigo, son mis primeros mensajes :D.

En serio mejor haz consulta con parametros.

En el componente ADO en el commandtext (SQL):
Código SQL [-]
select *
from TABLA
where TicketID LIKE :Tiq or Usuario LIKE :usu
order by LOQUESEA

Y en el codigo (usa ADODATASET en vez de ADOTABLE):
Código Delphi [-]
      with ADOTableTicket do  begin
        Close;
        Parameters.ParamByName('Tiq').Value := TIQ;
        Parameters.ParamByName('USU').Value := Format('*%s*', [usu]);
        Open;
      end; {with}

Quitas el autofilter, ese usalo poco es mejor hacer consultas SQL.
Usando el TADODataset, pones la sentencia SQL dento de commandtext y solo debes cerrar cambiar parametros y volver a abrir, te recomiendo pongas indices en las columnas que usas para las consultas (where) y el ordenamiento (order by).

Asi tu codigo de se redujo y encapsulas codigo donde debe ir.

Saludos

oesqueda 09-06-2011 16:26:44

No quiero equivocarme pero el like no deberia usarse en un campo numerico asi
Corrijanme por favor

ivantj24 09-06-2011 19:59:20

Gracias Oesqueda, por la ayuda, y no lo he probado pero en el trabajo ya estoy fuera de tiempo para entregar el proyecto, me dijeron que asi lo dejara (con busquedas por string unicamente) pero personalmente no me siento bien, ya que en un futuro se que volvera a presentarse esto, de todos modos me dijeron que si fuera a hacer algo seria con ADOTable por Filtro, les agradesco a todos la ayuda, pero por el momento asi me quedare ya, y en mi tiempo libre buscare la solucion pro el momento no quiero detenerme aqui por que aun me faltan otros detalles mas, y no me quiero complicar de mas, saludos a todos y muchas gracias por la ayuda.


La franja horaria es GMT +2. Ahora son las 06:21:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi