SAT-Fiscal a mistica está desvendada.

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Verifique a existencia de uma SAT.DLL na pasta de seu sistema e retire-a. Faça a chamada somente a SAT.DLL que estiver na pasta C:\SAT.

Baixe a ultima versão do emulador e copia as .DLLs(SAT e SAT_Equip) para C:\SAT e continue a trabalhar.

Mostre o seu código completo do tratamento com o SAT.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Diego Papale
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 11 Mar 2016 09:21
Localização: Marília/SP

SAT-Fiscal a mistica está desvendada.

Mensagem por Diego Papale »

Boa tarde,

Retirei as dlls como pedido e não obtive sucesso... refiz as minhas rotinas pra simplificar, pois o código do meu sistema é muito extenso e contém várias classes... o erro de travamento na segunda tentativa de chamada das funções permanece.

Obs.: a função abaixo que define o número randômico eu fiz controlando por banco de dados e retorna corretamente o número tanto que funciona sempre na primeira vez, você pode substituir pela função citada aqui no fórum que não tem diferença nos resultados... eu controlo por banco de dados porque como já dito, este número não pode se repetir nas últimas 100 tentativas e além disso preciso fazer o controle por SAT, pois existem clientes que possuem mais de um.

Código: Selecionar todos

#include "Fivewin.ch"
#include "\sis\fsql901\include\tip.ch"

STATIC hLib

* ===================================================================  
CLASS SAT
* ===================================================================  
  
  METHOD New() CONSTRUCTOR

ENDCLASS 

* ===================================================================  
METHOD New() CLASS SAT
* ===================================================================  
  local nSerie := 123456789 // Número de série do equipamento
  local aRet   := {}
  local cRet
  
  hLib := LoadLibrary("C:\SAT\SAT.dll")
  
  TRY
  
  errorsys()
  
  cRet := SATCONSULTAR( RandomSAT( nSerie ) )
  
  if !Empty(cRet)
  
     aRet := HB_ATOKENS(cRet, [|])
     
     If aRet[2] == '08000' // Sat em operação
        Msg(Alltrim(aRet[3]))
     else
        break
     endif
  else
     break
  endif
  
  CATCH
     Msg("SAT não está em operação.")
  END
  
  FreeLibrary(hLib)
    
Return Self

* ========================================================================
Function RandomSAT( nSerie )
* ========================================================================
  local nRandom  := HB_RandomInt(0, 899999) // este valor acrescido 100 mil nunca vai passar de 999999
  local aRet     := array(2)
  
  /* Abre arquivo que será utilizado para conferir a sessão */
  sessao_sat():fast()
  sessao_sat():Exec("SELECT * FROM sessao_sat WHERE numserie = " + Alltrim(str(nSerie)))
  
  do WHILE .T.
  
     nRandom += 100000 // sempre adiciono 100 mil porque precisa ter 6 digitos e
                       // se gerar um numero menor que 100 mil terá zeros a esquerda
                       // e no momento de eu passar p/ SAT vai desconsiderar e ficar errado
                       // não tem como jogar com strzero porque ficaria com menos de 6 dig. 
      
     if sessao_sat():reccount() > 0
                      
        if sessao_sat():Exec("SELECT numsessao FROM sessao_sat WHERE numsessao = " + clip2sql(nRandom) + " AND " +;
           "numserie=" + Alltrim(str(nSerie)))

           nRandom := HB_RandomInt(0, 899999) // zera variável quando tem um número igual
        else
        
           // retorna o menor código e o total de regitros
           aRet := Retsql("SELECT COUNT(*), MIN(recno_) FROM sessao_sat WHERE numsessao=" + Alltrim(str(nSerie)), 2)
           if aRet[1] >= 100
              Query("DELETE FROM sessao_sat WHERE recno_ = " + Alltrim(str(aRet[2])))   // exclui código mais antigo
           endif
           
           Query("INSERT INTO sessao_sat(numsessao, numserie) VALUES("+Alltrim(str(nRandom))+"," +;
                 Alltrim(str(nSerie)) + ")")                                            // adiciona novo código
           exit
        endif
     else
        // adiciona código inicial
        Query("INSERT INTO sessao_sat(numsessao, numserie) VALUES("+Alltrim(str(nRandom))+"," +;
              Alltrim(str(nSerie)) + ")")
        exit
     endif
     
  Enddo

RETURN nRandom

DLL32 FUNCTION SATConsultar( numeroSessao AS _INT ) AS STRING FROM "ConsultarSAT" LIB hLib
xHarbour 1.2.1 / Borland C++ Compiler 5.5 / MySQL
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Diego Papale
Mude a linha:

Código: Selecionar todos

DLL32 FUNCTION SATConsultar( numeroSessao AS _INT ) AS STRING FROM "ConsultarSAT" LIB hLib
Para:

Código: Selecionar todos

DLL32 FUNCTION SATConsultar( numeroSessao AS _INT ) AS STRING PASCAL FROM "ConsultarSAT" LIB hLib
No caso de xHarbour, muitos amigos se deram bem usando as funções CallDLL().

Verifique.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Diego Papale
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 11 Mar 2016 09:21
Localização: Marília/SP

SAT-Fiscal a mistica está desvendada.

Mensagem por Diego Papale »

Bom dia, já tinha utilizado o retorno STRING PASCAL e desta forma o sistema trava logo na primeira tentativa de chamada da função, porém no emulador o processo parece estar concluído, no painel do emulador mostra como se a consulta tivesse sido realizada com sucesso, utilizando somente STRING eu consigo o resultado satisfatório na primeira vez mas na segunda o sistema trava no retorno, mais uma vez lembrando no emulador parece estar ok... Com relação ao uso da função CallDll(), eu fiz na seguinte sintaxe:

