Ver la Versión Completa : !!Problemas con IF y sus valores !!
Darkseratul
29-09-2011, 17:45:20
Hola amigos del clubdelphi espero que estén muy bien
Bueno lo que pasa es que tengo un problema el cual va mas o menos así
Trata de hacer una búsqueda secuencial y por tabla
La búsqueda secuencial ya esta y trabajo muy bien la cual funciona así en el evento onchange de un edit le pongo el siguiente código
begin
If (Edit1.text <> '') then
begin
ADOTable1.Filter := 'mitabla Like '''+ Edit1.Text +'*''';
ADOTable1.Filtered:=True;
end
Else
begin
ADOTable1.Filtered:=False;
ok todo eso esta muy bien pero que pasa si quiero buscar en diferentes tablas :confused:
bueno con mi poca experiencia manejando delphi trato de hacer lo que busco
en el evento onchange de un edit pongo este codigo
begin
if CheckBox1.Checked = true then
begin
If (Edit1.text <> '') then
begin
ADOTable1.Filter := 'mitabla Like '''+ Edit1.Text +'*''';
ADOTable1.Filtered:=True;
end
Else
begin
ADOTable1.Filtered:=False;
begin
if CheckBox2.Checked = true then
begin
If (Edit1.text <> '') then
begin
ADOTable1.Filter := 'mitabla2 Like '''+ Edit1.Text +'*''';
ADOTable1.Filtered:=True;
end
Else
begin
ADOTable1.Filtered:=False;
begin
if CheckBox3.Checked = true then
begin
If (Edit1.text <> '') then
begin
ADOTable1.Filter := 'mitabla3 Like '''+ Edit1.Text +'*''';
ADOTable1.Filtered:=True;
end
Else
begin
ADOTable1.Filtered:=False;
end;
tengo 3 CheckBox y supuesta mente a mi entender el evento onchange deve de ejecutar la parte de codigo que cumpla con lo requerido que en este caso es si al CheckBox esta en true lo mas curioso es que ya lo implemente pero solo me da resultado con la primer tabla (mitabla) pero cuando le pongo en otro CheckBox no hace nada
alguien me podria ayudar de ante mano muchas gracias :)
ecfisa
29-09-2011, 18:08:39
Hola Darkseratul.
Creo que el problema está que en todos los casos estas asignando a la propiedad Filter del mismo 'ADOTable1' las cadenas: mitabla, mitabla2, mitabla3 y en ningún momento veo que cambies la propiedad TableName.
Es decir que si en el TADOTable tenes asignado como TableName 'mitabla' no va a funcionar filtrar por 'mitabla2'.
Un saludo.
DarKraZY
29-09-2011, 18:20:46
Hola,
Además de lo que te ha comentado ecfisa que también creo que pueda ser el error, debes intentar estructurar el código para tenerlo más claro.
Por ejemplo:
procedure TForm5.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
ADOTable1.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
ADOTable1.Filter := 'mitabla Like ''' + Edit1.Text + '*'''
else if CheckBox2.Checked then
ADOTable1.Filter := 'mitabla2 Like ''' + Edit1.Text + '*'''
else if CheckBox3.Checked then
ADOTable1.Filter := 'mitabla3 Like ''' + Edit1.Text + '*''';
// Por último, activar el filtro
ADOTable1.Filtered := True;
end;
end;
oscarac
29-09-2011, 18:42:11
Hola Darkseratul.
Creo que el problema está que en todos los casos estas asignando a la propiedad Filter del mismo 'ADOTable1' las cadenas: mitabla, mitabla2, mitabla3 y en ningún momento veo que cambies la propiedad TableName.
Es decir que si en el TADOTable tenes asignado como TableName 'mitabla' no va a funcionar filtrar por 'mitabla2'.
Un saludo.
pregunta...
cuando se hace el filtro, se hace por un campo verdad?
quiza los campos se llaman mitabla1, mitabla2, mitabla3, en ese caso deberia funcionarle, quiza no esta referscando el resultado
Caral
29-09-2011, 18:43:36
Hola
El problema es que si contiene algo el edit, pero no se activa ningun check dara error ya que el comienzo y fin siempre termina con la activacion del filtro.
Me parece que la idea es buena, solo que por que no completar el codigo, ser mas especificos:
procedure TForm5.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
ADOTable1.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
ADOTable1.Filter := 'mitabla Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox2.Checked then
begin
ADOTable1.Filter := 'mitabla2 Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox3.Checked then
begin
ADOTable1.Filter := 'mitabla3 Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else
ADOTable1.Filtered := False;
end;
end;
end;
Saludos
Caral
29-09-2011, 18:46:46
Hola
Por supuesto, es de logica pensar que el adotable tiene que estar ligado a la tabla que se quiere filtrar.
Es de suponer que mitabla1, 2, 3 en realidad son campos de cada tabla, de lo contrario estamos perdiendo el tiempo y es caro.:D
Saludos
Caral
29-09-2011, 18:50:26
Hola
La logica del proceso es esta:
procedure TForm5.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
ADOTable1.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
ADOTable1.TableName:= 'mitabla1';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox2.Checked then
begin
ADOTable1.TableName:= 'mitabla2';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox3.Checked then
begin
ADOTable1.TableName:= 'mitabla3';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else
ADOTable1.Filtered := False;
end;
end;
end;
Saludos
EDITO: Por supuesto teniendo en cuenta abrir y cerrar la tabla correspondiente.:p
EDITO2: Me faltaron comillas jejeje
ecfisa
29-09-2011, 19:09:13
pregunta...
cuando se hace el filtro, se hace por un campo verdad?
quiza los campos se llaman mitabla1, mitabla2, mitabla3, en ese caso deberia funcionarle, quiza no esta referscando el resultado
Me dió la impresión que eran nombres de tablas, pero lo que comentas, ciertamente es una posibilidad... ;)
Un saludo.
Darkseratul
29-09-2011, 19:21:34
Discúlpenme pero si me confundí diablos siempre que trato de explicar mi problema se me van las patas
Ciertamente como ya lo comentaron quise desir micampo1, micampo2, micampo3
Es solo una tabla con tres campos diferentes
gracias a todos por su ayuda y paciencia :D siempre meto la pata
Coral tu ejemplo es mas o menos lo que quise hacer pero en el se asumen varias tablas pero en mi caso solo es una con 3 campos
procedure TForm5.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
ADOTable1.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
ADOTable1.TableName:= 'mitabla1';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox2.Checked then
begin
ADOTable1.TableName:= 'mitabla2';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else if CheckBox3.Checked then
begin
ADOTable1.TableName:= 'mitabla3';
ADOTable1.Filter := 'miCAMPO Like ''' + Edit1.Text + '*''';
ADOTable1.Filtered := True
end
else
ADOTable1.Filtered := False;
end;
end;
end;
Muchas gracias a todos :):)
oscarac
29-09-2011, 19:38:54
q bueno
pero es caral no coral....:D:D:D
oscarac
29-09-2011, 19:41:31
ahora te hago una pregunta...
que pasa si marcan 2 o mas Checks ?????
Darkseratul
29-09-2011, 19:48:40
ahora te hago una pregunta...
que pasa si marcan 2 o mas Checks ?????
Eso no puede pasar por que el el evento de onclick del chebox le digo que ponga en false los demas chebox
algo asi
procedure TFClientes.CheckBox1Click(Sender: TObject);
begin
checkbox2.Checked:=false;
checkbox3.Checked:=false;
end;
no se si es la forma correcta pero así me funciono
y si es caral :D:D cuando me fije ya la avía posteado :D:D
Darkseratul
29-09-2011, 19:53:36
:confused:
He adecuado el código que me facilitaron a mi proyecto
procedure TFClientes.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
datamodule1.tarchivo.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
datamodule1.tarchivo.Filter := 'Nombre Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else if CheckBox2.Checked then
begin
datamodule1.tarchivo.Filter := 'Numero Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else
datamodule1.tarchivo.Filtered := False;
end;
end;
con el campo Nombre si me hace la búsqueda
pero con el campo Numero me sale un error de que el Filtro no se puede abrir
Alguien sabe a que se debe ?????:confused::confused::confused:
ayuda por favor y muchas gracias
Caral
29-09-2011, 20:21:41
Hola
procedure TFClientes.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
datamodule1.tarchivo.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
datamodule1.tarchivo.Filter := 'Nombre Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else if CheckBox2.Checked then
begin
datamodule1.tarchivo.Filter := 'Numero Like '+ Edit1.Text;
datamodule1.tarchivo.Filtered := True
end
else
datamodule1.tarchivo.Filtered := False;
end;
end;
Saludos
Darkseratul
29-09-2011, 20:43:11
Hola
procedure TFClientes.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
datamodule1.tarchivo.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
datamodule1.tarchivo.Filter := 'Nombre Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else if CheckBox2.Checked then
begin
datamodule1.tarchivo.Filter := 'Numero Like '+ Edit1.Text;
datamodule1.tarchivo.Filtered := True
end
else
datamodule1.tarchivo.Filtered := False;
end;
end;
Saludos
Muchas gracias Caral solo que hay un problema al hacer la búsqueda en el campo numero me da resultados nulos o que no hay nada tengo como 10 registros que tengo con números como 42541 pero al poner el 4 en la búsqueda no me da ningún resultado :confused::confused::confused:
Caral
29-09-2011, 20:44:30
Hola
Es access ?
Saludos
Darkseratul
29-09-2011, 20:57:23
Hola
Es access ?
Saludos
si claro de hecho prácticamente todo lo que se lo he a prendido de ti con tus ejemplos y explicaciones quisas en su momento no eran para mi pero de todos tu eres la persona con la que mas he a prendida a programas delphi :p
a un soy muy novato pero tu me enseñaste como conectarse a una base de datos acces con tu ejemplo de restaurante :o
y bueno si es acces por que usted la utiliza en la mayoría de los ejemplos y es la única forma que se para conectarme a una base de datos
y bueno te doy las gracias por que sin tu ayuda muchos de nosotros no supiéramos nada
esta es la primera ves que me ayudas en un problema personal y te lo agradezco mucho
te admiro mucho y muchas gracias :D
Caral
29-09-2011, 21:00:15
Hola
Ya puedes subir adjuntos.
Quitale el exe al programa, ponlo en un zip con la base de datos y le doy una revisada, si te parece.
Saludos
Darkseratul
29-09-2011, 21:11:09
Hola
Ya puedes subir adjuntos.
Quitale el exe al programa, ponlo en un zip con la base de datos y le doy una revisada, si te parece.
Saludos
http://www.terawiki.clubdelphi.com/archivos//Archico%20redice%C3%B1o.zip?download=Archico+redice%F1o.zip
ya esta mi programa
en el login selecciona un usuario y la contraseña es 1
espero que me puedas ayudar y muchas pero muchas gracias
Caral
29-09-2011, 21:14:16
Hola
Dame un momento y lo reviso.
Saludos
Caral
29-09-2011, 22:08:23
Hola
Que pena pero no encuentro el error.
Se salta el Like y hace como si fuera un =.
He probado con todo lo que se me ocurre y nada, he quitado, puesto, cambiado, usado Quotedtr, todo......
No se, me extraña mucho.
He revisado la BD y todo esta bien, no lo entiendo.
Lo siento.
Saludos
PD: Seria muy bueno que cuando empezáis no usarais todos esos componentes para la apariencia, es engorroso tener que ir quitan dolos para correr el programa.
Solo como sugerencia.
Darkseratul
29-09-2011, 22:25:05
Hola
Que pena pero no encuentro el error.
Se salta el Like y hace como si fuera un =.
He probado con todo lo que se me ocurre y nada, he quitado, puesto, cambiado, usado Quotedtr, todo......
No se, me extraña mucho.
He revisado la BD y todo esta bien, no lo entiendo.
Lo siento.
Saludos
PD: Seria muy bueno que cuando empezáis no usarais todos esos componentes para la apariencia, es engorroso tener que ir quitan dolos para correr el programa.
Solo como sugerencia.
:( mi problema no tiene arreglo que mal
se que ya has hecho mucho, y sin querer abusar de tu confianza no hay otra forma que se te ocurra ??? para lograr el objetivo
objetivo: hacer una búsqueda en una tabla con varios campos poder elegir el campo para la búsqueda
no se te ocurre algo que pueda hacer ???:o
oscarac
29-09-2011, 22:26:05
que raro no puedo bajar el archivo
Darkseratul
29-09-2011, 22:32:34
que raro no puedo bajar el archivo
hola que tal si esta raro creo que movieron el archivo o quisas el servidor tiene problemas
pero ya lo subí a un servidor
http://www.megaupload.com/?d=UIV9DR7O
muchas gracias por tu interés ;)
Caral
29-09-2011, 22:39:23
Hola
Mira este codigo:
procedure TFBuscaCliente.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
ATClientes.Filtered := False;
If CBFiltro.Text = 'Código' then Filtro := 'CodCliente Like '+Edit1.Text
else If CBFiltro.Text = 'Nombre' then Filtro := 'NombreCliente Like '''+ Edit1.Text + '*'''
else If CBFiltro.Text = 'Teléfono' then Filtro := 'Telefono Like '''+ Edit1.Text + '*''';
ATClientes.Filter := Filtro;
ATClientes.Filtered := True
end
else ATClientes.Filtered := False;
end;
Es lo mismo que quieres hacer tu.
Lo he usado siempre y nunca me ha dado ningun problema.
Como Te imagiraras CodCliente es Numerico y me filtra sin problemas.
CBFiltro es un combobox que me elige las opciones.
Trata de ver que se te ocurre, estoy seguro que tarde o temprano sale esto.
Saludos
Darkseratul
29-09-2011, 22:50:35
Hola
Mira este codigo:
procedure TFBuscaCliente.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
ATClientes.Filtered := False;
If CBFiltro.Text = 'Código' then Filtro := 'CodCliente Like '+Edit1.Text
else If CBFiltro.Text = 'Nombre' then Filtro := 'NombreCliente Like '''+ Edit1.Text + '*'''
else If CBFiltro.Text = 'Teléfono' then Filtro := 'Telefono Like '''+ Edit1.Text + '*''';
ATClientes.Filter := Filtro;
ATClientes.Filtered := True
end
else ATClientes.Filtered := False;
end;
Es lo mismo que quieres hacer tu.
Lo he usado siempre y nunca me ha dado ningun problema.
Como Te imagiraras CodCliente es Numerico y me filtra sin problemas.
CBFiltro es un combobox que me elige las opciones.
Trata de ver que se te ocurre, estoy seguro que tarde o temprano sale esto.
Saludos
muchas gracias voy a checarlo y incorporarlo a mi proyecto a ver si me funciona
Muchas gracias maestro :D
http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash4/s320x320/307876_2268846653738_1625743672_2380925_124946066_n.jpg
Caral
29-09-2011, 22:54:12
Hola
Estoy convencido que algo tiene que ver la conexion con la tabla en el adotable, no veo otra razon.
Mas tarde si tengo tiempo voy a usar tu BD y hacer algo similar a ver donde esta el problema.
Esto no tiene sentido, tiene que haber una explicacion logica.
Saludos
PD: oscarac tiene muy buenas ideas, esperemos a ver que dice.
oscarac
29-09-2011, 22:55:09
exactamente cual es el problema?
Caral
29-09-2011, 22:56:12
Hola
Que no sabemos amigo, que no sabemos :D:D:D
Saludos
Darkseratul
29-09-2011, 22:59:01
Hola
Estoy convencido que algo tiene que ver la conexion con la tabla en el adotable, no veo otra razon.
Mas tarde si tengo tiempo voy a usar tu BD y hacer algo similar a ver donde esta el problema.
Esto no tiene sentido, tiene que haber una explicacion logica.
Saludos
PD: oscarac tiene muy buenas ideas, esperemos a ver que dice.
Muchas gracias por tu tiempo estoy tratando de incorporar el método que me diste voy a ver que tal :D
Darkseratul
29-09-2011, 23:01:34
Hola
Que no sabemos amigo, que no sabemos :D:D:D
Saludos
no entiendo muy bien cuando leo los libros y la documentación :(
gracias a ustedes cada ves entiendo mejor :)
oscarac
29-09-2011, 23:03:24
jajajaja no pues caral
segun veo yo el meollo del asunto esta en el edit y los filtros
mas facil seria (y sigo diciendo creo yo) utilizar otro tipo de artificio
es mis epocas de programar en Fox 2.5 diseñe una rutina muy buena de busqueda, la cual he implementado en delphi tambien
la idea es la siguiente
una Tabla
una grilla
un edit
lo que escribo en el edit, debe buscarlo en la tabla
siempre he sido enemigo de los sistemas que preguntan el criterio de busqueda (quiere buscar opr codigo? quiere buscar por descripcion? quiere buscar por numero de cedula?, quiere buscar por tipo de sangre?, etc)
entonces se me ocurrio lo siguiente
procedure TfrmCatalogoTrabajador.edtSearchChange(Sender: TObject);
var _Position :TBookmarkStr;
begin
if qryTrabajadores.Locate('KOD', edtSearch.Text, [loPartialKey]) then
Begin
_position := qryTrabajadores.Bookmark;
qryTrabajadores.Sort := 'KOD';
qryTrabajadores.Bookmark := _position;
dbgTrabajadores.Show;
End;
if qryTrabajadores.Locate('otro', edtSearch.Text, [loPartialKey]) then
Begin
_position := qryTrabajadores.Bookmark;
qryTrabajadores.Sort := 'otro';
qryTrabajadores.Bookmark := _position;
dbgTrabajadores.Show;
End;
If qryTrabajadores.Locate('Descl', edtSearch.Text, [loPartialKey]) then
Begin
_position := qryTrabajadores.Bookmark;
qryTrabajadores.Sort := 'Descl';
qryTrabajadores.Bookmark := _position;
dbgTrabajadores.show;
End;
if edtSearch.text <> '' then
Begin
Panel4.Visible := True;
LblSearch.Caption := qryTrabajadoresDESCL.AsString;
End
else
Panel4.Visible := False;
end;
la logica es bastante sencilla (aunque falta mejorar), y añado, que es nua rutina solo de busqueda, no es para filtrar, soy enemigo de los filtros porque en tablas con pocos datos son rapidos, pero en tablas con miles de registros ya no lo son tanto
Caral
29-09-2011, 23:10:43
Hola
Lo que pasa es que cuando quieres ir filtrando poco a poco (por ejemplo los empezados con A), no conozco otra forma que no sea por filtros.
Saludos
Darkseratul
29-09-2011, 23:11:14
exactamente cual es el problema?
lo que pasa es que tengo un adoconection , adatable, y un datasourse
la tabla tienes tres campos yo tenia la idea de especificar en que campo si hiciera la búsqueda con unos checkbox
con este código
procedure TFClientes.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
datamodule1.tarchivo.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
datamodule1.tarchivo.Filter := 'Nombre Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else if CheckBox2.Checked then
begin
datamodule1.tarchivo.Filter := 'Numero Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else
datamodule1.tarchivo.Filtered := False;
end;
end;
como podrás darte cuenta todo depende de los checkbox
el error es cuando se usa el checkbox2, me dice caral que se salta el like y por eso no a parece nada en la busqueda
espero explicarme bien y bueno caral ya medio otro ejemplo lo estoy tratando
alguna idea ?????
tu rutina esta muy bien pero no entiendo nada del codigo que has puesto ????? :confused: disculpa me ignorante persona :confused:
oscarac
29-09-2011, 23:14:15
no es complicado
mas bien me corrijo
uso un query
una grilla
un edit
si te das cuenta, las instrucciones se repiten
if qryTrabajadores.Locate('KOD', edtSearch.Text, [loPartialKey]) then
Begin
_position := qryTrabajadores.Bookmark;
qryTrabajadores.Sort := 'KOD';
qryTrabajadores.Bookmark := _position;
dbgTrabajadores.Show;
End;
y dice.....
si lo que escribo edtSearch.Text esta en el campo KOD, entonces ubicame en el registro localizado
para que se ejecute tras cada letra digitada, coloco esa instruccion en el evento Onchange del edit
te doy otro consejito.... que lei el otro dia en este mismo foro
sal a la calle relajate unos 20 min. tomate un cafe... si tienes mujer.. metete un polvito, pon tu cabeza en otra cosa y regresa
Darkseratul
29-09-2011, 23:33:04
te doy otro consejito.... que lei el otro dia en este mismo foro
sal a la calle relajate unos 20 min. tomate un cafe... si tienes mujer.. metete un polvito, pon tu cabeza en otra cosa y regresa
lo se, lo se pero lo que pasa es que ya llevo una semana tratando yo solo de hacer que esto funcione y pues como ya me atore pues pido ayuda a los mejores
muchas gracias por su tiempo amigos
a Caral que es el maestro
oscarac me llevas por un sendero que para mi es oscuro (query) se que se configuran con secuencias SQL lamentablemente no se SQL y mi tirada es primero hacer algo sencillo para ir escalando tendre que a prender SQL mucho antes de lo que esperaba :o
pero bueno muchas gracias amigos
oscarac
29-09-2011, 23:41:44
bueno es la curva del aprendizaje
a mi tambien me costo algo de tiempo.. la ventaja es que yo ya venia programando en otros lenguajes y tenia las nociones y las ideas, pero con calma, otra cosa que te puedo decir viendo el ejemplo que pusiste
trata de utilizar al menos en la etapa de aprendizaje, los componentes que vienen con delphi, veo que estas usando Jedi, OJO no estoy diciendo que sea malo, solo que si queremos caminar primero debemos gatear espero se entienda
siempre trata de optimizar tu codigo, si tienes varios if trata de usar case, lee y sobre todo practica
Caral
29-09-2011, 23:46:42
Hola
Pregunto:
El campo Numero tiene que ser numerico ?, no puede ser texto ?.
Saludos
Darkseratul
29-09-2011, 23:52:10
siempre trata de optimizar tu codigo, si tienes varios if trata de usar case, lee y sobre todo practica
gracias por tus consejos :) uso los Jedi por que en otro foro me los recomendaron supuestamente son para novatos por que te aorran algunas lineas de codigo :D la verdad fue pura curiosidad
me podrias explicar eso de los case o darme un ejemplo corto :D
Darkseratul
29-09-2011, 23:58:03
Hola
Pregunto:
El campo Numero tiene que ser numerico ?, no puede ser texto ?.
Saludos
lo puse numérico por que van los registros por numero
puse tu ejemplo en practica
procedure TFClientes.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
datamodule1.tarchivo.Filtered := False;
If ComboBox1.Text = 'Nombre' then Filtro := 'Nombre Like '+Edit1.Text
else If ComboBox1.Text = 'Numero' then Filtro := 'Numero Like '''+ Edit1.Text + '*''';
datamodule1.tarchivo.Filter := Filtro;
datamodule1.tarchivo.Filtered := True
end
else datamodule1.tarchivo.Filtered := False;
end;
cuando lo pongo en nombre me da este error
argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros
y cuando le pongo en numero me dice
no se puede abrir filtro
de seguro estoy haciendo algo mal pero que sera ???
Caral
30-09-2011, 00:17:57
Hola
procedure TFClientes.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
datamodule1.tarchivo.Filtered := False;
If ComboBox1.Text = 'Numero' then Filtro := 'Numero Like '+Edit1.Text
else If ComboBox1.Text = 'Nombre' then Filtro := 'Nombre Like '''+ Edit1.Text + '*''';
datamodule1.tarchivo.Filter := Filtro;
datamodule1.tarchivo.Filtered := True
end
else datamodule1.tarchivo.Filtered := False;
end;
Saludos
Darkseratul
30-09-2011, 00:43:14
Hola
procedure TFClientes.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
datamodule1.tarchivo.Filtered := False;
If ComboBox1.Text = 'Numero' then Filtro := 'Numero Like '+Edit1.Text
else If ComboBox1.Text = 'Nombre' then Filtro := 'Nombre Like '''+ Edit1.Text + '*''';
datamodule1.tarchivo.Filter := Filtro;
datamodule1.tarchivo.Filtered := True
end
else datamodule1.tarchivo.Filtered := False;
end;
Saludos
Muchas gracias por responder invertir los los campos fue lo primero que pensé funciona pero me da el mismo resultado
que el código anterior
procedure TFClientes.Edit1Change(Sender: TObject);
begin
// Siempre se quita el filtro
datamodule1.tarchivo.Filtered := False;
// Hacer algo si hay texto
if (Edit1.Text <> '') then
begin
// Crear el filtro
if CheckBox1.Checked then
begin
datamodule1.tarchivo.Filter := 'Nombre Like ''' + Edit1.Text + '*''';
datamodule1.tarchivo.Filtered := True
end
else if CheckBox2.Checked then
begin
datamodule1.tarchivo.Filter := 'Numero Like '+ Edit1.Text;
datamodule1.tarchivo.Filtered := True
end
else
datamodule1.tarchivo.Filtered := False;
end;
end;
paso lo mismo es como me dijiste que se salta el Like creo que el error esta en la tabla en la base de datos :(
ecfisa
30-09-2011, 02:10:17
Hola Darkseratul.
Eso no puede pasar por que el el evento de onclick del chebox le digo que ponga en false los demas chebox
Como veo que que los CheckBox son excluyentes, te convendría usar un RadioGroup.
Uff!! realmente no sé si no me he perdido con tanto mensaje... :), pero creo que tu error es intentar usar LIKE con un campo numérico.
Un ejemplo usando RadioGroup:
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
with DataModule1.tarchivo do
begin
Filtered:= False;
case RadioGroup1.ItemIndex of
0: Filter:= 'Nombre Like ' + QuotedStr(Edit1.Text + '*');
1: Filter:= 'Numero >= ' + QuotedStr(Edit1.Text);
2: Filter:= 'OtroCampo Like ' + QuotedStr(Edit1.Text + '*');
...
end;
Filtered:= True;
end;
RadioGroup1.ItemIndex:= -1;
end;
Un saludo.
Caral
30-09-2011, 02:45:40
Hola
El codigo sirve, lo que pasa es que creo que no es lo que buscas, te explico:
Cuando haces una busqueda de un texto, el filtro se comporta como debe, va buscando letra por letra ya que son palabras y una palabra es un todo.
Cuando se busca por numero estos van progresivamente, osea:
0
1
2
3
etc.......
Si quieres buscar el numero 1234, tendrás que pasar por el 1233 antes ya que es el numero anterior.
NO puedes buscar un numero por su inicio, osea todos los que empiecen por 1, por lo menos no con este tipo de filtros.
Para hacer eso se necesitaría, me imagino, hacer una función que lo haga y pasar ese valor al filtro.
Espero que me entiendas.
Saludos
PD: El código de ecfisa filtra teniendo el cuenta si es mayor o igual, pero no sirve en este caso, por que tampoco filtrara solo los que empiecen por un numero determinado que es, creo, lo que buscas, no lo se.
ecfisa
30-09-2011, 03:21:01
El código de ecfisa filtra teniendo el cuenta si es mayor o igual, pero no sirve en este caso, por que tampoco filtrara solo los que empiecen por un numero determinado que es, creo, lo que buscas, no lo se.
Totalmente de acuerdo, si lo que desea es hacer una busqueda incremental sobre un campo numérico no funcionará. Sólo que tratándose de magnitudes me pareció lógico comparar por mayor o igual.
NO puedes buscar un numero por su inicio, osea todos los que empiecen por 1, por lo menos no con este tipo de filtros.
También de acuerdo, yo tampoco conozco que haya manera de hacelo.
Un saludo.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.