by tsales » Mon Dec 04, 2006 1:16 pm
Antonio
Los hash los estoy utilizando con FWH + xHarbour y son tremendamente prácticas como alternativa a los arrays y con las pruebas que hemos realizado son mucho más rápidas que la utilización de arrays por medio de ADD + ASCAN.
Adjunto un ejemplo del uso de HASH para acceder al registro de una Tabla utilizando HASH.
La utilizamos como alternativa a la TDATABASE con muchas menos opciones pero treméndamente más rápida.
=======================================
Function AddFields( lAppendBlank, lBloqueaReg, lDateVacio, oOwner )
LOCAL oDatos, n, uDatoVacio, cAlias := Select()
DEFAULT lAppendBlank:= .T.
DEFAULT lBloqueaReg := .F.
DEFAULT lDateVacio := .F.
DEFAULT oOwner:= oApWnd:oDlg
lBloqueaReg := IF(lAppendBlank,.F.,lBloqueaReg)
oDatos := HSetCaseMatch(Hash(),.F.)
HashAddMember( { "cAlias" },"C", ALIAS(Select()), oDatos )
HashAddMember( { "nRecno" },"N", (cAlias)->(RECNO()) , oDatos ) // Registro actual
HashAddMember( { "lAppendBlank" },"L", lAppendBlank, oDatos )
HashAddMember( { "lRecnoBloqueado" },"L", lBloqueaReg , oDatos )
HashAddMember( { "nRecnoBloqueado" },"N", IF(lBloqueaReg, (cAlias)->(RECNO()),0) , oDatos )
FOR n = 1 to (cAlias)->(FCOUNT())
IF lAppendBlank
IF ValType( (cAlias)->(FieldGet(n)) ) = 'N'
uDatoVacio := VAL( STR(0, Len( Str( (cAlias)->(FieldGet(n))))))
ELSEIF ValType( (cAlias)->(FieldGet(n) )) = 'C'
uDatoVacio := Space( Len( (cAlias)->(FieldGet(n) ) ) )
ELSEIF ValType( (cAlias)->(FieldGet(n) )) = 'L'
uDatoVacio := .F.
ELSEIF ValType( (cAlias)->(FieldGet(n) )) = 'D'
uDatoVacio := IF(lDateVacio, CTOD("//"), Date() )
ENDI
ENDIF
HashAddMember( { "OBJ" + (cAlias)->(FIELDNAME(n)) },"O",,oDatos )
HashAddMember( { "VAR" + (cAlias)->(FIELDNAME(n)) },;
IF(ValType( (cAlias)->(FieldGet(n)) )="C","S", ValType( (cAlias)->(FieldGet(n) ))),;
IF(!lAppendBlank, (cAlias)->(FIELDGET(n)) , uDatoVacio),oDatos )
NEXT n
HSetAutoAdd(oDatos,.f. )
IF lBloqueaReg
oDatos:lRecnobloqueado:= (cAlias)->(DBRLOCK( oDatos:nRecnoBloqueado ))
ENDI
RETURN oDatos
=======================================
Por otro lado preguntaba la posibilidad de usar estructuras para modificar estas funciones en caso de no poder disponer de los HASH pero con la clase TStruct creo que seria complicado para mi llegar a generar lo mismo.
Saludos
Toni Sales