Código: Selecionar todos

pFunc := GetProcAddress( hLib, "ConsultarSAT" )
  cRet  := CallDll( pFunc, nSessao )
... Onde o hLib foi carregado a dll da pasta c:\sat e o nSessao é um numero que não se repete com exatamente 6 dígitos, está correta essa sintaxe?

Obs.: Não funcionou desta forma, causa travamento e nem chega a dar sinal no emulador.

Obrigado!
xHarbour 1.2.1 / Borland C++ Compiler 5.5 / MySQL
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Puxa que transtorno né? Você já tentou desinstalar o JAVA e reinstalar novamente?

Quanto ao numero de sessão ter seis dígitos ele precisa mesmo ter 6 ou seja, 100000 ou maior, não serve 001234 mesmo que seja em string.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Diego Papale
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 11 Mar 2016 09:21
Localização: Marília/SP

SAT-Fiscal a mistica está desvendada.

Mensagem por Diego Papale »

Obrigado pelas respostas rochinha,

Já conferi diversas vezes a versão do java... tudo parece estar correto tanto que funciona na primeira chamada das minhas funções, talvez o problema seja somente no emulador.
xHarbour 1.2.1 / Borland C++ Compiler 5.5 / MySQL
Diego Papale
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 11 Mar 2016 09:21
Localização: Marília/SP

SAT-Fiscal a mistica está desvendada.

Mensagem por Diego Papale »

Para outros usuários que futuramente venham a ter problemas como os que citei, compramos um equipamento para homologação aqui na empresa e não constatamos nenhum erro, funcionou perfeitamente, portanto o emulador é útil para o desenvolvimento mas ocorrem muitos erros quando utilizado com xHarbour, o melhor na minha opinião é utilizar um equipamento para testes finais.
xHarbour 1.2.1 / Borland C++ Compiler 5.5 / MySQL
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Boa noite a todos
Desde já agradeço imensamente pela ajuda que tive no desenvolvimento do meu SAT.
Estava usando normalmente as chamadas as rotinas do SAT em C aqui postada até que atualizei o fivewin para versão 16.01, xharbour para 1.2.3 e Embarcadero C++ 7.00 for win 32. Agora quando faço chamada por exemplo: Retorno:=SATCONSULTAR(Random()), entra uma mensagem de erro do Windows "Borland Windows Custom Control Library parou de funcionar. Um problema fez com que o programa parasse de funcionar corretamente. O Windows fechará o programa e o notificará caso uma solução esteja disponível."
Acredito que o erro acontece por aqui:
HB_FUNC( SATCONSULTAR )
{
HINSTANCE handle = LoadLibrary("sat.dll");
if (handle)
{
_CONSULTARSAT pFunc;
pFunc = (_CONSULTARSAT) GetProcAddress(handle, "ConsultarSAT");
hb_retc( ( LPSTR ) pFunc(hb_parni(1)) );
FreeLibrary( handle );
}
}
Continuo usando as mesmas chamadas em C na versão antiga 10.2 sem problemas e na nova versão estou usando as chamadas com DllCall.

Obrigado
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Aparentemente este erro não tem relação direta com suas chamadas ao SAT, mas controle "a la Borland" em suas dialogos. Verifique.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, Como faço para parar a rotina após a execução de uma linha para saber onde está o erro?

Obrigado
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

No meu código, quando quero descobrir um ponto de travamento eu coloco alguns marcadores.

exemplo:

Código: Selecionar todos

function blablabla( seila )
     local algo := ...
     ...
?procline(),"1"
     ...
?procline(),"2"
     ...
     ...
?procline(),"x"
     ...
   return algo
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, ok. Seria assim?
HB_FUNC( SATCONSULTAR )
{
?procline(),"1"
HINSTANCE handle = LoadLibrary("Sat.dll");
?procline(),"2"

if (handle)
{
_CONSULTARSAT pFunc;
pFunc = (_CONSULTARSAT) GetProcAddress(handle, "ConsultarSAT");
?procline(),"3"
hb_retc( ( LPSTR ) pFunc(hb_parni(1)) );
FreeLibrary( handle );
}
}

Obrigado
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Esqueci de comentar que a consulta é registrada no simulador do sat ou seja a consulta foi efetuada no simulador mas o retorno não é enviado ao programa.

Obrigado
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Edvaldo

Código: Selecionar todos

Ok, ok. Seria assim?
HB_FUNC( SATCONSULTAR )
{
?procline(),"1"
HINSTANCE handle = LoadLibrary("Sat.dll");
?procline(),"2"
Não será necessário colocar nada neste local. O retorno desta função será uma string com seus itens separados por |(pipe). Desta forma você poderá manipular o resultado.

Voce consegue visualizar o retorno?, ou seja, ver o conteúdo do retorno:

Código: Selecionar todos

   ...
   ? SatConsultar( ...
   ...
Alguma coisa tem de retornar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, não consigo ver o retorno pois o erro acontece quando a função é chamada assim:
MsgRun("Consulta ao SAT","Aguarde...", {|| Retorno:=SATCONSULTAR(Random()) })
Ok, agora tem coisa errada mesmo e é na minha programação pois hoje instalei a nova versão com o SAT da Tanca e está rodando sem problemas.
Vou ver melhor o que está acontecendo e retorno com o resultado.
Peço desculpas por enquando

Muito obrigado.
Responder