Variável hash não é automática?

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Variável hash não é automática?

Mensagem por JoséQuintas »

Estou testando usar, mas dá erro de bound array access.

Código: Selecionar todos

METHOD Init() CLASS IDESetup

   ::cFileName := Substr( hb_ProgName(), 1, Rat( "\", hb_ProgName() ) ) + "ide.json"
   IF File( ::cFileName )
      ::hSetup    := hb_JsonDecode( MemoRead( ::cFileName ) )
   ENDIF
   IF ! ValType( ::hSetup ) == "H"
      ::hbSetup := hb_Hash()
   ENDIF
   IF Empty( ::hSetup[ "editor" ] )
      IF Empty( HMG_GetFileAssociatedWithExtension( ".prg" ) )
         ::hSetup[ "editor" ] := GetSystemDir() + "\notepad.exe"
      ELSE
         ::hSetup[ "editor" ] := HMG_GetFileAssociatedWithExtension( ".prg" )
      ENDIF
   ENDIF
   IF Empty( ::hSetup[ "language" ] )
      ::hSetup[ "language" ] := "english." + iif( HMG_IsUnicode(), "uni", "ans" )
   ENDIF
   IF Empty( ::hSetup[ "build32" ] )
      ::hSetup[ "build32" ] := "1"
   ENDIF

   RETURN Self
Curiosamente não dá erro em todos.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Variável hash não é automática?

Mensagem por JoséQuintas »

Dá erro no build32, até achei que poderiam ser os números, mas só com build também dá erro.

Tô deixando passar alguma coisa?
É que se funciona pra editor e language.... esquisito não funcionar pra build/build32.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Variável hash não é automática?

Mensagem por JoséQuintas »

Zerei tudo e achei.

::hbSetup() não é o mesmo que ::hSetup().... rs

Mas como não tem checagem de método errado.... não deu pra ver.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Variável hash não é automática?

Mensagem por JoséQuintas »

Alarme falso, agora dá erro em todos.
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/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Variável hash não é automática?

Mensagem por asimoes »

Quintas

Você não usa ON ERROR, se chamar um método que não exista chama MetodoDesconhecido, TESTE é o nome do método chamado

Código: Selecionar todos

   ON ERROR MetodoDesconhecido()
   
   ENDCLASS

METHOD MetodoDesconhecido()

   oDialogWask:DialogWask("Método da classe ClPF com erro" + ;
                          Hb_Eol() + ;
                          Hb_Eol() + ;
                          __GetMessage(), "Erro", , "E")
                          
RETURN Self
2021-02-10 21_16_00-Erro.png
2021-02-10 21_16_00-Erro.png (2.52 KiB) Exibido 1955 vezes
►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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Variável hash não é automática?

Mensagem por JoséQuintas »

Nesse caso não se aplica, porque tem a ver com o hash array.

Mas encontrei.

hb_hSet(), hb_hGet(), hb_hHasKey()

E tem outro pra definir se vai ser automático ou não, deve ser pra ficar como mencionei.
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/
Avatar do usuário
Adson
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 05 Mar 2019 10:36
Localização: GOIANIA/GO

Variável hash não é automática?

Mensagem por Adson »

Me socorre aí, por favor. Tb estou tendo problemas com o retorno da função hb_jsonDecode

Tenho o seguinte código:

Código: Selecionar todos

METHOD TopVendas_CampanhaAtiva() CLASS TObjectPro

::cServico := "/v1/campanhas?cnpj=" + alltrim(::cnpj)
::cTipo    := 'GET'

::XmlSoapPost()

if ::cCode == 200
	if HHasKey(::aResultado,"campanha") .and. ::aResultado["campanha"] != NIL  // ao executar a função HHasKey() causa runtime error
	   ::cpf := alltrim(::aResultado["campanha"])                              // pois ValType(::aResultado) != "H"
	endif
	if HHasKey(::aResultado,"inicio") .and. ::aResultado["inicio"] != NIL
	   ::cpf := alltrim(::aResultado["inicio"])
	endif
	if HHasKey(::aResultado,"fim") .and. ::aResultado["fim"] != NIL
	   ::cpf := alltrim(::aResultado["fim"])
	endif
endif

Return

METHOD XmlSoapPost() CLASS TObjectPro
********************************************************************************
Local oServer, nPos := 0

oServer:=CreateObject( "MSXML2.ServerXMLHTTP")
oServer:Open( ::cTipo, alltrim(::cUrl)+::cServico , .f. )
oServer:setRequestHeader("Authorization", "Bearer " + alltrim(::token) )
oServer:SetRequestHeader("Content-Type" , "application/json" )
oServer:setRequestHeader("User-Agente"  , "Sistema" )
oServer:setRequestHeader("Versao"       , ::versao )

TRY
   oServer:Send(::cEnvio)
   oServer:WaitForResponse( 1000 )
CATCH
   ::cCode := 503
   nPos    := aScan( aCode, {|x| x[1] == ::cCode } )
   ::cMsg  := aCode[nPos,2]
   return
END

::cCode := oServer:status
nPos    := aScan( aCode, {|x| x[1] == ::cCode } )
::cMsg  := aCode[nPos,2]

hb_jsonDecode( oServer:ResponseText, @::aResultado )  // Em alguns casos, ::aResultado está retornando como Array e não como Hash e causa erro quando uso a função HHasKey()

Return
Nesse caso, como converter um ARRAY em HASH ?

Uso xHarbour 1.2.3 + Minigui
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Variável hash não é automática?

Mensagem por Itamar M. Lins Jr. »

Olá!
Não sei se é o seu caso. Mas um lembrete.
xHarbour does not support auto-add on access or reference operations and
passing hash array items by reference does not work (see passing array and
hash item by reference).
In xHarbour only passing array items by reference works but does not work
passing hash items by reference though it does not generate either
compile time or run time errors so the above code can be compiled and
executed but it shows:
abc klm xyz 123 456 789
abc [1] xyz 123 456 789
Tem diferença do Harbour para o xHarbour.

Código: Selecionar todos

It can be seen in code like:
      proc main
         local p1 := "A", p2 := "B", p3 := "C"
         ? p1, p2, p3
         p( { @p1, p2, @p3 } )
         ? p1, p2, p3

      proc p( aParams )
         local x1, x2, x3

         x1 := aParams[ 1 ]
         x2 := aParams[ 2 ]
         x3 := aParams[ 3 ]

         x1 := Lower( x1 ) + "1"
         x2 := Lower( x2 ) + "2"
         x3 := Lower( x3 ) + "3"

Harbour and Clipper shows:
      A B C
      a1 B c3
but xHarbour:
      A B C
      A B C
PASSING ARRAY AND HASH ITEMS BY REFERENCE

Código: Selecionar todos


Harbour supports passing array and hash items by reference, f.e.:
      proc main()
         local aVal := { "abc", "klm", "xyz" }, ;
               hVal := { "qwe"=>"123", "asd"=>"456", "zxc"=>"789" }
         ? aVal[1], aVal[2], aVal[3], hVal["qwe"], hVal["asd"], hVal["zxc"]
         p( @aVal[2], @hVal["asd"] )
         ? aVal[1], aVal[2], aVal[3], hVal["qwe"], hVal["asd"], hVal["zxc"]

      proc p( p1, p2 )
         p1 := '[1]'
         p2 := '[2]'

Compiled by Harbour above code shows:
      abc klm xyz 123 456 789
      abc [1] xyz 123 [2] 789

In xHarbour only passing array items by reference works but does not work
passing hash items by reference though it does not generate either
compile time or run time errors so the above code can be compiled and
executed but it shows:
      abc klm xyz 123 456 789
      abc [1] xyz 123 456 789

PASSING OBJECT VARIABLES BY REFERENCE

Both compilers support passing object variables by reference though this
functionality in xHarbour is limited to pure instance or class variables
only and does not work for SETGET methods. In Harbour it works correctly.
This code illustrates the problem:

      proc main()
         local oBrw := TBrowseNew()
         ? oBrw:autoLite
         oBrw:autoLite := !oBrw:autoLite
         ?? "=>", oBrw:autoLite
         p( @oBrw:autoLite )
         ?? "=>", oBrw:autoLite

      proc p( x )
         x := !x

Harbour prints:
      .T.=> .F.=> .T.
but xHarbour prints:
      .T.=> .F.=> .F.
without generating any compile or run time errors.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Adson
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 05 Mar 2019 10:36
Localização: GOIANIA/GO

Variável hash não é automática?

Mensagem por Adson »

Correção no código (mas não influencia no erro)

Código: Selecionar todos

METHOD TopVendas_CampanhaAtiva() CLASS TObjectPro

::cServico := "/v1/campanhas?cnpj=" + alltrim(::cnpj)
::cTipo    := 'GET'

::XmlSoapPost()

if ::cCode == 200
   //Na linha abaixo ocorre o erro: Error BASE/1123  Erro nos parâmetros: HHASKEY
	if HHasKey(::aResultado,"campanha") .and. ::aResultado["campanha"] != NIL  
	   ::campanha := alltrim(::aResultado["campanha"])
	endif
	if HHasKey(::aResultado,"inicio") .and. ::aResultado["inicio"] != NIL
	   ::inicio := alltrim(::aResultado["inicio"])
	endif
	if HHasKey(::aResultado,"fim") .and. ::aResultado["fim"] != NIL
	   ::fim := alltrim(::aResultado["fim"])
	endif
endif

Return
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Variável hash não é automática?

Mensagem por alxsts »

Olá!
Adson escreveu:hb_jsonDecode( oServer:ResponseText, @::aResultado )  // Em alguns casos, ::aResultado está retornando como Array e não como Hash e causa erro quando uso a função HHasKey()
Pode ter a ver com a informação do Itamar...
Tente dividir a instrução em duas (isto é um chute mas não custa tentar):

Código: Selecionar todos

LOCAL hJSON := { => }

   hb_jsonDecode( oServer:ResponseText, @hJSON )

   ::aResultado := hJSON
No Github do Pete Weg (Wiki com as funções do Harbour) tem uma nota importante sobre a função hb_jsonDecode:
hb_J_K

Pete edited this page on 29 May 2020 · 12 revisions

hb_jsonDecode(<cJSON>, <@xValue>, [<cdpID>] ) ➜ nLengthDecoded
decodes the <cJSON> encoded string and stores decoded values into the <xValue> variable (usually a hash array), which must be passed by reference. Returns the number of processed symbols.
Note: (2020/05/20: this entry is under reworking due to several mistakes! a revision is coming soon..)

hb_jsonEncode(<xValue>, [<lHuman> | <nIndent>], [<cDestCP>] ) ➜ cJSONString
encodes <xValue> to JSON format. <lHuman> if set to .T., makes the output string more human-readable, (default is .F.). Alternatively, if numeric <nIndent> is used then a value greater than zero defines number of spaces used for indenting, 0 (zero ) disables indenting and -1 means TAB (ASCII:9). Code-blocks are stored as "null", object as arrays (methods are not recorded).

For a quite good usage example of this function,
see this post in harbour-users group.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Adson
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 05 Mar 2019 10:36
Localização: GOIANIA/GO

Variável hash não é automática?

Mensagem por Adson »

Boa tarde, amigos!

Problema resolvido! Estava entre o teclado e a cadeira rs...

Código: Selecionar todos

...

if ::cCode == 200

   if HHasKey(::aResultado,"campanha")  // Nesse caso, como se trata de um array, faltou o índice (puts ! envelhecendo e aprendendo)

   o correto é if HHasKey(::aResultado[x],"campanha") ...
      
   endif

...
Agradeço imensamente pela ajuda de todos
Responder