Funciones en C para índices

Funciones en C para índices

Postby manuramos » Sat Dec 09, 2006 5:47 pm

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

Postby Antonio Linares » Mon Dec 11, 2006 11:34 am

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

Que error te ha dado ?
regards, saludos

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

Postby manuramos » Wed Dec 13, 2006 10:31 am

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

Postby manuramos » Wed Dec 13, 2006 10:34 am

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

Postby Antonio Linares » Wed Dec 13, 2006 1:16 pm

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: 42113
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Antonio Linares » Wed Dec 13, 2006 1:18 pm

Manu,

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

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

Postby manuramos » Wed Dec 13, 2006 6:05 pm

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)

Postby manuramos » Sat Dec 16, 2006 9:36 am

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


Return to FiveWin para CA-Clipper

Who is online

Users browsing this forum: No registered users and 10 guests