Joaquín ya está hecha.
Harbour es un mundo nuevo y más que traducir lo de Antonio es hacer algo completamente distinto
Pero he tenido un ratillo y para un colega como tú hay que hacerlo.
Te la documento un montón para que todo el mundo entienda como está hecha. (Antonio si ves algo corrigela ok?)
He intentado controlar todos los posibles errores como por ejemplo
1) Que el nuevo alias sea una cadena correcta
2) Que el nuevo alias no exista en otro area de trabajo
3) Que el numero del area de trabajo si se pasa que este abierto
Si se te ocurre algún control más me lo decis todos los que la vayais a usar ok?
/* -----------------------------------------------------------------------------
*
* Prototipo de la funcion en PRG: hb_setAlias( cNewAlias, nArea )
* Parametros:
* 1) cNewAlias: cadena con la nueva alias
* 2) nArea: numero del area de trabajo donde se quiere cambiar el alias, si no
* se pasa se asume que es en el area de trabajo actual.
* Devuelve: valor logico indicando si se consigio o no
*
* ----------------------------------------------------------------------------*/
#include "hbapi.h"
#include "hbapirdd.h"
HB_FUNC( HB_SETALIAS )
{
const char * szAlias = hb_parc( 1 ); // cAlias
unsigned int uiArea = hb_parnidef( 2, 0 ); // nArea
HB_BOOL bRet = HB_FALSE; // Valor logico devuelto
// Si se pasa el alias nuevo como cadena de texto y es valida...
if( szAlias && ( hb_rddVerifyAliasName( szAlias ) == HB_SUCCESS ) )
{
// Si no se pasa un numero de area de trabajo o 0 asume la actual si es
// de mayor 0 asume la pasada
AREAP pArea = uiArea > 0 ? hb_rddGetWorkAreaPointer( uiArea ) :
hb_rddGetCurrentWorkAreaPointer();
// Si esta abierta el area de trabajo realiza otras comprobaciones
if( pArea )
{
int iDummyArea;
// Comprueba si ya hay un area de trabajo con ese alias
if( hb_rddGetAliasNumber( szAlias, &iDummyArea ) != HB_SUCCESS )
{
// Libera el simbolo de alias anterior
hb_dynsymSetAreaHandle( ( PHB_DYNS ) pArea->atomAlias, 0 );
// Reserva memoria para asignar el nuevo alias
hb_dynsymSetAreaHandle( hb_dynsymGet( szAlias ), uiArea );
// Asigna en la estructura del area de trabajo el nuevo alias
( PHB_DYNS ) pArea->atomAlias = hb_dynsymGet( szAlias );
// Si logra realizar el cambio asigamos .t. al retorno
bRet = HB_TRUE;
}
}
}
// Devolvemos el valor logico correspondiente
hb_retl( bRet );
}
//------------------------------------------------------------------------------
Y aquí un ejemplo
procedure main()
// Abrimos la DBF test de samples 2 veces en areas diferentes
USE test ALIAS test1 NEW SHARED
USE test ALIAS test2 NEW SHARED
// Mostramos las ALIAS actuales
Alert( "Alias 1: " + Alias( 1 ) + ";Alias 2: " + Alias( 2 ) )
if hb_setAlias( "Nueva1", 1 )
Alert( "El nuevo Alias del area 1 ha sido cambiada" )
else
Alert( "No se ha podido cambiar el alias" )
endif
// Mostramos las ALIAS actuales
Alert( "Alias 1: " + Alias( 1 ) + ";Alias 2: " + Alias( 2 ) )
DBCloseAll() // Cierra todas las areas de trabajo
return
Espero que sea util a todos
