Indexar con @

Indexar con @

Postby rolando » Sat Jul 26, 2008 4: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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Willi Quintana » Sat Jul 26, 2008 4: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)
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Postby rolando » Sat Jul 26, 2008 10:01 pm

Willi,

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

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Willi Quintana » Sat Jul 26, 2008 11:25 pm

:D Perfecto,, a ver si me envias o publicasm lo que modificaste,,,
Gracias...
Salu2
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Postby rolando » 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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Carlos Mora » Sun Jul 27, 2008 7: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:

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.
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby Willi Quintana » Sun Jul 27, 2008 10:08 pm

Genial,, ese detalle me haca falta,,,,
Salu2
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Postby rolando » 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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby antolin » Tue Jul 29, 2008 6: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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Postby QAZWSX2K » Tue Jul 29, 2008 7: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
User avatar
QAZWSX2K
 
Posts: 363
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas

Postby Carlos Mora » Tue Jul 29, 2008 9: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.
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby rolando » Wed Jul 30, 2008 1: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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Carlos Mora » Wed Jul 30, 2008 1: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.
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby ADBLANCO » 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
User avatar
ADBLANCO
 
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Postby Biel EA6DD » Mon Aug 04, 2008 5: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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 94 guests