Página 1 de 1
Variável hash não é automática?
Enviado: 10 Fev 2021 12:33
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.
Variável hash não é automática?
Enviado: 10 Fev 2021 12:39
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.
Variável hash não é automática?
Enviado: 10 Fev 2021 12:55
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.
Variável hash não é automática?
Enviado: 10 Fev 2021 13:04
por JoséQuintas
Alarme falso, agora dá erro em todos.
Variável hash não é automática?
Enviado: 10 Fev 2021 21:11
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 (2.52 KiB) Exibido 1957 vezes
Variável hash não é automática?
Enviado: 11 Fev 2021 06:33
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.
Variável hash não é automática?
Enviado: 12 Mai 2021 11:12
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
Variável hash não é automática?
Enviado: 12 Mai 2021 11:40
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.
Variável hash não é automática?
Enviado: 12 Mai 2021 13:31
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
Variável hash não é automática?
Enviado: 13 Mai 2021 00:40
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.
Variável hash não é automática?
Enviado: 13 Mai 2021 15:08
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