Equivalencias de __objAddData y __objSendMsg en Hash

Post Reply
Compuin
Posts: 1214
Joined: Tue Dec 28, 2010 1:29 pm
Location: Quebec, Canada

Equivalencias de __objAddData y __objSendMsg en Hash

Post by Compuin »

Saludos,

Podrian ayudarme como reemplazar con equivalencias estos metodos a nivel de hash en harbour ?

Gracias de antemano
FWH 20.12
Hbmk2 32/64 Bits (Build 19.29.30133)
Microsoft Visual C 32 Bits
MySql 8.0.24 32/64 Bits
VS Code
User avatar
jnavas
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Equivalencias de __objAddData y __objSendMsg en Hash

Post by jnavas »

Saludos
Colega
También tengo la misma situación, asigno valores de forma dinámica, desde un cursor SQL bien sea TODBC o EAGLE creo _ mediante

METHOD InitFields() CLASS Ttable

AEVAL(::aFields,{|a,n| __objAddData( Self, a[1] , CTOEMPTY(NIL,a[2],a[3] ) ) })

Ahora _ me devuelve valores NIL
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Equivalencias de __objAddData y __objSendMsg en Hash

Post by carlos vargas »

Estimados, yo quise hacer esto con una clase sqlmix, pero el caso es que los datas que creaba por cada campo, se mantenian entre clases, dado que la creacion se hacia a nivel objeto por lo que el numero de campos se incrementaba por cada instancia del objeto table, lo han resuelto?
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
xmanuel
Posts: 763
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Contact:

Re: Equivalencias de __objAddData y __objSendMsg en Hash

Post by xmanuel »

Yo uso esto Carlos:

Code: Select all | Expand

//------------------------------------------------------------------------------
// Generador de clases dinamicas funciona como una metaclase.
// Con control de referencias.

static function myGenClass( cClsName, cSuperClsName )

    static s__aClassH := {}
    local n, __nClassH, __oDb

    if Hb_IsString( cClsName )
        cClsName := Upper( Alltrim( cClsName ) )
    else
        cClsName := "THDOTABLE" + Hb_NToS( Len( s__aClassH ) )
    endif

    if ( n := AScan( s__aClassH, { | aClass | aClass[ 1 ] == cClsName } ) ) == 0
        _HB_CLASS cClsName
        __oDb := HBClass():New( cClsName, cSuperClsName )
        __oDb:Create()
        __nClassH := __oDb:hClass
        AAdd( s__aClassH, { cClsName, __nClassH } )
    else
        __nClassH := s__aClassH[ n, 2 ]
    endif

return( __clsInst( __nClassH ) )

//------------------------------------------------------------------------------
 
Es una funcion que crea objetos controlando si ya existe previamente...

Realmente forma parte de este otro código que use en TDbf y en otros proyectos mios como HDO

Code: Select all | Expand

/*
 * Proyecto: hdo_general
 * Fichero: hdodynclass.prg
 * Descripción:  Gestión clases y datas dinamicas
 * Autor: Manu Exposito 2014-21
 * Fecha: 05/02/2021
 */
//------------------------------------------------------------------------------

#include "hdotable.ch"

//------------------------------------------------------------------------------
// Funcion de clase. Genera clases derivadas de THDOVTable

function THDOFTable( cClsName )
return myGenClass( cClsName, "THDOVTABLE" )

//------------------------------------------------------------------------------
// Meta-clase derivada de THDOTable especializada en crear DataFields

CLASS THDOVTable FROM THDOTable

    DATA lGenDataField INIT .t.     // Crea DataFields?

    METHOD genDataFields()
    METHOD genDataField( cName )

    METHOD load()                   // Sobrecribe load para creacion de DataFields
    MESSAGE open() METHOD load()

ENDCLASS

//------------------------------------------------------------------------------
// Metodo apertura/carga de datos de la tabla

METHOD load() CLASS THDOVTable

    local lRet := ::Super:Open()

    if lRet .and. ::lGenDataField
        ::genDataFields()
        ::lGenDataField := .f.
    endif

return( lRet )

//------------------------------------------------------------------------------
// Genera todas las DataFields de un objeto derivado de TMSTable especializada

procedure genDataFields() CLASS THDOVTable

    local cDataFieldName

    for each cDataFieldName in ::aColumnNames
        ::genDataField( cDataFieldName )
    next

return

//------------------------------------------------------------------------------
// Generador de DataField dinamicas

procedure genDataField( cName ) CLASS THDOVTable

    __clsAddMsg( ::ClassH, cName, { | self | ::bufferGet( cName ) }, HB_OO_MSG_INLINE )
    __clsAddMsg( ::ClassH, "_" + cName, { | self, Val | ::bufferPut( cName, Val ) }, HB_OO_MSG_INLINE )

return

//------------------------------------------------------------------------------
// Generador de clases dinamicas funciona como una metaclase.
// Con control de referencias.

static function myGenClass( cClsName, cSuperClsName )

    static s__aClassH := {}
    local n, __nClassH, __oDb

    if Hb_IsString( cClsName )
        cClsName := Upper( Alltrim( cClsName ) )
    else
        cClsName := "THDOTABLE" + Hb_NToS( Len( s__aClassH ) )
    endif

    if ( n := AScan( s__aClassH, { | aClass | aClass[ 1 ] == cClsName } ) ) == 0
        _HB_CLASS cClsName
        __oDb := HBClass():New( cClsName, cSuperClsName )
        __oDb:Create()
        __nClassH := __oDb:hClass
        AAdd( s__aClassH, { cClsName, __nClassH } )
    else
        __nClassH := s__aClassH[ n, 2 ]
    endif

return( __clsInst( __nClassH ) )

//------------------------------------------------------------------------------
 
Espero que te valga Carlos....

:D

Pero eso no creo que sea lo que piden ellos. Aún así se encontrará con ese problema.
______________________________________________________________________________
Sevilla - Andalucía
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Equivalencias de __objAddData y __objSendMsg en Hash

Post by carlos vargas »

Gracias, manuel, como siempre compartiendo gotas de saber.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Post Reply