Page 1 of 1
Equivalencias de __objAddData y __objSendMsg en Hash
Posted: 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
Posted: 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 _ mediante
METHOD InitFields() CLASS Ttable
AEVAL(::aFields,{|a,n| __objAddData( Self, a[1] , CTOEMPTY(NIL,a[2],a[3] ) ) })
Ahora _ me devuelve valores NIL
Re: Equivalencias de __objAddData y __objSendMsg en Hash
Posted: 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
Posted: Thu Mar 23, 2023 7:04 am
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....
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
Posted: Thu Mar 23, 2023 3:47 pm
by carlos vargas
Gracias, manuel, como siempre compartiendo gotas de saber.