Hash com Harbour ?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Ale SB
Usuário Nível 3
Usuário Nível 3
Mensagens: 201
Registrado em: 20 Jul 2004 17:30
Localização: Campo Grande / MS

Hash com Harbour ?

Mensagem por Ale SB »

Blz galera,

Olha eu tenho esta funçao aki q uso com xHb:

Código: Selecionar todos

local aVars 
//
aVars:=LoadDbf()
//
**********************
function LoadDbf()
**********************
LOCAL aVars  := {=>}
  LOCAL nField := FCount()
  LOCAL nX := 1
   FOR nX := 1 TO  nField
       aVars[FieldName(nX)] := FieldGet(nX)
   NEXT

Return aVars
Como poderia usar ela com Harbour ?
Pelo q eu fui informado o harbour nao aceita isto aki: LOCAL aVars := {=>}

Para xHb eu achei uma documentaçao e ate uns exemplos com hash, mas, para Harbour nao achei nada.

Alguem pode me dar uma Luz ?!

Valew ai galera.

@braços Ale
Imagemr]
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Hash com Harbour ?

Mensagem por Eolo »

Ale, o XH aceita, sim. Pra falar a verdade, nunca tinha visto isso e aí fui conferir: tem, sim. Olha um dos exemplos do help:

Código: Selecionar todos

// The example demonstrates how to create and populate hash values.

   PROCEDURE Main                      // literal hash
      LOCAL hHash := { "COM1" => 1, "COM2" => 2 }

      // object notation
      ? hHash:COM1                     // result: 1
* etc
Aliás, dá uma explicada aí como é que é esse treco?
Avatar do usuário
Ale SB
Usuário Nível 3
Usuário Nível 3
Mensagens: 201
Registrado em: 20 Jul 2004 17:30
Localização: Campo Grande / MS

Re: Hash com Harbour ?

Mensagem por Ale SB »

Eolo, blzinha...

Eu sei q o xHb aceita trabalhar com Hash desta forma ai, mas, minha duvida eh como trabalhar com Hash com o Harbour.

o Harbour nao aceita trabalhar com Hash igual no xHB, comprende minha duvida agora.

Vc pediu para eu explicar como funfa o Hash, certo ?

Veja bem, nao sou a pessoa mais indicada para falar dela, ainda to tentanto entender melhor seu funcionamento, tb keria uma Luz de algum q conheça bem o assunto, o poko q sei peguei informaçoes na Hash.txt do xHb ( pasta Doc).

Mas pelo jeito trabalhar com Hash para substituir o Array convecional deixa o acesso ao array mais rapido, nao kero falar muito para nao falar besteira, ate pq toda documentaçao ta em Ingles e meu Ingles eh um poko fraco, ainda estou em busca de mais informaçoes...ok.

@braços Ale
Imagemr]
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Hash com Harbour ?

Mensagem por Eolo »

Cara, desculpe. Não li corretamente a sua pergunta (Harbour x xHarbour).


Bão, fui dar uma olhada e parece que o HASH é um negócio simples e até bacana.

É similar a uma matriz de 2 colunas. A diferença é que, numa matriz 'comum', vc pega os valores de acordo com a sua posição. Já no HASH, a matriz é 'indexada': vc pega os valores da coluna 2 de acordo com a 'chave' da coluna 1. Restrições: o HASH só pode ter 2 colunas e a coluna 1 tem que ser caracter, data ou numérico.

Matriz comum
mat:= {}
aadd(mat,"dois",2)
aadd(mat,"três",3)
aadd(mat,"um",1)
? mat[1,2] -> 2

HASH
mat:= {=>}
mat:dois := 2
mat:tres := 3
mat:um := 1
? mat:dois -> 2

Então, se vc não sabe a posição de um elemento:
a) na matriz comum vc precisa usar o ASCAN (com code block).
b) com o HASH, basta dar o nome. Ele faz o 'ascan' por vc.


No seu exemplo, me parece que, ao invés de fazer por exemplo ARQUIVO->CAMPO1 (acesso ao disco), você primeiro constrói a matriz HASH e depois faz a consulta via MATRIZ:CAMPO1 (memória), o que é mais rápido e pode fazer diferença no processamento em rede.

Mas será que é só essa a vantagem?
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Hash com Harbour ?

Mensagem por Eolo »

(POST CORRIGIDO...)

Em tempo: eu guardo os valores dos campos em variáveis e, pra facilitar, montei a funçãozinha abaixo (que uso desde o Summer e me atende hoje no xHarbour).

Esta função faz algo parecido com o uso que vc fez do HASH: ela cria tantas variáveis quantos forem os campos do DBF aberto no momento (não importa qual), acrescentando um "V" no início dos nomes (sei que esta notação não está de acordo com o "tecnicamente recomendado", mas se for o caso é só alterar a função: pra campo DATA, acrescentar D; pra NUMÉRICO, N etc.).

Código: Selecionar todos

FUNCTION VAR
priv no,y,w,z
no=dbstruct()       // estrutura do DBF
for y=1 to len(no)
  z=no[y,1]         // nome do n-ésimo campo
  w="v"+z           // cria o nome da variável
  z=&z              // valor do n-ésimo campo
  &w=z              // joga o valor do campo na variável
next
Eu rodo a função acima na entrada da rotina de edição do DBF e aí trabalho com as variáveis. Na saída, eu reseto as variáveis com o seguinte:

Código: Selecionar todos

