Página 15 de 21

SAT-Fiscal a mistica está desvendada.

Enviado: 16 Mar 2016 23:34
por alaminojunior
Amiguinho Rochinha

Com relação ao postado pelo PauloVirt
paulovirt escreveu:Amigos, por favor uma luz. To tentando fazer o tratamento do retorno para obter o XML validado, mas ta tudo muito obscuro.
Cheguei até este ponto, mas não consigo compreender:

Código: Selecionar todos

dados := MemoRead( "c:\proemp\xml\sat\sat"+minio+".xml" )
retorno := DLLCall(h1,32,"EnviarDadosVenda",Random(), CCHAVE_SAT, dados)


xRet:= HB_Pointer2String(retorno,1000)

xTxt:= StringToArray( trim(xRet), "|" )


If xTxt[2] != '10000'
// '10000' RESPOSTA COM SUCESSO

@ 1,1 Say (xTxt[3] + ' - ' + xTxt[2])

 return .F.
 
Else

@ 1,1 Say (xTxt[3] + ' - ' + xTxt[2])

 return .F.

Endif

if !empty(xTxt[5])

@ 1,1 Say (xTxt[5] + ' - ' + xTxt[4])

Endif

// MATRIZ COM INFORMACOES PERDIDAS

@ 1,1 Say valtoprg(xTxt)


Return .T.




O parâmetro 1000 é o tamanho em bytes para receber o conteúdo no endereço de memória que foi retornado em

Código: Selecionar todos

retorno := DLLCall(h1,32,"EnviarDadosVenda",Random(), CCHAVE_SAT, dados)
Usando a DLL desta forma o retorno deste método é um ponteiro, como já respondi noutro post.

Ocorre (e já respondendo a dúvida do PauloVirt) que 1000 é muito pequeno para um arquivo XML.

Trocar o 1000 por 5000 pode não resolver, dependendo do número de itens que o cupom tenha.
Quanto mais informação no cupom, maior o xml final.

Tenho trabalhado com DLL´s da Sweda, Tanca e Bematech e os retornos tem sido iguais, ou seja, um ponteiro.

E repetindo, aí é que está o problema, pois como iremos adivinhar o tamanho que será retornado ???

Não sei se declarando os métodos da DLL como faz o Rochinha, o retorno será diferente.

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Mar 2016 13:02
por rochinha
Amiguinhos,
E repetindo, aí é que está o problema, pois como iremos adivinhar o tamanho que será retornado ???
Existe algum meio de apresentar este ponteiro em tela, salvar em arquivo ou coisa parecida?

A função LEN() pode ser usada para mensurar o resultado?

As funções GetProAddress(), GetProc32() e CallDLL() existem em suas versões de Harbour xHarbour?

Olhando o DLL.CH vemos que elas fazem parte da função extendida DLL32 e DLL:

Código: Selecionar todos

// Copyright FiveTech 1993-8

#ifndef _DLL_CH
#define _DLL_CH

#ifndef _C_TYPES
   #define _C_TYPES
   #define VOID     0
   #define BYTE     1
   #define CHAR     2
   #define WORD     3

#ifdef __CLIPPER__
   #define _INT     4         // conflicts with Clipper Int()
#else
   #define _INT     7
#endif

   #define BOOL     5
   #define HDC      6
   #define LONG     7
   #define STRING   8
   #define LPSTR    9
   #define PTR     10
   #define _DOUBLE 11         // conflicts with BORDER DOUBLE
   #define DWORD   12
#endif

#translate NOREF([@]<x>) => <x>

#ifndef __HARBOUR__
  #ifndef __XPP__
     #ifndef __CLIPPER__
        #define __CLIPPER__
     #endif
  #endif
#endif

#ifndef __CLIPPER__
   #translate DLL32 => DLL
#endif

//----------------------------------------------------------------------------//

