FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para CA-Clipper Funciones en C para índices
Posts: 219
Joined: Mon Dec 26, 2005 07:25 PM
Funciones en C para índices
Posted: Sat Dec 09, 2006 05: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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Funciones en C para índices
Posted: 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
Posts: 219
Joined: Mon Dec 26, 2005 07:25 PM
Funciones en C para índices
Posted: 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
Posts: 219
Joined: Mon Dec 26, 2005 07:25 PM
Funciones en C para índices
Posted: 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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Funciones en C para índices
Posted: Wed Dec 13, 2006 01: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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Funciones en C para índices
Posted: Wed Dec 13, 2006 01:18 PM
Manu,

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

Antonio Linares
www.fivetechsoft.com
Posts: 219
Joined: Mon Dec 26, 2005 07:25 PM
Funciones en C para índices
Posted: Wed Dec 13, 2006 06: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
Posts: 219
Joined: Mon Dec 26, 2005 07:25 PM
Funciones en C para índices
Posted: Sat Dec 16, 2006 09: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

Continue the discussion