Clipper On Line • Ver Tópico - Adicionando uma coluna nova em uma HashTable existente
Página 1 de 1

Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 13:40
por asimoes
Precisei disso essa semana, uma HT que é o retultset do banco e precisava adicionar uma coluna nova nessa HT, usando Hb_HMerge é possível fazer isto, o código abaixo é uma demonstração, para quem usa hashtable segue segue a dica


   hTable := {}
   
   FOR I:=1 TO 10
      hRecord := Nil
      hRecord := {=>}
      hRecord["TESTE1"] := I
      hRecord["TESTE2"] := STRZERO(I,2)
      aAdd( hTable, hRecord )
   NEXT
   
   hNewCol := {}
   
   FOR I:=1 TO Len( hTable )
      hRecord := {=>}
      hRecord["TESTE3"] := .F.
      aAdd( hNewCol, hRecord )
   NEXT
   
   FOR I:=1 TO Len( hTable )
      Hb_HMerge( hTable[i], hNewCol[i] )
   NEXT
   
   FOR EACH oElemento IN hTable
      ? oElemento["TESTE1"], oElemento["TESTE2"], oElemento["TESTE3"]
   NEXT


Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 14:19
por JoséQuintas
Pelo que entendi... não entendi.
Mas vou tentar entender....
Apenas o detalhe de que é um array com hash table chama atenção.

Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 14:29
por JoséQuintas
Foi o que pensei, basta adicionar o novo hash.

PROCEDURE Main

   LOCAL hTable := {}, I, oVar, hRecord

   FOR I := 1 TO 10
      hRecord := Nil
      hRecord := {=>}
      hRecord[ "TESTE1" ] := I
      hRecord[ "TESTE2" ] := STRZERO(I,2)
      aAdd( hTable, hRecord )
   NEXT

   FOR EACH oVar IN hTable
      oVar[ "TESTE3" ] := .F.  // aqui
   NEXT

   FOR EACH oVar IN hTable
      ? oVar[ "TESTE1" ], oVar[ "TESTE2" ], oVar[ "TESTE3" ]
   NEXT

   Inkey(0)
   RETURN


Mas fica a opção do merge, se quiser acrescentar tudo de uma vez, ou vários campos de uma vez.

Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 14:46
por JoséQuintas
Só pra efeito de curiosidade, pode servir em outra situação, funcionou assim:

   hTable := Array(10)
   FOR EACH oVar IN hTable
      oVar := {=>}
      oVar[ "TESTE1" ] := oVar:__EnumIndex
      oVar[ "TESTE2" ] := StrZero( oVar:__EnumIndex, 2 )
   NEXT
   AEval( hTable, { | e | e[ "TESTE3" ] := .F. } )
   FOR EACH oVar IN hTable
      ? oVar[ "TESTE1" ], oVar[ "TESTE2" ], oVar[ "TESTE3" ]
   NEXT
   Inkey(0)
   RETURN

Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 18:59
por asimoes
JoséQuintas escreveu:Apenas o detalhe de que é um array com hash table chama atenção.


Muito bom os seus exemplos, a questão de ser um array é poder usar aSort da forma que não é array aSort não funciona
Exemplo:
aSort( ::aValorClasse ,,, {|x,y| y["CLASSEVALOR"] > x["CLASSEVALOR"] } )

Adicionando uma coluna nova em uma HashTable existente

MensagemEnviado: 01 Mai 2020 19:35
por asimoes
aEval foi a melhor de todas

Permite adicionar várias chaves

  aEval( hTable, { | e | e[ "TESTE3" ]  := .F., ;
                            e[ "TESTE4" ]  := .T., ;
                            e[ "MARCADO" ] := .F. } )