FUNCTION VAR2
priv no,y,w
no=dbstruct()        // estrutura do DBF
for y=1 to len(no)
  w="v"+no[y,1]     // nome da variável
  rele &w              // limpa a variável da memória
next
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Hash com Harbour ?

Mensagem por sygecom »

Interesante tbm. não conhecia, vou dar uma pesquisada tmb. sobre isso.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
pauloa1
Usuário Nível 3
Usuário Nível 3
Mensagens: 227
Registrado em: 25 Jun 2008 14:57
Localização: Augusto Pestana-RS

Hash com Harbour ?

Mensagem por pauloa1 »

Problemas na busca ou estou fazendo algo errado:

Quero localizar [PROCEVENTONFE002] no arquivo.
E não acha, apenas se eu colocar o [PROCEVENTONFE001].

aRet_acbr := Hb_ReadIni("c:\teste\sainfe000006.txt")
IF HHasKey( aRet_Acbr,"PROCEVENTONFE001" )

// retorna .t.
IF HHasKey( aRet_Acbr,"PROCEVENTONFE002" )
// retorna .f.

O segundo evento da carta de correção da nfe, não tem jeito dele achar.

Se for final 001 localiza e for final 002 não.

Paulo
Anexos
sainfe000006.txt
(3.7 KiB) Baixado 164 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Hash com Harbour ?

Mensagem por JoséQuintas »

Código: Selecionar todos


PROCEDURE Test

   LOCAL aRet

   SetMode(24,80)
   CLS

   aRet := hb_ReadIni( "sainfe.txt" )
   ? HHasKey( aRet, "PROCEVENTONFE001" )
   ? HHasKey( aRet, "PROCEVENTONFE002" )
   Inkey(0)

Retornou .T. nos dois
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
pauloa1
Usuário Nível 3
Usuário Nível 3
Mensagens: 227
Registrado em: 25 Jun 2008 14:57
Localização: Augusto Pestana-RS

Hash com Harbour ?

Mensagem por pauloa1 »

Olá José! Muito obrigado por testar!

Você fez o teste com o arquivo que anexei?

Vou ver o que estou fazendo de errado.

Paulo
vcatafesta
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 21 Fev 2015 00:22
Localização: Pimenta Bueno/RO
Contato:

Hash com Harbour ?

Mensagem por vcatafesta »

Olá pessoal,

Minha contribuição de hash em classe.

Código: Selecionar todos

#include "hbclass.ch"

CLASS THash
	EXPORTED:
		DATA xNil   INIT nil
		DATA Hash   INIT {=>}

	public:
		METHOD new CONSTRUCTOR
		DESTRUCTOR Destroy()
		METHOD Create()
      METHOD Value(xHash, xValue) SETGET
      METHOD Execute(xValue, nRow, nCol)
      METHOD Position(nPosition)
      MESSAGE SetValue method value
      MESSAGE GetValue method value
      MESSAGE add method value
ENDCLASS

METHOD New()
	::Hash := ::Create()
	return self

METHOD Destroy()
   self := nil
   return self

METHOD Create()
	LOCAL aHash := {=>}
   HSetAutoAdd( aHash, .T.)
	HSetCaseMatch( aHash, .F. )                 // desabilita o case-sensitive
	return aHash

METHOD value(xHash, xValue)
   if pcount() == 2
      ::Hash[xHash] := xValue
   endif
   return ::Hash[xHash]

METHOD execute(xValue, nRow, nCol)
   LOCAL bBlock := ::Hash[xValue]
   if pcount() == 1
      if HB_ISBLOCK( bBlock )
         eval( bBlock)
         return self
      endif
   endif
   if pCount() = 2
      hb_default(@nRow, 2)
      if HB_ISBLOCK( bBlock[nRow])
         eval( bBlock[nRow])
         return self
      endif
   endif
   if pCount() > 2
      hb_default(@nRow, 2)
      hb_default(@nCol, 1)
      if HB_ISBLOCK( bBlock[nRow, nCol])
         eval( bBlock[nRow, nCol])
         return self
      endif
   endif
   return self

METHOD position(nPosition, nPos)
   if pcount() == 1
      return hb_hPairAt( ::Hash, nPosition )
   endif
   hb_default(@nPos, 1)
   return hb_hPairAt(::Hash, nPosition)[nPos]

def THashNew()
	return( THash():New())
endef
Codigo para testes:

Código: Selecionar todos

function main
   LOCAL oh := THashNEw()
   oh:setvalue("COM1", {||Funcao2()})
   oh:setvalue("COM2", 'COM2')
   oh:add("COM3", 'COM3')
   altd()
   oh:execute('COM1')
   ? oh:getvalue('COM2')
   ? oh:getvalue('COM3')
   oh:setvalue("MULTI", {{||Funcao2()}, 1.01})

   oh:execute('MULTI',1)
   ? oh:getvalue('MULTI')[2]

   oh:SetValue(6.01, {"Layout Janela",        {||Funcao3() }})
   ? menu := oh:position(5)[1]
   ? oh:execute(6.01, 2)
   inkey(0)

function funcao2()
   alert("OK")
   return nil

function funcao3()
   alert("FUNCAO 3")
   return nil
Harbour, C, C++, Ruby, Python, Go, Delphi, Haskell, Html, PHP, mingw, gtwvg, multithread, dbfcdx, letodb
=================================================
Senhor, sem Ti, nada podemos fazer!
Responder