Page 1 of 2

Indexar con @

PostPosted: Sat Jul 26, 2008 4:35 pm
by rolando
Buenas tardes,

Dentro la la DBF "CLIENTES", tengo un campo en el que se almacenan los email de los clientes (ej: rolo@yahoo.com.ar).

Indexo por ese campo y no dá error de índice, pero al hacer un seek con este índice, no encuentra nada.

Si a los emails guardados le saco la arroba (@), ahí si funciona normal.

¿Tiene solución?. Gracias.

Rolando

FW2.7 + xHarbour - índices CDX

PostPosted: Sat Jul 26, 2008 4:44 pm
by Willi Quintana
Hola,,, se me ocurre que indexes por partes... no lo probe,, es una ocurrencia rapida...
Salu2


_FIELDGET->email := "holahola@hola.com"
...
..
.
INDEX ON SUBSTR(email,1, AT("@") -1) + SUBSTR(email, AT("@") +1,50) TO XXXXX
...
..
.
REDEFINE GET oEmail VAR cEmail ......
...
..
.
cBusca := ALLTRMI(SUBSTR(cEmail,1, AT("@") -1) + SUBSTR(cEmail, AT("@") +,50) )
DBSEEK(cBUsca)

PostPosted: Sat Jul 26, 2008 10:01 pm
by rolando
Willi,

Muchas gracias por la idea. Retocando un poco la sintáxis funciona perfecto.

Rolando :D

PostPosted: Sat Jul 26, 2008 11:25 pm
by Willi Quintana
:D Perfecto,, a ver si me envias o publicasm lo que modificaste,,,
Gracias...
Salu2

PostPosted: Sun Jul 27, 2008 12:25 am
by rolando
Sólo un error en la sintáxis de la función AT:

INDEX ON substr(EMAIL,1,at("@",CLIENTES->EMAIL)-1) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1,50) TAG EMAIL TO CLIENTES

Poca cosa, la idea fue tuya. Gracias

Rolando :D

PostPosted: Sun Jul 27, 2008 7:45 am
by Carlos Mora
Hola Rolando,

perdon por la intromisión. Me permito hacerte una sugerencia que eventualmente nos ha traído dolores de cabeza.

Cambia la clave:

Code: Select all  Expand view
INDEX ON substr(EMAIL,1,at("@",CLIENTES->EMAIL)-1) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1,50) TAG EMAIL TO CLIENTES

por:

Code: Select all  Expand view
INDEX ON LEFT(EMAIL, at("@",CLIENTES->EMAIL)-1) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1) TAG EMAIL TO CLIENTES


o bien:

Code: Select all  Expand view
INDEX ON LEFT( LEFT(EMAIL, at("@",CLIENTES->EMAIL)-1) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1), 50 ) TAG EMAIL TO CLIENTES


LEFT es una funcion más rápida y sencilla que SUBSTR para la rtl, es un detalle muy fino pero no está de más. Lo otro, que es más importante, es crear siempre los índices de forma tal que la clave siempre tenga el mismo tamaño, sino te pueden aparecer errores de 'corruption detected' y te vas a volver loco tratando de encontrar el porque de la corrupción.
Clipper se lo tragaba sin problemas, pero en el trabajo teníamos un índice con unas claves tipo Alltrim(apellido)+alltrim(nombre), y cuando recompilamos con harbour empezó a aparecer el mensaje de 'corruption detected', aunque con clipper no había problemas.

mis 2 céntimos :)

Una pregunta: ¿Que rdd estás usando? Me parce extraño esto de la @, no debería traerte inconvenientes. En el trabajo voy a revisar para asegurarte, pero creo que tengo índices con @.

Carlos.

PostPosted: Sun Jul 27, 2008 10:08 pm
by Willi Quintana
Genial,, ese detalle me haca falta,,,,
Salu2

PostPosted: Tue Jul 29, 2008 12:18 am
by rolando
Carlos,

Gracias por responder.

En tu corrección hay un pequeño error,

INDEX ON LEFT(EMAIL, at("@",CLIENTES->EMAIL)-1) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1) TAG EMAIL TO CLIENTES

y debiera ser:

INDEX ON LEFT(EMAIL, at("@",CLIENTES->EMAIL)) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1) TAG EMAIL TO CLIENTES

Sin el -1 al usar left().

De todos modos no veo la diferencia porque el substr() se usa dentro de la misma línea para la segunda parte (luego de la @).

Respecto de tu pregunta sobre la RDD, uso índices CDX y por lo que pude comprobar, no permite indexado con caracteres "@".

Saludos.


Rolando :D

