Funciones en C para índices

Post Reply
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Funciones en C para índices

Post 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
Nos Gusta Programar
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Cómo es la función ? Que hace ?

Que error te ha dado ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post 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 >= 'a' && szText <= 'z' )
szText -= ( '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 _
k = 15 ;
}
else
{
desde = "ÁÉÍÓÚÜáéíóúü" ;
hasta = "AEIOUUaeiouu" ;
k = 12 ;
}

i = 0 ;
while( i < hancho )
{
for ( j=0; j < k; j++ )
{
if (cText == desde[j])
{
cText = 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.
Nos Gusta Programar
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post 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.
Nos Gusta Programar
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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 ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Manu,

Prueba a indexar con la función modificada de esta forma a ver si el error persiste:

Code: Select all

CLIPPER TransDat( PARAMS )
{ 
   _retc( _parc( 1 ) );
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post 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.
Nos Gusta Programar
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post 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.
Nos Gusta Programar
Post Reply