Ordenar en Castellano

Post Reply
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Ordenar en Castellano

Post by antolin »

Hola Foreros,

Tengo un pequeño problema que no se como solucionar.

Resulta que he hecho una pequeña funcion en C++ (16 y 32 bits) para sustituir, en un string, las vocales accentuadas por las misma en mayusculas y sin accentos para poder usar en indices. Funciona muy bien, la incorporas a la LIB correspondioente (Five.LIB) con TLIB y la puedes llamar con INDEX ON .... pero tengo un inconveniente: Primero trimeo la cadena, despues sustiuyo las letras por el UPPER correspondiente (sin accento si era vocal acentuada) y con las variables va de lujo, pero con los indices me da error en la longitud de la cadena (he probado de todo), por lo que he tenido que añadir una variable "lIndx" para distinguir entre variable o indioces. Y así funciona, pero eso no es lo que yo quería, quería la cadena trimeada (sin espacios blancos por delante ni por detras) en mayusculas y sin accentos (Lo ideal para indices), ademas, puedo hacer "INDEX ON TransDat(APELLIDOS+NOMBRE,.T.) TO ..." pero no puedio hacer "INDEX ON TransDat(APELLIDOS)+TransDat(NOMBRE), .T.)", que es en realidad lo que deseo hacer.

¿Alguien me puede hachar un cable?

Este es el código (version 32 bits):

Code: Select all

HB_FUNC( TRANSDAT )      // ( cText, lIndx )  -->  CTEXT
   {
   LPSTR cText    = _parc( 1 )    ;
   WORD  nHancho  = _parclen( 1 ) ;

   WORD  nDesde,nHasta,i,j    ;
   LPSTR cBuffer          ;

   LPSTR cDesde = "ÁÉÍÓÚÜ-" ;
   LPSTR cHasta = "AEIOUU " ;

   for ( nDesde = 0; nDesde < nHancho-1; nDesde++ )         //  LeftTrim
       {
       if ( cText[nDesde] != ' ' )
      break ;
       }
   for ( nHasta = nHancho-1 ; nHasta > nDesde; nHasta--,nHancho-- ) //  RightTrim
       {
       if ( cText[nHasta] != ' ' )
      break ; 
       }

   if ( _parl( 2 ) )                            //  Sólo Para Indices
      cBuffer = cText ;
   else                                           // Para variables
      {
      nHancho -= nDesde ;
      cBuffer  = ( LPSTR ) _xgrab( nHancho - 1 ) ;
      }

   for ( i=0 ; nDesde <= nHasta; ++i, ++nDesde )
       {
       cBuffer[i] = cText[nDesde] ;
       AnsiUpper( &cBuffer[i])    ;
       for ( j=0; j < 7; ++j )
       {
       if ( cBuffer[i] == cDesde[j] )
          {
          cBuffer[i] = cHasta[j] ;
          break                  ;
          }
       }
       }

    for ( nDesde = i; nDesde < nHancho; ++nDesde )
        cBuffer[nDesde] = ' ' ;

   _retc( cBuffer )  ;
   _xfree( cBuffer ) ;
   }
 
Gracias
Peaaaaaso de foro...
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Re: Ordenar en Castellano

Post by Patricio Avalos Aguirre »

Hola

No se mucho de C, pero creo que sería mejor grabar en el campo el resultado final
y asi te evitarias colocar la funcion en el indice y ganarias mas performace

append blank
base->Campo := apellido + nombre
base->Campo2 := transdat(apellido) + transdat(nombre)

y crea ambos indices..

espero que te sirva..
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Ordenar en Castellano

Post by antolin »

No es mala idea, pero ocuparia el doble de espacio. Un campo para los nombres y apellidos normales, y otro para el tranformado.

Tiene que haber una solución. El fallo ha de estar en el tipo de dato, o algo así, pero no doy con la tecla.

Gracias de todas formas, como solución transitoria está muy bien.
Peaaaaaso de foro...
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: Ordenar en Castellano

Post by ADBLANCO »

PRUEBA CON

INDEX ON TransDat(_FIELD->APELLIDOS)+TransDat(_FIELD->NOMBRE), .T.)

NO SE, PUDIERA TRABAJAR

:oops:
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

Re: Ordenar en Castellano

Post by ADBLANCO »

"INDEX ON TransDat(APELLIDOS+NOMBRE,.T.) TO ..." pero no puedio hacer
"INDEX ON TransDat(APELLIDOS)+TransDat(NOMBRE), .T.)", que es en realidad lo que deseo hacer.



ES QUE LA FUNCION QUE DEFINISTES TIENE DOS PARÁMETROS, POR LO TANTO DEBE SER

INDEX ON TransDat(APELLIDOS,.T.)+TransDat(NOMBRE), .T.)
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Ordenar en Castellano

Post by antolin »

El segundo parametro lo puse justamente para poder utilizarlo con indices, pero con ese paramtero, si te fijas en el codigo, no puedo eliminar los espacios en blanco sobrantes como para las variables.
Peaaaaaso de foro...
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Ordenar en Castellano

Post by antolin »

A ver creo que me he explicado mal.

Mi consulta es para ver si alguien es capaz de decirme como puedo hacer que TRANSDAT funcione con los indices sin que me de error de longitud de datos y así eliminar el segundo parametro.

Tiene que ser por culpa del tipo de datos que devuelve la funcion, pero no consigo dar con la tecla. O la longitud del buffer _xgrab, algo me falta, pero no se lo que es.

Gracias
Peaaaaaso de foro...
Post Reply