Página 1 de 1

aScan em uma Hash Table

Enviado: 12 Abr 2017 11:02
por asimoes
Pessoal,

Como é que eu faço um aScan para localizar um determinado registro em uma Hash Table ?
Preciso localizar na hRecords um determinado registro que eu sei o nome do campo, usando aScan ou função equivalente

Código exemplo:

Código: Selecionar todos

        With Object ::cRecordSet := :Execute()
            nTotRec  := :RecordCount()
            nCampos  := :Fields():Count -1
            IF nTotRec = 0
                cErro:="A consulta não retornou registro(s)"
                Break
            ENDIF
            ::aLista := Array(nTotRec, nCampos)
            hRecords := { => }
            Do While ! :Eof
               hRecord := { => }
               For nField := 0 TO ( :Fields:Count ) - 1
                  hb_HSet( hRecord, :Fields( nField ):Name, :Fields( nField ):value ) // for each record, hrecord holds a hash of column name: column value
               Next                                                                                       // hrecord holds a hash of column name: column value
               hb_HSet( hRecords, LTrim( Str( :AbsolutePosition ) ), hRecord )                            // like so, a hash of recno: hash of columns/values of this record
               :MoveNext()
            ENDDO
         End With
RETURN hRecords

aScan em uma Hash Table

Enviado: 12 Abr 2017 12:32
por asimoes
Acabei fazendo uma função até ter uma solução melhor;

Código: Selecionar todos


IF hb_ScanHT( aListaOrg, "CODIGO", cOrgaoUsu ) > 0
   ...
ENDIF

FUNCTION hb_ScanHT( hTable, cCampo, cSearch )
LOCAL nPosicao := 0, oElemento
   hb_Default(@hTable, {=>} )
   hb_Default(@cCampo, "" )
   hb_Default(@cSearch, "" )
   ____cAuxSearch := cCampo
   FOR EACH oElemento IN hTable
      IF oElemento["&____cAuxSearch."] == cSearch
         nPosicao := oElemento:__EnumIndex()
         EXIT
      ENDIF
   NEXT
RETURN nPosicao

aScan em uma Hash Table

Enviado: 12 Abr 2017 14:33
por rossine
Olá Alexandre,

Veja se é esta função que você está precisando:

Código: Selecionar todos

n := hb_hPos( hTable, cSearch )

? n
T+

aScan em uma Hash Table

Enviado: 12 Abr 2017 19:16
por asimoes
Rossine,

Não funcionou a função hb_hPos

aScan em uma Hash Table

Enviado: 12 Abr 2017 19:25
por asimoes
O que eu quero é poder localizar em uma hash table uma determinada informação de um campo qualquer

Por exemplo quero pesquisar nesta ht pelo campo apto , eu sei que o acesso ao registro é assim ["1"]["APTO"] eu quero localizar o 104 na tabela.
A função que fiz logo acima localiza qq informação de qq campo, eu queria saber se o harbour tem isso pronto.

Código: Selecionar todos

{
  "1":
  {
    "APTO": "104",
    "SACADO": "ALEXANDRE JOAO SIMOES LUZ                         ",
    "ENDERECO": "RUA AJURATUBA,                ",
    "BAIRRO": " OS SANTOS     ",
    "CIDADE": "RIO DE JANEIRO      ",
    "UF": "RJ",
    "CEP": "20735050",
    "CPF": "00000000000",
    "ATIVO": true,
    "DATA": "20160809"
  }
}

aScan em uma Hash Table

Enviado: 02 Dez 2017 07:50
por asimoes
Respondendo a minha pergunta:

nPos := hb_HScan( hTable, {| nKey, cChave | cChave["APTO"] = "104"} )