Ir para conteúdo
  • Cadastre-se

dev botao

Como substituir o funcao hb_StrToUTF8()


Ver Solução Respondido por José M. S. Junior,
  • Este tópico foi criado há 886 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores
Postado
14 minutos atrás, Helio Beltrao Jr. disse:

Nao estou sabendo que passar esses parametros :NFE_ConfigGravarValor(eSessao, eChave, sValor).

o que e eSessao

o que e eChave

o que e sValor

Bom dia.

Se baseie nas configurações da lib: https://acbr.sourceforge.io/ACBrLib/ConfiguracoesdaBiblioteca16.html para saber os campos configuráveis

Veja por exemplo nessa documentação que temos a Seção ex: [NFe], a chave "FormaEmissao" e o campo onde define o código do tipo de emissão em alguns casos é uma string mesmo.

Então para gravar a configuração para esse campo ficaria assim:

NFE_ConfigGravarValor(NFe, FormaEmissao, 0)   

Com esse método você passa essa configuração para a lib, pode usar repetidamente para cada campo que precise configurar e ao final utiliza-se NFe_ConfigGravar para de fato gravar essas novas configurações no arquivo ACBrLib.ini

Para ler um valor das configurações é o mesmo conceito:

Comando:NFE_ConfigLerValor(NFe, FormaEmissao, sValor, esTamanho);

Nesse Caso sValor e esTamanho são variaveis que definem o tamanho para obter o retorno, vai obter a resposta nessas variáveis conforme pode ver no exemplo da classe em Harbour

na variável esTamanho voce recebe o tamanho do Buffer de resposta, se exceder o Buffer da variavel sValor que é uma string tamanho fixo, utiliza-se o método UltimoRetorno para obter a resposta completa. Funciona dessa forma para todos os métodos

 https://acbr.sourceforge.io/ACBrLib/NFE_UltimoRetorno.html

 

 

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Consultores
Postado

 

10 horas atrás, Helio Beltrao Jr. disse:

o que e eSessao

o que e eChave

o que e sValor

Boa noite Hélio,

Segue um link explicando a estrutura de um arquivo ini e esclarecendo suas dúvidas.

https://pt.wikipedia.org/wiki/INI_(formato_de_arquivo)#:~:text=O formato de arquivo INI,seções" e "propriedades".

Abaixo link da documentação da LIB sobre esse método.

https://acbr.sourceforge.io/ACBrLib/NFE_ConfigGravarValor.html

Para não ficar patinando no início é interessante que veja o curso indicado pelo José.

  • Curtir 1
  • Moderadores
Postado
47 minutos atrás, Helio Beltrao Jr. disse:

O que pode estar acontecendo que nao estar me dando o retorno e estar dando esses erros segue em anexo o arquivo de log.

Bom dia,

Aparentemente os parâmetros estão sendo passados errados, ou não  está utilizando a dll compatível com a implementação da classe (MT - MultThread ou ST - Single Thread)

25/05/22 09:46:02:128 - LIB_ConfigGravarValor(NFe, Senha, 1234)
25/05/22 09:46:02:142 -    SetRetorno(-3, Chave [%s] não existe na Sessão [%s] no arquivo de configuração)

Note que não está lendo o campo correto de cada parâmetro.

 

 

Sobre a consulta, verifique se está com as dlls de dependência da OpenSSL e LibXML2 junto da ACBrLib.NFe
25/05/22 09:46:07:867 -    SetRetorno(-10, WebService Consulta Status serviço:
- Inativo ou Inoperante tente novamente.
Erro ao ler informações do Certificado.
Provavelmente a senha está errada)

 

Dê uma olhada nesse tópico, creio que possa de ajudar na implementação com XHarbour.

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Moderadores
Postado

Bom dia Helio, 

O problema no seu caso parece estar nos métodos que tem retorno, notei que os métodos que não exige retorno já estão funcionando como ConfigGravarValor, CarregarINI, Imprimir... Esses métodos não esperam retorno.

Já o método ConsultarStatus espera um retorno. Note que todos métodos com retorno tem dois parâmetros finais: sResposta e esTamanho.

