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
Funciones en C para índices
Funciones en C para índices
Nos Gusta Programar
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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.
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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 ?
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 ?
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Manu,
Prueba a indexar con la función modificada de esta forma a ver si el error persiste:
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 ) );
}
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.
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
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.
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