Ir al contenido



Foto

[RESUELTO] Filtrar datos con caracteres especiales y Números


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 03 septiembre 2010 - 10:56

Pues eso cómo puedo filtrar datos que contengan caracteres especiales y números en tres campos de una tabla DBF, me explico, yo quiero mostrar en un DBGrid los Datos que tengan al menos un caracter especial, datos nulos o números en tres de sus campos por ejemplo:

0005555 /FERNANDO LEONOR
0006667 % RODRIGUEZ
MONT JUANA LA PELADORA
;M FRANCISCO


Como verán ese es un ejemplo del resultado que espero, los campos son código, nombre y apellido, en el caso de código debo filtrar los datos que contengan valores distintos a números, se comprende?.

Puede serpor consulta o por filtered. Uso Delphi7, ADO y BD DBF (FoxPro).

Saludos.


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.018 mensajes
  • LocationMéxico

Escrito 03 septiembre 2010 - 11:39

Yo creo que es más fácil hacerlo con delphi, con una sentencia SQL lo veo complicadon, aunque no se, puede que haya una función que haga eso.

Voy a hacer unas pruebas a ver que pex

Salud OS
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 03 septiembre 2010 - 12:08

Ah pues espero tus pruebas :), mientras he intentado lo siguiente, pero no me muestra nada:



sql
  1. SELECT CODE, LASTNAME, NAME, CDEPART, CODPOS FROM EMPLOYEE.DBF WHERE CODE LIKE "%[a-zA-Z,;:.-_¿?·$%]%"



Saludos.
  • 0

#4 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 03 septiembre 2010 - 12:51

Saludos.
Creo que lo que necesitas es filtrar por expresiones regulares. Nunca he utilizado base de datos DBF por lo que no estoy familiarizado con la sintaxis, pero en MySQL existe REGEXP el cual te permite especificar un patrón para una búsqueda compleja, sería cuestión de que investigues si tu motor cuenta con este tipo de busqueda.

En MySQL quedaría algo asi tu sentencia:


sql
  1. SELECT CODE, LASTNAME, NAME, CDEPART, CODPOS FROM EMPLOYEE
  2. WHERE CODE REGEXP "^[a-z][:.-_¿?·$%]";



Espero haberte dado una idea.  (y)

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.018 mensajes
  • LocationMéxico

Escrito 03 septiembre 2010 - 01:09

Saludos.
Creo que lo que necesitas es filtrar por expresiones regulares. Nunca he utilizado base de datos DBF por lo que no estoy familiarizado con la sintaxis, pero en MySQL existe REGEXP el cual te permite especificar un patrón para una búsqueda compleja, sería cuestión de que investigues si tu motor cuenta con este tipo de busqueda.

En MySQL quedaría algo asi tu sentencia:


sql
  1. SELECT CODE, LASTNAME, NAME, CDEPART, CODPOS FROM EMPLOYEE
  2. WHERE CODE REGEXP "^[a-z][:.-_¿?·$%]";



Espero haberte dado una idea.  (y)


Muy interesante y práctico, yo utilizo Firebird pero sólo hasta la versión 2.5 se cuenta con esta funcionalidad.

Si no se tiene, pues habrá que hacer algo como esto desde delphi (si tampoco se tiene una versión con Expresiones Regulares).



delphi
  1. function verificaCaracteres(const Str: string): bool;
  2. var
  3.   I: Integer;
  4. begin
  5.   result := false;
  6.   for I := 1 to length(Str) do
  7.   begin
  8.     if Str[i] in ['0'..'9',':','¿','?','$','%'] then  //Agregas tantos caracteres como desees filtrar
  9.     begin
  10.       result := true;
  11.       exit;
  12.     end;
  13.   end;
  14. end;
  15.  
  16. procedure TForm1.IBQuery1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  17. begin
  18.   accept :=  VerificaCaracteres(IBQuery1CODE.Text) or
  19.             VerificaCaracteres(IBQuery1NAME.Text) or
  20.             VerificaCaracteres(IBQuery1LASTNAME.Text);
  21. end;