No parâmetro (sResposta) é uma variável String onde deve definir uma String de tamanho fixo,  255 caracteres em branco por exemplo, na resposta da lib essa variável será preenchida com o retorno nessa String, respeitando esse limite de caracteres. No Parâmetro esTamanho é uma variável Integer, no retorno da lib você vai receber o tamanho total da String de Retorno, nesse caso se esse valor for maior que 255 indica que precisa utilizar o método: UltimoRetorno que utiliza o mesmo conceito dessas duas variáveis para definir o tamanho total da resposta para conseguir obter todo o restante do retorno, pois pode conter um XML Completo na resposta...

https://acbr.sourceforge.io/ACBrLib/NFE_StatusServico.html

https://acbr.sourceforge.io/ACBrLib/NFE_UltimoRetorno.html

 

Se notar no classe exemplo do xharbour já está fazendo isso, mas é importante entender como funciona para que você possa identificar onde está o problema, verificar se está declarando essas variáveis corretamente, verificar se está recebendo o retorno nessas variáveis...

 

Sugiro que comece testando os métodos ConfigLerValor: https://acbr.sourceforge.io/ACBrLib/NFE_ConfigLerValor.html nesse método vai obter como retorno a configuração da lib para determinado campo.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado

Boa tarde, Jose M. S. Junior

Tambem acho que seja o retorno porque estou mando uns arquivos para poder ser analizado pela equipe e ver se tem condicoes pra me poder usar porque ja fiz varios teste e o retorno e o mesmo.

Esse e o inicio para carregar a DLL e inicializar e chamar alguns method:

hHandle := ''
hHandle := DllLoad(ACBrLIB)
IF EMPTY(hHandle)
        //oErr := ErrorNew()
        //oErr:Severity := ES_ERROR
        //oErr:Description := "Erro a carregar a dll [" + ACBrLIB + "]"
        atencao("Erro a carregar a dll [" + ACBrLIB + "]")
ELSE
        hResult := DllCall(hHandle, DLL_OSAPI, "NFE_Inicializar", eArqConfig, eChaveCrypt)
        IF hResult = -1
            atencao('<INICIALIZAR> Indica que houve falhas na inicialização da biblioteca.')
        ELSEIF hResult = -5
            atencao('<INICIALIZAR> Indica que não foi possível localizar o arquivo INI informado.')
        ELSEIF hResult = -6
            atencao('<INICIALIZAR> Indica que não foi possível encontrar o diretório do arquivo INI.')
        ENDIF
        CheckResult(hResult)
ENDIF
CarregarINI(eArqConfig)
CarregarEventoINI(eArqConfig)
ConfigLerValor('NFE','FormaEmissao') // estar dando erro porque tem a string e o inteiro (, @buffer, @bufferLen)
StatusServico() // nesse caso dar o retorno:

image.png.f595839c90798e56a27107467e034937.png 

E logo dar o o seguinte erro:

image.png.ca92cbc85e1952b84e496ea3af92207d.png

acbrlib_method.txt ACBrLibNFE-20220602.log ACBRLIB.INI

Atenciosamente,
Helio Beltrão Jr.
[email protected]
www.htisistemas.com

 

 

  • Moderadores
Postado

Boa tarde Helio,

De fato é algum problema na alocação do buffer de memória para que a lib possa escrever a resposta. Infelizmente não conheço de xHarbour para dizer exatamente o que pode ser, como versão ou algo do tipo. Mas apenas com o programa demo já era para funcionar...

Nos demos para Harbour na pasta do ACBr pode ver um exemplo completo de um método com retorno, no exemplo do SAT. Veja na função sat:CriarEnviarCFe(strIniVenda) essa função possui um retorno, note que o tratamento de resposta já está implementado no programa ACBrSat.prg. Experimente utilizar esse exemplo sem nenhuma modificação, veja se consegue obter o retorno. Pois o método ConfigLerValor tem o mesmo funcionamento, só muda os parâmetros, então funcionaria da mesma forma.

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado (editado)
7 minutos atrás, Daniel Simoes disse:

Se o seu Harbour não tem suporte a UTF8, configure a ACBrLib para usar ANSI

Bom dia, Daniel

E no ACBRLIB.INI e isso ? Se for ja estar CodificacaoResposta=1 e so nesse campo ?

Segue o meu arquivo ACBRLIB.INI

ACBRLIB.INI

Editado por Helio Beltrao Jr.