#xcommand DLL [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                                                     [, <uParamN> AS <typeN> ] ) ;
             AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
       => ;
          [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLibrary( <(DllName)> ) ) ;;
             local uResult ;;
             local cFarProc ;;
             if Abs( hDLL ) > 32 ;;
                cFarProc = GetProcAddress( hDLL,;
                If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
                [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
                uResult = CallDLL( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLibrary( hDLL ) ) ;;
             else ;;
                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + <DllName> ) ;;
             end ;;
          return uResult

//----------------------------------------------------------------------------//

#xcommand DLL32 [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                                                      [, <uParamN> AS <typeN> ] ) ;
             AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
       => ;
          [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLib32( <(DllName)> ) ) ;;
             local uResult ;;
             local cFarProc ;;
             if Abs( hDLL ) <= 32 ;;
                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + <DllName> ) ;;
             else ;;
                cFarProc = GetProc32( hDLL,;
                If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
                [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
                uResult = CallDLL32( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLib32( hDLL ) ) ;;
             end ;;
          return uResult

#endif

//----------------------------------------------------------------------------//
Se estas funções existirem em seus Harbours e xHarbours podem tentar usar o que postei, caso não podem trocar CallDLL() por DllCall().

É preciso obter um resultado com a sua versão.

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Mar 2016 13:24
por alaminojunior
Rochinha
Existe algum meio de apresentar este ponteiro em tela, salvar em arquivo ou coisa parecida?
A função LEN() pode ser usada para mensurar o resultado?
O retorno da dllcall(h1,32,"enviardadosvenda .... " é um ponteiro, pelo menos na minha versão de xHarbour.
A única maneira de trazer o conteúdo do trecho de memória referente a este ponteiro, é usando a HB_Pointer2String.
Primeiro parâmetro sendo o ponteiro (endereço) e segundo parâmetro sendo o tamanho (bytes) deste conteúdo. Mas o próprio help do xHarbour atenta para o problema de não se enviar um valor muito alto, pois coisas 'estranhas podem acontecer'
Eu creio que não existe um meio de saber o tamanho da string retornada.
Pessoalmente, fiz uma rotina que 'tenta aproximar' o tamanho da string retornada, tomando como base o tamanho do XML enviado para o SAT.
As funções GetProAddress(), GetProc32() e CallDLL() existem em suas versões de Harbour xHarbour?

Olhando o DLL.CH vemos que elas fazem parte da função extendida DLL32 e DLL:
Com exceção da GetProc32, tenho as demais funções em minha versão.

SAT-Fiscal a mistica está desvendada.

Enviado: 18 Mar 2016 08:49
por Jairo Maia
Olá Pessoal,

Esse ponteiro é o endereço do segmento de memória onde foi colocado o conteúdo de retorno. Se o segundo parâmetro é maior que a variável, os bytes excedentes são caracteres não imprimíveis. Para saber o tamanho da string retornada pode fazer:

Código: Selecionar todos

cString := Left( cString, Hb_At( Chr( 0 ), cString ) - 1 )
O grande problema dessa função é que com frequência ocorre o erro: Unrecoverable error 6005: Exception Error. Porisso ocorre o que o alaminojunior já citou anteriormente, que é uma tela esbranquiçada e o programa trava.

Na verdade o programa para de responder e o Windows fica tentando dar o aviso, mas nem sempre consegue.

Editado às 10:26 para corrigir o código que estava incompleto.

SAT-Fiscal a mistica está desvendada.

Enviado: 18 Mar 2016 12:34
por rochinha
Amiguinhos,

Isto é desconfortável. Pois quase implica em se usar outra ferramenta diferente daquela a que estamos acostumados.

Uma coisa que reparei, em um post que o asimoes postou, o Harbour tem uma função chamada hb_DynCall():

Código: Selecionar todos

hb_DynCall( { "FullQRCode", hLib, HB_DYN_CALLCONV_STDCALL  }, .T., .F., RGBCor(255,255,255), RGBCor(0,0,0),  cStr, ;
               3,;
               1,;
               5, 5, 200, 200, cFile )
Reparei que nas chamadas CallDLL() o segundo parametro é 32, sempre usamos ele, porque?

32 é o valor de DC_CALL_STD, creio eu, pois não entendi se ele define como sendo standard a entrada de dados ou se a saida será neste formato. Portanto é verificar as outras opçoes para formatar a saida.

A hb_DynCall() também pode usar HB_DYN_CTYPE_DEFAULT, HB_DYN_CTYPE_CHAR_UNSIGNED, HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_CHAR_UNSIGNED_PTR, HB_DYN_CALLCONV_CDECL os quais não sei os valores.

O terceiro parametro do vetor passado para hb_DynCall() pode ser algo também como hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_STDCALL ), resta entender melhor o seu funcionamento e se ela é compatível com vossas versões de Harbour.

Vamos usá-la.

Segundo Help Vouch.info-HBW32 existem as diversas funções CallDLL(), DLLCall().

Exemplos podem existir nas pastas do Harbour em tests/testdyn.prg e tests/testdyn1.prg

Recentemente me deparei com FWCallDll() que deve compor a biblioteca Fivewin.

SAT-Fiscal a mistica está desvendada.

Enviado: 18 Mar 2016 17:24
por Edvaldo
Ok, voltei, estava fora.
Pessoal, eu acho que o problema é descobrir o por que todas as dlls usadas com as ECFs, como daruma, bematech, sweda, Elgin. dataregis, Epson e outras funcionam perfeitamente assim, por exemplo:
DLL32 FUNCTION rCFVerificarStatus_ECF_Daruma( cStatusCF AS STRING, piStatusCF AS _INT ) AS LONG PASCAL
FROM "rCFVerificarStatus_ECF_Daruma" LIB xDll
xRetorno:=rCFVerificarStatus_ECF_Daruma(xPar1, xPar2)
A varável xRetorno sempre conterá realmente o resultado do retorno ou um código de erro; Agora a Dll do sat não funciona assim, o retorno é uma cadeia de números, como já foi dito aqui que é endereço de memória muito complicado por que ninguém sabe o seu tamanho e simplesmente o programa não funciona e o Windows para o programa.

SAT-Fiscal a mistica está desvendada.

Enviado: 18 Mar 2016 18:11
por rochinha
Amiguinhos,

edvaldo
anexa sua dll.

SAT-Fiscal a mistica está desvendada.

Enviado: 19 Mar 2016 00:59
por rochinha
Amiguinhos,

Espero que tenham obtido algum resultado bom com as dicas anteriores.

Olhando no seguinte tópico encontrei um set de funções que faz acesso diretamente com Harbour.

Usem as funções deste set conforme a sua necessidade e deixem de fazer as chamadas via DllCall():

Código: Selecionar todos

***********************************************************************************
* Chamadas para DLL Funções de manipulação do cupom fiscal eletrônico Sweda
***********************************************************************************

Function EnviarDadosVenda(nNumeroSessao, cCodigoAtivacao, cDados)
   Local cString:= SATENVIARDADOSVENDA(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarSAT()
   Local cString:= SATCONSULTAR(Random(999999)), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarStatusOperacionalSAT(nNumeroSessao, cCodigoAtivacao)
   Local cString:= SATCONSULTARSTATUSOPERACIONAL(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AtivarSAT(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF)
   Local cString:= SATATIVAR(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AssociarAssinaturaSAT(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH )
   Local cString:= SATASSOCIARASSINATURA(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarNumeroSessao(nNumeroSessao, cCodigoAtivacao, nNumeroSessao2)
   Local cString:= SATCONSULTARNUMEROSESSAO(nNumeroSessao, cCodigoAtivacao,nNumeroSessao2), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function TesteFimAFim(nNumeroSessao, cCodigoAtivacao, cDados)
   Local cString := SATTESTEFIMAFIM(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function CancelarUltimaVenda(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados)
   Local cString:= SATCANCELARULTIMAVENDA(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ExtrairLogsSAT(nNumeroSessao, cCodigoAtivacao)
   Local cString:= SATEXTRAIRLOGS(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

#pragma BEGINDUMP

   #include "hbapi.h"
   #include "windows.h"

   typedef LPSTR (WINAPI *_CONSULTARSAT)          ( INT nRandom );
   typedef LPSTR (WINAPI *_ATIVARSAT)             ( INT nRandom, INT   nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
   typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
   typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
   typedef LPSTR (WINAPI *_TESTEFIMAFIMSAT)       ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_ENVIARVENDASAT)        ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_CANULTIMAVENDASAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cChave, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_CONSULTARSTATUSSAT)    ( INT nRandom, LPSTR cCodAtivacao);
   typedef LPSTR (WINAPI *_ATUALIZARSOFTWARE)     ( INT nRandom, LPSTR cCodAtivacao);
   typedef LPSTR (WINAPI *_EXTRAIRLOGS)           ( INT nRandom, LPSTR cCodAtivacao);

    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 );
       }
   }

   HB_FUNC( SATATIVAR )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ATIVARSAT pFunc;
           pFunc = (_ATIVARSAT) GetProcAddress(handle, "AtivarSAT");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parni(2), hb_parc(3), hb_parc(4), hb_parni(5)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATASSOCIARASSINATURA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ASSOCIARASSINATURASAT pFunc;
           pFunc = (_ASSOCIARASSINATURASAT) GetProcAddress(handle, "AssociarAssinatura");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
           FreeLibrary( handle );
       }
      }

   HB_FUNC( SATCONSULTARNUMEROSESSAO )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CONSULTARSECAOSAT pFunc;
           pFunc = (_CONSULTARSECAOSAT) GetProcAddress(handle, "ConsultarNumeroSessao");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATTESTEFIMAFIM )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _TESTEFIMAFIMSAT pFunc;
           pFunc = (_TESTEFIMAFIMSAT) GetProcAddress(handle, "TesteFimAFim");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATENVIARDADOSVENDA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ENVIARVENDASAT pFunc;
           pFunc = (_ENVIARVENDASAT) GetProcAddress(handle, "EnviarDadosVenda");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }
   HB_FUNC( SATCANCELARULTIMAVENDA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CANULTIMAVENDASAT pFunc;
           pFunc = (_CANULTIMAVENDASAT) GetProcAddress(handle, "CancelarUltimaVenda");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATCONSULTARSTATUSOPERACIONAL )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CONSULTARSTATUSSAT pFunc;
           pFunc = (_CONSULTARSTATUSSAT) GetProcAddress(handle, "ConsultarStatusOperacional");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
      }

   HB_FUNC( SATATUALIZARSOFTWARE )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ATUALIZARSOFTWARE pFunc;
           pFunc = (_ATUALIZARSOFTWARE) GetProcAddress(handle, "AtualizarSoftwareSAT");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATEXTRAIRLOGS )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _EXTRAIRLOGS pFunc;
           pFunc = (_EXTRAIRLOGS) GetProcAddress(handle, "ExtrairLogs");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
   }

 #pragma ENDDUMP
