Clipper On Line • Ver Tópico - Adicionando uma coluna nova em uma HashTable existente
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Adicionando uma coluna nova em uma HashTable existente

01 Mai 2020 13:40

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

Código:

   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

01 Mai 2020 14:19

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

01 Mai 2020 14:29

Foi o que pensei, basta adicionar o novo hash.

Código:
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

01 Mai 2020 14:46

Só pra efeito de curiosidade, pode servir em outra situação, funcionou assim:

Código:
   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

01 Mai 2020 18:59

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

01 Mai 2020 19:35

aEval foi a melhor de todas

Permite adicionar várias chaves

Código:
  aEval( hTable, { | e | e[ "TESTE3" ]  := .F., ;
                            e[ "TESTE4" ]  := .T., ;
                            e[ "MARCADO" ] := .F. } )
Postar uma resposta