FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Indexar con @
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Indexar con @
Posted: Sat Jul 26, 2008 04:35 PM

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

Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Indexar con @
Posted: Sat Jul 26, 2008 04:44 PM

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)

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Indexar con @
Posted: Sat Jul 26, 2008 10:01 PM

Willi,

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

Rolando :D

Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Indexar con @
Posted: Sat Jul 26, 2008 11:25 PM

Perfecto,, a ver si me envias o publicasm lo que modificaste,,,
Gracias...
Salu2

:D

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Indexar con @
Posted: Sun Jul 27, 2008 12:25 AM

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

Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Indexar con @
Posted: Sun Jul 27, 2008 07:45 AM
Hola Rolando,

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

Cambia la clave:

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

por:

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


o bien:

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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Indexar con @
Posted: Sun Jul 27, 2008 10:08 PM

Genial,, ese detalle me haca falta,,,,
Salu2

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Indexar con @
Posted: Tue Jul 29, 2008 12:18 AM

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

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Indexar con @
Posted: Tue Jul 29, 2008 06:26 PM
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.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 364
Joined: Tue Oct 25, 2005 07:06 PM
Indexar con @
Posted: Tue Jul 29, 2008 07:18 PM

has probado con set softseek on?

Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Indexar con @
Posted: Tue Jul 29, 2008 09:01 PM
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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Indexar con @
Posted: Wed Jul 30, 2008 01:15 AM

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

Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Indexar con @
Posted: Wed Jul 30, 2008 01:25 PM
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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Indexar con @
Posted: Fri Aug 01, 2008 12:55 PM

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

Saludos



Angel, Valencia, Venezuela



xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Indexar con @
Posted: Mon Aug 04, 2008 05:38 AM

Y ademas si algún dia decides probar LetoDB, tampoco te funcionarian los indices con el alias de la tabla. Mejor usar Field.

Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/