Pelo que pude perceber nos trechos:

Código: Selecionar todos

   typedef LPSTR (WINAPI *_CONSULTARSAT)          ( INT nRandom );
   typedef LPSTR (WINAPI *_ATIVARSAT)             ( INT nRandom, INT   nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
   typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
   typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
Estamos definindo que os retornos venham como LPSTR que significa, acho eu, Long Pointer STRing. Que tal trocá-las por STRING somente.

Vejamos:

Código: Selecionar todos

#ifndef _C_TYPES
   #define _C_TYPES
   #define VOID     0
   #define BYTE     1
   #define CHAR     2
   #define WORD     3
   #define _INT     7
   #define BOOL     5
   #define HDC      6
   #define LONG     7
   #define STRING   8
   #define LPSTR    9
   #define PTR     10
   #define _DOUBLE 11 // conflicts with BORDER DOUBLE
   #define DWORD   12
#endif
Talvez seja um túnel no fim da luz, ou não.

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Mar 2016 12:54
por Edvaldo
Ok, testei a função ConsultarSAT mas dá erro logo em cString:= SATCONSULTAR(Random()), não retorna e o Windows fica tentando achar uma solução pro erro. Borland Windows Custom Control Library parou de funcionar. Um problema fez com que o programa parasse de funcionar corretamente.

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Mar 2016 18:53
por rochinha
Amiguinhos,

edvaldo
Apresente-nos seu código e se possível anexe este executável teste.

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Mar 2016 19:31
por Edvaldo
Opa, o simulador registrou que foi feito uma consulta. vou continuar fussando mais.

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Mar 2016 22:15
por Edvaldo
Ok, fiz alguns testes e acho que o caminho para a soluçãoo do problema é esta forma de trabalho heim. Nos testes que fiz o simulador reconheceu as chamadas porém o programa fica sem controlenão retornando a linha logo abaixo da execução. segue o exemplo que é uma copia do original

Código: Selecionar todos

***********************************************************************************
* Chamadas para DLL Funções de manipulação do cupom fiscal eletrônico Sweda
***********************************************************************************

#include "fivewin.ch"


Function Main()
   local xRet:=Consultarsat()
   ?"Resposta",xRet
Return Nil

Function EnviarDadosVenda(nNumeroSessao, cCodigoAtivacao, cDados)
 Local cString:= SATENVIARDADOSVENDA(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarSAT()
 Local cString:= SATCONSULTAR(Random()), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarStatusOperacionalSAT(nNumeroSessao, cCodigoAtivacao)
 Local cString:= SATCONSULTARSTATUSOPERACIONAL(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AtivarSAT(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF)
 Local cString:= SATATIVAR(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AssociarAssinaturaSAT(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH )
 Local cString:= SATASSOCIARASSINATURA(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarNumeroSessao(nNumeroSessao, cCodigoAtivacao, nNumeroSessao2)
 Local cString:= SATCONSULTARNUMEROSESSAO(nNumeroSessao, cCodigoAtivacao,nNumeroSessao2), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function TesteFimAFim(nNumeroSessao, cCodigoAtivacao, cDados)
 Local cString := SATTESTEFIMAFIM(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function CancelarUltimaVenda(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados)
 Local cString:= SATCANCELARULTIMAVENDA(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ExtrairLogsSAT(nNumeroSessao, cCodigoAtivacao)
 Local cString:= SATEXTRAIRLOGS(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

#pragma BEGINDUMP

 #include "hbapi.h"
 #include "windows.h"

 typedef LPSTR (WINAPI *_CONSULTARSAT)     ( INT nRandom );
 typedef LPSTR (WINAPI *_ATIVARSAT)      ( INT nRandom, INT nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
 typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
 typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)  ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
 typedef LPSTR (WINAPI *_TESTEFIMAFIMSAT)   ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_ENVIARVENDASAT)    ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_CANULTIMAVENDASAT)  ( INT nRandom, LPSTR cCodAtivacao, LPSTR cChave, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_CONSULTARSTATUSSAT)  ( INT nRandom, LPSTR cCodAtivacao);
 typedef LPSTR (WINAPI *_ATUALIZARSOFTWARE)  ( INT nRandom, LPSTR cCodAtivacao);
 typedef LPSTR (WINAPI *_EXTRAIRLOGS)     ( INT nRandom, LPSTR cCodAtivacao);

  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 );
   }
 }

 HB_FUNC( SATATIVAR )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ATIVARSAT pFunc;
     pFunc = (_ATIVARSAT) GetProcAddress(handle, "AtivarSAT");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parni(2), hb_parc(3), hb_parc(4), hb_parni(5)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATASSOCIARASSINATURA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ASSOCIARASSINATURASAT pFunc;
     pFunc = (_ASSOCIARASSINATURASAT) GetProcAddress(handle, "AssociarAssinatura");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
     FreeLibrary( handle );
   }
   }

 HB_FUNC( SATCONSULTARNUMEROSESSAO )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CONSULTARSECAOSAT pFunc;
     pFunc = (_CONSULTARSECAOSAT) GetProcAddress(handle, "ConsultarNumeroSessao");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATTESTEFIMAFIM )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _TESTEFIMAFIMSAT pFunc;
     pFunc = (_TESTEFIMAFIMSAT) GetProcAddress(handle, "TesteFimAFim");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATENVIARDADOSVENDA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ENVIARVENDASAT pFunc;
     pFunc = (_ENVIARVENDASAT) GetProcAddress(handle, "EnviarDadosVenda");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }
 HB_FUNC( SATCANCELARULTIMAVENDA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CANULTIMAVENDASAT pFunc;
     pFunc = (_CANULTIMAVENDASAT) GetProcAddress(handle, "CancelarUltimaVenda");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATCONSULTARSTATUSOPERACIONAL )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CONSULTARSTATUSSAT pFunc;
     pFunc = (_CONSULTARSTATUSSAT) GetProcAddress(handle, "ConsultarStatusOperacional");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
   }

 HB_FUNC( SATATUALIZARSOFTWARE )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ATUALIZARSOFTWARE pFunc;
     pFunc = (_ATUALIZARSOFTWARE) GetProcAddress(handle, "AtualizarSoftwareSAT");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATEXTRAIRLOGS )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _EXTRAIRLOGS pFunc;
     pFunc = (_EXTRAIRLOGS) GetProcAddress(handle, "ExtrairLogs");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
 }

 #pragma ENDDUMP

