FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Equivalencias de __objAddData y __objSendMsg en Hash
Posts: 1276
Joined: Tue Dec 28, 2010 01:29 PM
Equivalencias de __objAddData y __objSendMsg en Hash
Posted: Fri Mar 17, 2023 02:45 PM

Saludos,

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

Gracias de antemano

FWH 25.12

Harbour/Hbmk2

Microsoft Visual C++

MySql 8.0

Antigravity

Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Equivalencias de __objAddData y __objSendMsg en Hash
Posted: Fri Mar 17, 2023 03:29 PM

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

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Equivalencias de __objAddData y __objSendMsg en Hash
Posted: Mon Mar 20, 2023 06:09 PM

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)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Equivalencias de __objAddData y __objSendMsg en Hash
Posted: Thu Mar 23, 2023 07:04 AM
Yo uso esto Carlos:
Code (fw): Select all Collapse
//------------------------------------------------------------------------------
// 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 (fw): Select all Collapse
/*
聽* 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
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Equivalencias de __objAddData y __objSendMsg en Hash
Posted: Thu Mar 23, 2023 03:47 PM

Gracias, manuel, como siempre compartiendo gotas de saber.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion