Page 1 of 1

Funciones en C para índices

PostPosted: Sat Dec 09, 2006 5:47 pm
by manuramos
Como se puede crear una función en C que se pueda utilizar para la creación de un índice. Lo he intentado incorporandola a Five.lib con TLIB pero nada de nada.

Alguna idea?

Gracias

PostPosted: Mon Dec 11, 2006 11:34 am
by Antonio Linares
Cómo es la función ? Que hace ?

Que error te ha dado ?

PostPosted: Wed Dec 13, 2006 10:31 am
by manuramos
Antonio, gracias por interesarte por mi problema.

Es una función para quitarle los accentos a las palabras: Ya lo colgué en otro post, pero iba detrás de una conversación sobre otro tema y como estás tan ocupado no lo habras podido leer.

Este es el código:

#include <winten.h>
#include <windows.h>
#include <clipapi.h>

LPSTR Mayusculas( LPSTR szText, WORD lSize )
{
int i = 0 ;
for( i=0; i < lSize; i++ )
{
if ( szText[i] >= 'a' && szText[i] <= 'z' )
szText[i] -= ( 'a' - 'A' ) ;
}
return( szText ) ;
}

LPSTR SinEspa( LPSTR szText, LPWORD pwLen )
{
WORD nDesde = 0 ;
WORD nHasta = *pwLen ;

while( szText[nDesde] == ' ' && nDesde < nHasta )
++nDesde ;

while( szText[nHasta-1] == ' ' && nHasta > nDesde ) // nHasta-1 PORQUE EMPIEZA POR 0
--nHasta ;

*pwLen = nHasta - nDesde ;

return szText+nDesde ;
}

CLIPPER TransDat( PARAMS ) // ( LPSTR cText, BOOL lMayusculas = .T.)
{
WORD hancho = _parclen( 1 ) ;
LPSTR cText = SinEspa( _parc( 1 ), &hancho ) ;
BOOL lMayus = IF( PCOUNT() == 1, TRUE, _parl(2) ) ;
LPSTR desde, hasta ;
int i,j,k ;

if( lMayus )
{
desde = "ÁÉÍÓÚÜáéíóúü-,." ; // Cuando lo quiero todo en Mayusculas, sustituyo el guión por un espacio
hasta = "AEIOUUAEIOUU " ; // Es necesario para reindexar los apellidos compuestos castellanos
k = 15 ;
}
else
{
desde = "ÁÉÍÓÚÜáéíóúü" ;
hasta = "AEIOUUaeiouu" ;
k = 12 ;
}

i = 0 ;
while( i < hancho )
{
for ( j=0; j < k; j++ )
{
if (cText[i] == desde[j])
{
cText[i] = hasta[j] ;
break ;
}
}
i++ ;
}
if ( lMayus )
_retclen( Mayusculas(cText, hancho), hancho ) ;
else
_retclen( cText, hancho ) ;
}


Funciona perfectamente, en cualquier parte del programa, salvo durante el reindexado (la función la metí en FIVE.LIB con TLIB) Me da el siguiente error:

"Error DBFNTX/1026 Error de anchura de datos"

Claro que no sé si es porque está mal programado o si es que FiveWin no admite funciones de terceros durante el reindexado.

Por otro lado, como veras, he tenido que rehacer las funciones ALLTRIM y UPPER porque no sé como utilizar las ya existentes en FW. La verdad es que tampoco he tenido mucho tiempo para experimentar.

Gracias.

PostPosted: Wed Dec 13, 2006 10:34 am
by manuramos
Una aclaración, verás que en la funcion TransDat() pone:

k = 15 ;

Donde debería poner:

k = 13 ;

Ahí no está el problema, sólo ha sido un problema de transcripción.

PostPosted: Wed Dec 13, 2006 1:16 pm
by Antonio Linares
Manu,

Es la primera vez que veo ese error. De hecho si buscas en google verás que no aparece nada al respecto.

Posiblemente Przemek, que es el master de los RDDs en Harbour sabría orientarte.

A mi me suena a que tal vez estás devolviendo un valor cuyo tamaño no coincide con el tamaño del campo que se indexa, puede ser eso ?

PostPosted: Wed Dec 13, 2006 1:18 pm
by Antonio Linares
Manu,

Prueba a indexar con la función modificada de esta forma a ver si el error persiste:
Code: Select all  Expand view
CLIPPER TransDat( PARAMS )
{
   _retc( _parc( 1 ) );
}

PostPosted: Wed Dec 13, 2006 6:05 pm
by manuramos
Antonio

Sustituyendo los _retclen por _retc( _parc( 1 ) ) como me sugeriste, va bien, se quitan los accentos, pero no hace ni el UPPER ni el ALLTRIM.

He intentado _retc( ctext ) y no reindexa, da el mismo error, aunque la función funciona, por ejemplo en un msgalert()

Es un buen comienzo.

PostPosted: Sat Dec 16, 2006 9:36 am
by manuramos
Me he dado cuenta que el único problema es cuando utilizo la función SinEspa() y hace algún TRIM. Por ejemplo, si le quita dos espacios o más, no admite la nueva longitud de cadena, aunque si admite la nueva longitud mas 1.

Será cuestión de utilizar la función sin el SinEspa(), aunque esa no era mi idea original. Pensé que algo así ya se te había planteado.

Gracias de todas formas por tu paciencia.