SAT-Fiscal a mistica está desvendada.

Enviado: 22 Mar 2016 00:10
por rochinha
Amiguinhos,

edvaldo
Faça esta modificação:

Código: Selecionar todos

Function ConsultarSAT()
Local cString:= SATCONSULTAR(Random()), aString:= HB_ATOKENS(cString, [|])

? cString

Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

SAT-Fiscal a mistica está desvendada.

Enviado: 22 Mar 2016 12:12
por Edvaldo
Ok, fiz a alteração e continua comunicando com o SAT porém após executar o comando: local cString:= SATCONSULTAR(Random()) o programa retorna ao prompt de comandos sem dar erros. Não chega a executar o segundo comando: aString:= HB_ATOKENS(cString, [|]), por tanto não mostra o resultado: ? cString

SAT-Fiscal a mistica está desvendada.

Enviado: 22 Mar 2016 12:26
por alaminojunior
Amiguinhos, desculpem não poder contribuir testando o código.
Estou fora do escritório por uns dias e não consigo nem instalar o simulador do SAT aqui neste PC.

Mas no caso:

Código: Selecionar todos

aString:= HB_ATOKENS(cString, [|])
Não sei se daria na mesma, mas o correto não seria:

Código: Selecionar todos

aString:= HB_ATOKENS(cString, '|')