Salud OS
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 05 septiembre 2010 - 11:13

Saludos.

En Oracle y MS SQL se puede utilizar las funciones InStr y CharIndex respectivamente.

También existe la función Position, mira a ver si alguna de esta tiene su equivalente para FoxPro.  Entiendo que con esto puedes resolver tu problema sin necesidad de utilizar Regular Expression.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 09:39

Gracias Rolphy, no encontré nada similar a InStr y CharIndex, pero sí tiene la función Position de la cual no encuentro info de uso, me podrías ayudar?

Saludos.
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 11:47

Yo creo que es más fácil hacerlo con delphi, con una sentencia SQL lo veo complicadon, aunque no se, puede que haya una función que haga eso.

Voy a hacer unas pruebas a ver que pex

Salud OS


Nada aún mi estimado??
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.018 mensajes
  • LocationMéxico

Escrito 06 septiembre 2010 - 11:50


Yo creo que es más fácil hacerlo con delphi, con una sentencia SQL lo veo complicadon, aunque no se, puede que haya una función que haga eso.

Voy a hacer unas pruebas a ver que pex

Salud OS


Nada aún mi estimado??


No mam.....nches :p

Salud OS
  • 0

#10 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 11:56

Saludos.

Position:

Returns the start position of the first string inside the second string, relative to the beginning of the outer
string. In the second form, an offset position may be supplied so that the function will ignore any matches
occuring before the offset position and return the first match following that.

POSITION( <string> IN <string> )
POSITION( <string>, <string> [, <offset-position>] )




sql
  1. SELECT rdb$relation_name
  2. FROM rdb$relations
  3. WHERE POSITION('RDB$' IN rdb$relation_name) = 1;


/* */
position ('be', 'To be or not to be', 10)
returns 17. The first occurrence of 'be' occurs within the offset and is ignored.


Extraído de ayuda de Firebird Release Note 2.1.3.

Espero pueda servirte!
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 12:22


No mam.....nches :p


No te molestes wey no lo había visto :D, pues sí me ha funcionado de perlas :p, ahora, tengo un inconveniente, como agrego los nulos?, como distingo un espacio al inicio y no en todo el string? :D

Saludos.
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.018 mensajes
  • LocationMéxico

Escrito 06 septiembre 2010 - 12:37

No te molestes wey no lo había visto :D, pues sí me ha funcionado de perlas :p, ahora, tengo un inconveniente, como agrego los nulos?, como distingo un espacio al inicio y no en todo el string? :D

Saludos.


:D :D :D

A ver si así te funciona, lo hago de memoria, no lo he probado.



delphi
  1. procedure TForm1.IBQuery1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   accept :=  VerificaCaracteres(IBQuery1CODE.Text) or
  4.             VerificaCaracteres(IBQuery1NAME.Text) or
  5.             VerificaCaracteres(IBQuery1LASTNAME.Text) or
  6.             Trim(IBQueryCODE.text) = '' or
  7.             Trim(IBQueryNAME.text) = '' or
  8.             Trim(IBQueryLASTNAME.text) = '';
  9. end;



Salud OS
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 12:54

Pos sí, sí funciona sólo hay que cerrarlas entre comillas :), gracias wey :D, doy como resuelto el tema.

Saludos.
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.018 mensajes
  • LocationMéxico

Escrito 06 septiembre 2010 - 01:00

Pos sí, sí funciona sólo hay que cerrarlas entre comillas :), gracias wey :D, doy como resuelto el tema.

Saludos.


Entre comillas ????  ^o|

Pues que bien que funcionó otra de mis acostumbradas chapuzas :D :D :D

Salud OS

  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 septiembre 2010 - 01:05

Ufff quise decir entre Paréntesis :D
  • 0