FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ordenar en Castellano
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Ordenar en Castellano
Posted: Sat Jul 11, 2009 06:21 PM
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 (fw): Select all Collapse
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...

FWH 2007 - xHarbour - BCC55
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: Ordenar en Castellano
Posted: Mon Jul 13, 2009 01:46 PM

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
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Ordenar en Castellano
Posted: Mon Jul 13, 2009 05:57 PM

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...

FWH 2007 - xHarbour - BCC55
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: Ordenar en Castellano
Posted: Mon Jul 13, 2009 08:12 PM

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
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: Ordenar en Castellano
Posted: Mon Jul 13, 2009 09:30 PM

"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
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Ordenar en Castellano
Posted: Tue Jul 14, 2009 05:20 PM

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...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Ordenar en Castellano
Posted: Tue Jul 14, 2009 05:24 PM

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...

FWH 2007 - xHarbour - BCC55

Continue the discussion