Ordenar en Castellano
Posted: Sat Jul 11, 2009 6: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):
Gracias
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 ) ;
}