Page 1 of 1

Equivalencias de __objAddData y __objSendMsg en Hash

PostPosted: Fri Mar 17, 2023 2:45 pm
by Compuin
Saludos,

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

Gracias de antemano

Re: Equivalencias de __objAddData y __objSendMsg en Hash

PostPosted: Fri Mar 17, 2023 3:29 pm
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 los campos mediante

METHOD InitFields() CLASS Ttable

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

Ahora los campos me devuelve valores NIL

Re: Equivalencias de __objAddData y __objSendMsg en Hash

PostPosted: Mon Mar 20, 2023 6:09 pm
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?

Re: Equivalencias de __objAddData y __objSendMsg en Hash

PostPosted: Thu Mar 23, 2023 7:04 am
by xmanuel
Yo uso esto Carlos:

Code: Select all  Expand view

//------------------------------------------------------------------------------
// 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 view

/*
 * 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.

Re: Equivalencias de __objAddData y __objSendMsg en Hash

PostPosted: Thu Mar 23, 2023 3:47 pm
by carlos vargas
Gracias, manuel, como siempre compartiendo gotas de saber.