DbUseArea(.T.,"DBFCDX", "CADASTRO", "CADASTRO", .T.)
nFields := CADASTRO->( FCount() )
hRecords := { => }
DO WHILE ! CADASTRO->( Eof() )
hRecord := { => }
FOR nField := 1 TO nFields
hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
NEXT
hb_HSet( hRecords, hb_NtoS( RecNo() ), hRecord ) // like so, a hash of recno: hash of columns/values of this record
CADASTRO->( DbSkip() )
ENDDO
Imaginando que eu queira ordenar pelo campo NOME que está na tabela cadastro ou pelo campo CODIGO após popular a hash table ?
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
aOrdemN := { 1, 5, 3, 2, 4 }
aOrdemC := { "Y", "A", "X", "D", "B" }
aLines := Array(5, 2) // 5 elementos com 2 dimensões
FOR I:=1 TO Len( aLines )
aLines[i,1] := { "CODIGO" => hb_NtoS( aOrdemN[I]) }
aLines[i,2] := { "NOME" => aOrdemC[I] }
NEXT
aSort( aLines ,,, {|x,y| y[2]["NOME"] > x[2]["NOME"]} )
FOR EACH oElemento IN aLines
hwg_MsgInfo( oElemento[2]["NOME"] )
NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
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/
Tentei hb_HSort, mas não funcionou, não encontrei nenhum exemplo para o que eu preciso.
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
A impressão que tenho é que isso é um array de hash, e não um hash
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/
#define ELE_CODIGO 1
#define ELE_NOME 2
aOrdemN := { 1, 5, 3, 2, 4 }
aOrdemC := { "Y", "A", "X", "D", "B" }
aLines := Array( 5 )
FOR I:=1 TO Len( aLines )
aLines[ nCont ] := { hb_NtoS( aOrdemN[I]), aOrdemC[I] } }
NEXT
aSort( aLines ,,, {|x,y| y[ ELE_NOME ] > x[ ELE_NOME ] } )
FOR EACH oElemento IN aLines
hwg_MsgInfo( oElemento[ ELE_NOME ] )
NEXT
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/
aSort( aLines ,,, {|x,y| y[ "CODIGO" ] > x[ "CODIGO" ] } )
FOR EACH oElemento IN aLines
? oElemento["CODIGO"], oElemento["NOME"]
NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
O legal da hash table é que você só precisa saber o nome do elemento além de ficar mais "entendível" rs
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
FOR EACH oElemento IN aLines
? oElemento[ ELE_CODIGO ], oElemento[ ELE_NOME ]
NEXT
Diferença:
No primeiro é string, não dá pra saber se digitou errado, vai dar erro na execução.
No segundo é #define, se digitar errado, já dá erro na própria compilação.
E o fonte tá bem parecido.
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/
Aproveitando.....
Rolou um aparente bug do Harbour com Hash no grupo Harbour-users.
No reaproveitamento de variável hash, melhor atribuir NIL à variável e não apenas {}.
Pelo menos enquanto isso não for resolvido.
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/
Se for criar uma tabela temporária com hash usando os nomes dos campos a partir do dbf não poderá ser por #define, enfim, se tem erro é culpa do programador, kkkk, se vira pra consertar.
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
DbUseArea(.T., "DBFCDX", "CADASTRO", "CADASTRO", .T.)
nFields := CADASTRO->( FCount() )
aRegistros := {}
DO WHILE ! CADASTRO->( Eof() )
hRecord := { => }
FOR nField := 1 TO nFields
hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
NEXT
aAdd( aRegistros, hRecord )
CADASTRO->( DbSkip() )
ENDDO
FOR EACH oElemento IN aRegistros
? oElemento["CODIGO"], oElemento["NOME"]
NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
hTable := Hb_Hash()
aRegistros := {}
DO WHILE ! CADASTRO->( Eof())
hRecord := {=>}
FOR nField := 1 TO nFields
Hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
NEXT
aAdd( aRegistros, hRecord )
CADASTRO->( DbSkip() )
ENDDO
* Ordenando por CODIGO
aSort( aRegistros ,,, {|x,y,z| y[ "CODIGO" ] > x[ "CODIGO" ] } )
FOR EACH oElemento IN aRegistros
? oElemento["CODIGO"] + " " + oElemento["NOME"]
NEXT
?
* Ordenando por NOME
aSort( aRegistros ,,, {|x,y| y[ "NOME" ] > x[ "NOME" ] } )
FOR EACH oElemento IN aRegistros
? oElemento["CODIGO"] + " " + oElemento["NOME"]
NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
É isso que dá não ler meus posts kkkkk
A solução já está nos posts anteriores.
Anexos
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/