FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Cambiar alias de una dbf
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
Cambiar alias de una dbf
Posted: Sat Sep 27, 2014 05:48 PM

Hola,

Para asignar un alias a una dbf, se realiza en el comando use o función dbusearea. Pero, necesito cambiar el alias una vez ya está abierta la dbf.

USE productos NEW SHARE ALIAS "producto1"

Aquí me gustaría poder hacer algo como alias("MinuevoAlias") y que lo cambiara sin abrir ni cerrar la dbf.

¿Es posible esto en Harbour?

Un Saludo,

Joaquín Martínez
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Mon Sep 29, 2014 12:46 PM

Joaquín Antonio tenía una función que hacía eso.
De manera nativa no la hay, habría que hacerla en C.
Realmente es muy fácil de hacer.

Básicamente habría que recorrer el array de áreas para comprobar si existe y si no existe sustituir el workarea[ miArea ] = cNombreNuevo

Si Antonio no la encuentra (es muy vieja, hecha para clipper ) en cuanto tenga un poco de tiempo la hago y la cuelgo aquí.

______________________________________________________________________________

Sevilla - Andalucía
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Mon Sep 29, 2014 12:56 PM
Mira he encontrado la funcion de Antonio :-) para clipper solo habría que pasarla a Harbour:
Code (fw): Select all Collapse
//----------------------------------------------------------------------------//
// Cambia el nombre del cAliasAct por cAliasNew

CLIPPER SETALIAS()   // ( cAliasAct, cAliasNew )
{
   CLIPSYMBOL * pAliasOld = _Get_Sym( _parc( 1 ) );
   CLIPSYMBOL * pAliasNew = _Get_Sym( _parc( 2 ) );
   register int n = 0;

   pAliasNew->nArea = pAliasOld->nArea;
   pAliasOld->nArea = 0;

   while( n < 255 && _WorkAreas[ n ] &&
         ( _WorkAreas[ n ]->uiArea != pAliasNew->nArea ) )
      n++;

   if( n < 255 && _WorkAreas[ n ] )
      _WorkAreas[ n ]->atomAlias = pAliasNew;
}

//----------------------------------------------------------------------------//
______________________________________________________________________________

Sevilla - Andalucía
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Cambiar alias de una dbf
Posted: Mon Sep 29, 2014 01:54 PM
Code (fw): Select all Collapse
   LOCAL cAlias

   USE productos NEW SHARE ALIAS "producto1"

   cAlias := ALIAS()

   o

   Mira el comando: oClone() de FiveWin


Salu2


João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
Re: Cambiar alias de una dbf
Posted: Mon Sep 29, 2014 03:35 PM

Gracias Manu,

Tú has entendido lo que quería hacer.

¿Sabes convertir el código en C que has puesto de clipper a Harbour?

Un Saludo,

Joaquín Martínez
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Mon Sep 29, 2014 03:38 PM

Si Antonio no lo hace antes yo lo hago... :D
Te corre mucha prisa?

______________________________________________________________________________

Sevilla - Andalucía
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Tue Sep 30, 2014 02:59 PM
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?

Code (fw): Select all Collapse
/* -----------------------------------------------------------------------------
 *
 * 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

Code (fw): Select all Collapse
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 :-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Wed Oct 01, 2014 10:01 PM

Joaquín has probado la función?

Está hecha para harbour en sus últimas releases. No sé si va en xHarbour...

______________________________________________________________________________

Sevilla - Andalucía
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
Re: Cambiar alias de una dbf
Posted: Thu Oct 02, 2014 11:46 AM

Buenas Manuel,

Muchas gracias, pero estoy super saturado, no he tenido tiempo ni de probarla.

La voy a descargar y probar, y ya te digo algo.

Gracias,

Un Saludo,

Joaquín Martínez
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Cambiar alias de una dbf
Posted: Thu Oct 02, 2014 07:53 PM

OK ;-)

______________________________________________________________________________

Sevilla - Andalucía

Continue the discussion