PostPosted: Tue Jul 29, 2008 6:26 pm
by antolin
Con respecto a indexaciones, lo que ocurre con @ ocurre en cierto modo con las letras acentuadas, por lo menos con CDX, y la "á" la pone detras de la "ú". ¿hay alguna solución para eso?

Gracias.

PostPosted: Tue Jul 29, 2008 7:18 pm
by QAZWSX2K
has probado con set softseek on?

PostPosted: Tue Jul 29, 2008 9:01 pm
by Carlos Mora
Rolando,

rolando wrote:INDEX ON LEFT(EMAIL, at("@",CLIENTES->EMAIL)) + substr(EMAIL,at("@",CLIENTES->EMAIL)+1) TAG EMAIL TO CLIENTES

Sin el -1 al usar left().

no hay ningún error en lo que te puse, y la inclusión del -1 se debe a que la expresión debe 'extirpar' la @ de la string.

at( '@' , 'abc@cde.xyz' ) => 4
Left( 'abc@cde.xyz', 4 ) => 'abc@' que obviamente no es lo que queremos
Left( 'abc@cde.xyz', 3 ) => 'abc' que es el resultado pretendido.

la expresión tal como tu la pusiste es inócua, no hace nada salvo perder tiempo, pongas en email lo que pongas, siempre te devuelve lo mismo.
Prueba a bajarte el xbscript de xharbour.org y haz pruebas con el procesador de comandos y podrás verificar la efectividad de una u otra versión.

rolando wrote:De todos modos no veo la diferencia porque el substr() se usa dentro de la misma línea para la segunda parte (luego de la @).

Aunque una función se use una vez, llamarla dos veces utiliza el doble de tiempo. Donde se puede quitar una y mejorarla con otra función que lo haga mejor, mejora el resultado total, se invoque o no SUBSTR a posteriori.
En particular, la funcion LEFT genera el resultado reusando la string pasada como argumento, a diferencia de SUBSTR que SIEMPRE crea una copia, y crear una copia de una string es una tarea relativamente lenta.

rolando wrote:Respecto de tu pregunta sobre la RDD, uso índices CDX y por lo que pude comprobar, no permite indexado con caracteres "@".


No estoy de acuerdo. He probado en varios de mis programas que usan indices y el rdd dbfcdx y he añadido registros con la @ en el campo, y los busca y encuentra perfectamente, y los ordena de manera correcta. Para mi DBFCDX sigue siendo inocente hasta que se demuestre lo contrario.

¿Podrias resumir un ejemplo para poder reproducir el fallo? Me imagino tal vez cortando un trozo del codigo y un pedazo de dbf con algunos registros donde se pueda comprobar el fallo se pueda ver de donde proviene el error.

Por las dudas... ¿no te esta fallando en una busqueda incremental o algo así? Tengo un browse que cuando tipeas letras automaticamente hace la busqueda alfabética de lo que has mecanizado, y digitando la @ con AltGr-2 falla, porque el keydown no muestra la @ como tecla, sino el numero 2. Tipeando la @ con Alt + 64 en el teclado numérico funciona perfecto.

Un saludo,

Carlos.

PostPosted: Wed Jul 30, 2008 1:15 am
by rolando
Carlos,

Tienes razón en todo lo que dices.

No entiendo porqué no funcionaba el índice con @.

Borré la rutina que había hecho y la rehice y, cosa e' mandinga, ahora si funciona. Obviamente fue un error mío pero como me había cansado de probarlo, hice todo de nuevo (la parte de búsqueda de emails) y ahora funciona.

Como dije en alguna oportunidad "serán las neuronas que se me están muriendo con los años".

Gracias.

Rolando :D

PostPosted: Wed Jul 30, 2008 1:25 pm
by Carlos Mora
Rolando,

rolando wrote:Como dije en alguna oportunidad "serán las neuronas que se me están muriendo con los años".


¡No jodas, que en eso nos debemos estar pareciendo! Yo creo que es (en mi caso) la falta de vacaciones y espero empezarlas pronto.

Un saludo,

Carlos.

PostPosted: Fri Aug 01, 2008 12:55 pm
by ADBLANCO
Yo por experiencia prefiero no utilizar el nombre de la tabla al generar indices, ya que te limita el uso de diferentes 'Alias', por lo que lo haríamos así:

INDEX ON LEFT(EMAIL, at("@",_FIELD->EMAIL)) + substr(EMAIL,at("@",_FIELD->EMAIL)+1) TAG EMAIL TO CLIENTES

PostPosted: Mon Aug 04, 2008 5:38 am
by Biel EA6DD
Y ademas si algún dia decides probar LetoDB, tampoco te funcionarian los indices con el alias de la tabla. Mejor usar Field.