Atenciosamente,
Helio Beltrão Jr.
[email protected]
www.htisistemas.com

 

 

  • Moderadores
Postado
4 horas atrás, Helio Beltrao Jr. disse:

E no ACBRLIB.INI e isso ? Se for ja estar CodificacaoResposta=1 e so nesse campo ?

Correto, essa configuração é para obter respostas em ANSI. Mas acredito que o problema não seja esse e sim o buffer que está sendo alocado para a resposta, pois conforme já analisado nos logs o erro só ocorre com métodos que esperam um retorno. 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado

Boa noite, Jose

Nesse topico que tem no LEIA-ME da ACBRLIB tentei fazer de varias forma passando array e string mais nao deu certo, acho que nao entendi esse topico: https://acbr.sourceforge.io/ACBrLib/ComotrabalharcomStrings.html

A forma que eu passo o buffer e assim nao sei se estar correto segue o exemplo:

FUNCTION ConfigLerValor(eSessao, eChave)
        local hResult, buffer, bufferLen
        bufferLen := 255
        buffer := Space(bufferLen)
        hResult := DllCall(hHandle, DLL_OSAPI, "NFE_ConfigLerValor", eSessao, eChave, @buffer, @bufferLen)
        IF hResult = -1
                atencao('<ConfigLerValor> Error: -1 Indica que a biblioteca não foi inicializada.')
        ELSEIF hResult = -3
                atencao('<ConfigLerValor> Error: -3 Indica que houve erro ao ler a configuração informada.')
        ENDIF
        CheckResult(hResult)
        RETURN ProcessResult(buffer, bufferLen)

Atenciosamente,
Helio Beltrão Jr.
[email protected]
www.htisistemas.com

 

 

  • Membros Pro
Postado

Ola helio veja como faço em harbour :

METHOD CheckResult(hResult) CLASS ACBrNFe
   local buffer, bufferLen, oErr
   bufferLen:=STR_LEN
   buffer:=Space(bufferLen)
   oErr:=DllCall(::hHandle, DLL_OSAPI, "NFE_UltimoRetorno", @buffer, @bufferLen)
   if !Empty(oErr)
      buffer:=if(bufferlen>0,SubStr(buffer,1,bufferlen),'')
      return("ERRO:"+Alltrim(Str(oErr))+'-'+hb_UTF8ToStr(buffer))
   else
      if bufferLen > STR_LEN
         buffer:=Space(bufferLen)
         DllCall(::hHandle, DLL_OSAPI, "NFE_UltimoRetorno", @buffer, @bufferLen)
      endif
   endif
   buffer:=if(bufferlen>0,SubStr(buffer,1,bufferlen),'') 
   Return(buffer)   
   //
   METHOD ConfigGravarValor(eSessao, eChave, eValor) CLASS ACBrNFe
   local hResult
   hResult := DllCall(::hHandle, DLL_OSAPI, "NFE_ConfigGravarValor", hb_StrToUTF8(eSessao), hb_StrToUTF8(eChave), hb_StrToUTF8(eValor))
   ::CheckResult(hResult)
   Return nil
   //
   METHOD ConfigLer(eArqConfig) CLASS ACBrNFe
   local hResult    
   hResult := DllCall(::hHandle, DLL_OSAPI, "NFE_ConfigLer", hb_StrToUTF8(eArqConfig))
   ::CheckResult(hResult)
   Return nil       
   // 
   METHOD EnviarEvento(ALote) CLASS ACBrNFe
   local hResult, buffer, bufferLen
   bufferLen := STR_LEN
   buffer := Space(bufferLen)
   hResult := DllCall(::hHandle, DLL_OSAPI, "NFE_EnviarEvento", ALote, @buffer, @bufferLen)
   Return(::CheckResult(hResult))
   //
   // Exemplo de uso
   clib_CodificacaoResposta:=hHandleDllNfe:ConfigLerValor("Principal", "CodificacaoResposta") 
   if clib_CodificacaoResposta != "0"
      hHandleDllNfe:ConfigGravarValor("Principal", "CodificacaoResposta","0") // 0 = UTF8 (Padrão) 1 = ANSI
    endif

Troque  o UTF8 pelo ANSI

  • Curtir 1
  • 3 semanas depois ...
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.