Ir para conteúdo
  • Cadastre-se

Renan Garcia de Oliveira

Membros
  • Total de ítens

    58
  • Registro em

  • Última visita

Posts postados por Renan Garcia de Oliveira

  1. Boa tarde,

     

    Gostaria de confirmar uma informação sobre o parâmetro abaixo, que está no arquivo ACBrNFeServicos.ini:

    URL-ConsultaNFCe_2.00=http://www.sefaz.go.gov.br/nfce/consulta

     

    Quando eu utilizo este valor que vem por padrão nos fontes do ACBr e tento enviar uma NFC-e com QRCode na versão 2.0 recebo o seguinte retorno:

    Endereço do site da UF da Consulta por chave de acesso diverge do previsto

     

    Eu consigo autorizar a NFC-e se colocar o mesmo endereço que está no parâmetro da versão 1.0 do QRCode:

    URL-ConsultaNFCe_1.00=http://www.nfce.go.gov.br/post/ver/214413/consulta-nfc-e-homologacao

     

    Essa URL da  versão 2.0 vai passar a ser oficial a partir do dia 1 de Outubro, ou está errada mesmo? Porque jogando a URL da 2.0 no navegador sempre sou redirecionado para a URL da 1.0.

  2. Estou desenvolvendo um projeto e esbarrei em um problema em que preciso ficar copiando e colando o mesmo código em todos os métodos de algumas classes, mas não consegui resolver esse problema com o que conheço em POO. O que ocorre é o seguinte: 

    Eu tenho neste projeto as minhas regras de negócio; para cada model, eu tenho uma regra de negócio (PessoaModel -> PessoaRN, EndereçoModel -> EndereçoRN, etc); dentro dessas classes "RN" eu recebo um Model da View, valido ele, e então executo a função em questão (PessoaRN.Inserir, PessoaRN.Editar, etc); cada vez que uma View executa um dos métodos das Regras de Negócio eu inicio uma transação no banco de dados, faço todo a validação e processamento do método, e no final se tudo deu certo, dou um commit, senão um rollback no banco de dados; fica no final com essa estrutura:

    function TRegraDeNegocio.Inserir(pModel: TModel):Boolean;
    begin
    	DoIniciaTransacaoComBancoDeDados;
    	
    	try
    		//
    		// Aqui processa o código da função de fato
    		//
    
    		DoCommitTransacao;
    	except
    		on E: Exception do
    		begin
    			DoRollbackTransacao;
    			raise Exception.Create(E.Message);
    		end;
    	end;
    end;

    Então resumindo: em todos os métodos de todas as regras de negócio eu teria que ficar copiando e colando todo o código acima com a exceção da parte comentada, porque é ali que entra o código de fato do método em si.

    Não consegui resolver com herança, pois tem código comum no início e no final. 

    Existe algum outro detalhe na POO que resolveria essa questão?

  3. Trabalho com o Gutierres aqui na empresa e estamos a alguns dias quebrando cabeça com isso, até o momento o que a gente conseguiu identificar é que é algo com alguma DLL que as classes do OpenSSL utilizam, porquê se eu trocar a configuração pra Capicom vai que é uma beleza. Também quando estou testando com o OpenSSL e deixo a aplicação aberta, volta e meia do nada dispara uma exceção, depurando no delphi eu vi uma mensagem com o método "CertFreeCertificateContext" de alguma DLL.

  4. Boa tarde,

     

    Gostaria de saber se é possível enviar um código criando um parâmetro para imprimir ou não a segunda via do NFC-e quando emitida em modo de contingência, pois de acordo com o Manual de Padrões Técnicos da Contingência Off-line Versão 2.0 de 16 de dezembro de 2016:

    "Alternativamente à impressão da segunda via do DANFE NFCe, quando de emissão em contingência, o contribuinte poderá optar pela guarda eletrônica, em local seguro, do respectivo arquivo XML da NFC-e. Neste caso, o contribuinte deverá possibilitar a impressão do respectivo DANFE NFC-e para apresentação ao fisco quando solicitado." (pag. 8)

    Então é possível não imprimir a segunda via desde que o estabelecimento guarde uma via eletrônica do XML e que seja capaz de imprimir a segunda caso algum fiscal solicite (ambas as funções eu já implementei). O manual também diz que para fazer uso desta opção o usuário deve lavrar termo no livro Registro de Utilização de Documentos Fiscais e Termos de Ocorrência - modelo 6, ou formalizar declaração de opção segundo disciplina que vier a ser estabelecida por sua Unidade Federada, assumindo total responsabilidade pela guarda do arquivo e declarando ter ciência que não poderá, posteriormente, alegar problemas técnicos para justificar a eventual perda desta informação eletrônica sob sua posse, assumindo as consequências legais por ventura cabíveis.

    Então sendo possível, gostaria de saber quais os passos para enviar esta modificação no código para vocês.

    Manual_de_especificacoes_tecnicas_da_Contingencia_Off-line_versao_2.0 (1).pdf

  5. O que consegui depurar aqui é que quando tento efetuar uma inutilização com OpenSSL o erro ocorre dentro da unit ACBrDFeXsXmlSec no método TDFeSSLXmlSignXmlSec.XmlSecSign, na linha 578 do arquivo:

    doc := xmlParseDoc(PAnsiChar(ConteudoXML));

    O valor do ConteudoXML é o seguinte:

    <!DOCTYPE test [<!ATTLIST infInut Id ID #IMPLIED>]>
    <inutNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
    	<infInut Id="ID52172647484800014665005000000082000000082">
    		<tpAmb>2</tpAmb>
    		<xServ>INUTILIZAR</xServ>
    		<cUF>52</cUF>
    		<ano>17</ano>
    		<CNPJ>26474848000146</CNPJ>
    		<mod>65</mod>
    		<serie>5</serie>
    		<nNFIni>82</nNFIni>
    		<nNFFin>82</nNFFin>
    		<xJust>Erro ao gerar número sequencial no software</xJust>
    	</infInut>
    	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    		<SignedInfo>
    			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
    			<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
    			<Reference URI="#ID52172647484800014665005000000082000000082">
    				<Transforms>
    					<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
    					<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
    				</Transforms>
    				<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    				<DigestValue></DigestValue>
    			</Reference>
    		</SignedInfo>
    		<SignatureValue></SignatureValue>
    		<KeyInfo>
    			<X509Data>
    				<X509Certificate></X509Certificate>
    			</X509Data>
    		</KeyInfo>
    	</Signature>
    </inutNFe>

    E quando tenta executar o xmlParseDoc é quando dá o erro Falha ao interpretar o XML "xmlParseDoc"

  6. Eu tentei executar pelo demo mas não deu certo, foi um custo só pra instalar e compilar ele. Mas quando tento executar a inutilização com versão da Nf-e 4.0 dá um erro dizendo que o OpenSSL não suporta TL_TLSv1_2, se eu seleciono uma versão menor aí da erro no XML.

    Mas no meu sistema eu executo mesmo método que o inutilizar do demo faz, usando um certificado A1 configurado no OpenSSL, realizo uma inutilização para NFC-e, modelo 65.

  7. Bom dia, 

     

    Gostaria de sugerir a alteração abaixo no método "CancelaCupomVirtual" da classe "TACBrECFVirtualNFCeClass":

    procedure TACBrECFVirtualNFCeClass.CancelaCupomVirtual;
    var
      NomeNFCe, cStat, xMotivo: string;
    begin
      if Estado = estNaoFiscal then
        exit;
    
      with fsACBrNFCe do
      begin
        if (Estado in estCupomAberto) or
          (Estado in estPagamento) then // Não precisa cancelar se ainda não enviou...d
        begin
          NotasFiscais.Clear;
          exit;
        end;
    
    ...

    Adicionando o "(Estado in estPagamento)", pois ocorre a seguinte situação: eu estou realizando uma venda em modo OnLine e ao executar o "FechaCupom" ocorre um erro de conexão, então eu preciso deixar esta venda pendente e abrir uma nova em modo OffLine, o problema é que como há erro de conexão o "FechaCupom" não irá funcionar (a não ser que haja algum parâmetro que eu não identifiquei na classe) então preciso cancelar o documento aberto na ECFVirtual, mas a essa altura o Estado não é mais estCupomAberto e sim estPagamento pois já foram realizados os pagamentos.

    Na verdade o código está certo, foi falta de atenção minha. Mas mesmo entrando no bloco

    NotasFiscais.Clear;
    exit;

    Aparentemente o componente ainda tenta enviar o cancelamento da nota, pois recebo a mensagem de erro dizendo que não há notas para serem canceladas.

  8. Boa tarde,

     

    Estou tentando realizar uma inutilização com o libOpenSSL mas sempre recebo o seguinte erro:

    Falha ao assinar Inutilização Nota Fiscal Eletrônica 
    Erro: Falha ao interpretar o XML "xmlParseDoc"

    Eu efetuo a inutilização da seguinte forma:

    ACBrNFe.WebServices.Inutiliza(
          DAO.QueryConsultaEmpresa.Query('CG_EMP').FieldByName('CNPJ').AsString,
          'Erro ao gerar número sequencial no software',
          StrToInt(FormatDateTime('yyyy', Now)),
          65,
          DAO.QueryConsultaPDV.Query('TB_PDV').FieldByName('NRO').AsInteger,
          pNroInicial,
          pNroFinal);

    Esse é um erro antigo, com o Capicom funciona corretamente então venho mantendo meus clientes com Capicom, mas agora com a mudança no ACBr a inutilização teria que funcionar com OpenSSL.

    Alguém mais já teve esse erro ao efetuar inutilização com OpenSSL?

  9. Bom dia,

     

    Estou enfrentando a seguinte situação que não consigo tratar com o NFC-e:

    Dentro do sistema eu preparo todo o objeto do cupom eletrônico da ACBr e executo o envio, a nota então é enviada, o servidor da SEFAZ consegue receber ela e processa toda a nota pra então enviar o retorno, só que nesse meio tempo cai a internet na loja e o retorno nunca chega, pro sistema a única coisa que consigo detectar é a queda da conexão. Então eu mudo para o modo OffLine e finalizo a venda para liberar o cliente. Mais tarde o usuário envia essa venda que ficou pendente e antes disso no sistema eu consulto a chave, se ela existir na SEFAZ então só finalizo as rotinas internas do sistema para processar a venda.

    O problema é que como eu não recebi o retorno no momento do envio, o XML que eu tenho salvo está errado, pois ele não possui a tag "nfeProc" que é gerada somente após a autorização da nota pela SEFAZ, neste caso é pior ainda, porque como troquei para modo offline anteriormente, o XML que tenho na base de dados está como contingência.

    Existe alguma forma de recuperar o XML que foi autorizado na SEFAZ? Ou o processo que estou fazendo está incorreto e qual seria o tratamento certo?

     

    Atenciosamente,

     

    Renan Garcia de Oliveira.

  10. Boa Tarde,

    Implementei a NFC-e no próprio PAF e configuro o ACBrECF para virtual, mas ao registrar item com alíquotas diferentes retorna o erro de alíquota não registrada, como faço nesse caso?.

    Tentei usar o ACBrECFVirtualNFCe, mas tive duvidas, tenho que conectar o ACBrNFe nele e preencher normalmente? ou tenho que utilizar o método vendeitem?

    Já olhei bastante os exemplos e li os manuais, mas se vocês tiverem mais material para me ajudar eu agradeceria muito.

    Desde já agradeço!

  11. Boa tarde,

     

     

     

    Eu utilizo uma classe que fiz para o CliSiTef, mas fiz o teste com o TEFDemo do ACBr e tive o mesmo problema. Eu imagino que o problema seja algo relacionado à versão da DLL, vou entrar em contato com a Software Express para tentar solucionar, mas mesmo assim estou enviando em anexo o log gerado pelo TEFDemo.

     

     

     

    Atenciosamente,

     

     

     

    Renan Garcia de Oliveira.

     

     

    [update] Dito e feito, eram as DLL's mesmo. Eu pedi o material de homologação para eles em dezembro, e veio com a DLL versão 4.0.0.24, eu voltei para as minhas DLL's antigas, versão 4.0.0.17 e consegui efetuar a carga no PinPad.

    CliSiTef.txt

  12. Boa tarde,

     

     

     

    Estou iniciando os testes para homologar o CliSiTef, mas sempre que vou tentar vender com um cartão de crédito magnético o TEF começa a atualizar as tabelas do pinpad, mas sempre trava na hora de carregar o registro 5. Eu tive esse problema antigamente - na versão anterior do meu sistema - e acontecia porque eu ficava exibindo a mensagem do comando 3 na tela do pinpad, aparentemente isso lotava a comunicação com o pinpado, pois o TEF estava atualizando as tabelas e eu enviando mensagens para a tela.

    Recentemente refizemos todo o nosso PDV mas eu mantive praticamente todo o código antigo do CliSiTef, tomando o devido cuidado de não mandar nada para a tela do pinpad durante a carga de tabelas, mesmo assim estou tendo o antigo erro.

    Gostaria de saber se alguém já teve este problema ao carregar as tabelas do pinpad e qual a solução encontrada. Estou enviando em anexo o debug com os comandos e mensagens recebidos no ContinuaFuncaoSiTefInterativo.

     

     

    Atenciosamente,

     

     

    Renan Garcia de Oliveira.

    Debug.txt

  13. Sim, coloquei as duas junto da aplicação e deu o memso erro de novo. Rodei o registra.bat e executei o programa em outro computador que não mexi com a libeay, nada ainda. Mais ou menos um mês atrás eu consegui rodar este comando, quinta-feira agora eu vou homologar o PAF, aí peguei o roteiro e to repassando ele só pra confirmar, logo que chegou no teste do menu fiscal me vem essa ¬¬

  14. Estou tentando realizar o comando ArquivoMF_DLL, testei com uma ECF Daruma e uma Bematech nas ruas recebo um erro de access violation na libeay32.dll. Alguém já teve este problema, ou está tendo e o que posso fazer para tentar resolver?

     

    Já copiei as DLLs libeay32 da pasta OpenSSL do ACBr pra tudo quanto é lado no computador e até agora nada.

  15. Em fim, consegui resolver o problema de "Carácter inválido encontrado no texto". Na verdade o método acima funciona perfeitamente para enviar o arquivo, quem me pregou uma peça foi a própria estrutura do sistema daqui da empresa, não sei o porquê direito mas de certa forma algumas classes estavam sobrescrevendo alguns do métodos utilizados, por exemplo: o "Reset(vF);", minha regra de negócio herda de uma classe que já possui um método Reset mas que faz outras funções.

     

    Agora que o SNGPC está tinindo gostaria de saber se não há algum manual de como adequar o código dele para que eu possa contribuir com o código para o Projeto ACBr também.

  16. Vou tentar postar mais uma vez o meu problema, ontem o dia todo e hoje fiz diversas tentativas para gerar um arquivo e sempre o mesmo bendito erro:

     

    "Caractere inválido encontrado no texto"

     

    Segue abaixo todo o código que utilizo para enviar o arquivo ao SNGPC (via webservice) e um arquivo gerado.

     

    //Gerar XML
    vNomeArquivo := FormatDateTime('yyyymmddhhnnsszzz', Now);
    vXMLResultante := TXMLDocument.Create(nil);
    vXMLResultante.Active := False;
    vXMLResultante.FileName := '';
    vXMLResultante.LoadFromXML(FInventario.GerarSngpc2Inventario);
    
    
    //Salvar arquivo e compactar em formato zip
    if not DirectoryExists(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc') then
    ForceDirectories(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc');
    vXMLResultante.Active := true;
    vXMLResultante.SaveToFile(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + vNomeArquivo + '.xml');
    vNomeArquivo := DoCompactaXML(vNomeArquivo);
    
    
    { DoCompactaXML }
    function TRN_EQ_SNGPC2.DoCompactaXML(pNomeArquivo: string): string;
    var
      vZipFile: TZipFile;
    begin
      //Compacta o arquivo
      vZipFile := TZipFile.Create;
      try
        vZipFile.Open(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.zip', zmWrite);
        vZipFile.Add(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.xml');
        vZipFile.Close;
      finally
        vZipFile.Free;
        DeleteFile(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.xml');
        Result := ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.zip';
      end;
    end;
    
    
    //Gerar Hash
    FDSDados.DataSet.Edit;
    //FDSDados.DataSet.FieldByname('SNGPC_HASH').AsString := DoGetHashFromZipFile(vNomeArquivo);
    FDSDados.DataSet.FieldByname('SNGPC_HASH').AsString := MD5Print(MD5String(vXMLResultante.XML.Text));
    
    
    { DoGetHashFromZipFile - Atualemten estou gerando hash a partir do texto xml, mas pelo arquivo zip ainda ocorria o mesmo erro }
    function TRN_EQ_SNGPC2.DoGetHashFromZipFile(pNomeArquivo: string): string;
    var
      vIdmd5: TIdHashMessageDigest5;
      vFs: TFileStream;
    begin
      vIdmd5 := TIdHashMessageDigest5.Create;
      vFs := TFileStream.Create(pNomeArquivo, fmOpenRead or fmShareDenyWrite);
      try
        Result := vIdmd5.HashStreamAsHex(vFs);
      finally
        vFs.Free;
        vIdmd5.Free;
      end;
    end;
    
    
    //Enviar
    FDSDados.DataSet.FieldByname('MENSAGEM').AsString := vGerenciador.EnviarArquivo(
    FInventario.Usuario,
    FInventario.Senha,
    FDSDados.DataSet.FieldByname('SNGPC_HASH').AsString,
    vNomeArquivo,
    vHomologacao);
    
    
    { EnviarArquivo }
    function TSngpc2Gerenciador.EnviarArquivo(pEmail, pSenha, pHash, pArquivo: string; pTeste: Boolean): string;
    var
      FacWsTeste: ITSngpc2SoapTeste;
      FacWsProducao: ITSngpc2SoapProducao;
    begin
      Result := EmptyStr;
    
    
      try
        try
          if pTeste then
          begin
            FacWsTeste := TSngpc2SoapTeste.Create;
            with FacWsTeste do
            begin
              WsTeste := LoadSngpcSoapTeste();
              Result := WsTeste.EnviaArquivoSNGPC(pEmail, pSenha, FileToByteArray(pArquivo), pHash);
            end;
          end
          else
          begin
            FacWsProducao := TSngpc2SoapProducao.Create;
            with FacWsProducao do
            begin
              WsProducao := LoadSngpcSoapProducao();
              Result := WsProducao.EnviaArquivoSNGPC(pEmail, pSenha, FileToByteArray(pArquivo), pHash);
            end;
          end;
        except
          on E: Exception do
            raise Exception.Create(E.Message);
        end;
      finally
        DeleteFile(pArquivo);
      end;
    end;
    
    
    { FileToByteArray }
    function TSngpc2Gerenciador.FileToByteArray(const pFileName: string): TByteDynArray;
    const
      BLOCK_SIZE = 1024;
    var
      vBytesRead,
        vBytesToWrite,
        vCount: integer;
      vF: file of Byte;
      vTemp: Pointer;
    begin
      AssignFile(vF, pFileName);
      Reset(vF);
      try
        vCount := FileSize(vF);
        SetLength(Result, vCount);
        vTemp := @Result[0];
        vBytesRead := BLOCK_SIZE;
        while (vBytesRead = BLOCK_SIZE) do
        begin
          vBytesToWrite := Min(vCount, BLOCK_SIZE);
          BlockRead(vF, vTemp^, vBytesToWrite, vBytesRead);
          vTemp := Pointer(LongInt(vTemp) + BLOCK_SIZE);
          vCount := vCount - vBytesRead;
        end;
      finally
        CloseFile(vF);
      end;
    end;

     

    20130903093315710.xml

  17. É pra acabar mesmo, tentei as duas alternativas:

     

    - Fiz o método RemoveAcento();

    - Na hora de salvar o xml utilizei o encoding, .SaveToFile('asdasda', TEcncoding.UTF8);

     

    E nada, continuo recebendo a mensagem 'Caractere inválido encontrado no texto'.

  18. Eu imagino que não seja esse o caso, pois o mesmo arquivo que gero para o web service é o que utilizo para fazer upload direto no site do SNGPC, aliás é a forma que osclientes estão utilizando atualmente. Mas irei testar ainda assim.

  19. Renan Garcia de Oliveira vc esta tendo o erro de carecter invalido quando envia o arquivos?

    se for eu tenho a solução.

     

     

    É esse erro mesmo :D, meu carma dos últimos dias...

  20. Vou tentar postar mais uma vez pra ver se alguém ainda está com o problema de: Caracteres inválidos encontrados no texto.
     
    Esse é o passo a passo que faço para enviar oarquivo ao SNGPC
     
    1º - Gero o conteúdo do arquivo e salvo ele em disco, em seguida compacto o arquivo para o formato .zip
    //Gerar XML
    vXMLResultante := FInventario.GerarSngpc2Inventario;
    //Salvar arquivo e compactar em formato zip
    if not DirectoryExists(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc') then
    ForceDirectories(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc');
    vNomeArquivo := FormatDateTime('yyyymmddhhnnsszzz', Now);
    vArquivo.Text := vXMLResultante;
    vArquivo.SaveToFile(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + vNomeArquivo + '.xml');
    vNomeArquivo := DoCompactaXML(vNomeArquivo); // *
     
    // *Método de compactação
    function TRN_EQ_SNGPC2.DoCompactaXML(pNomeArquivo: string): string;
    var
      vZipFile: TZipFile;
    begin
      //Compacta o arquivo
      vZipFile := TZipFile.Create;
      try
        vZipFile.Open(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.zip', zmWrite);
        vZipFile.Add(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.xml');
        vZipFile.Close;
      finally
        vZipFile.Free;
        DeleteFile(ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.xml');
        Result := ExtractFilePath(ParamStr(0)) + 'i_o\Sngpc\' + pNomeArquivo + '.zip';
      end;
    end;
    2º - Gero um hash utilizando o arquivo .zip
     
    //Gerar Hash
    FDSDados.DataSet.Edit;
    FDSDados.DataSet.FieldByname('SNGPC_HASH').AsString := DoGetHashFromZipFile(vNomeArquivo); // **
     
    // ** Método para gerar o hash
    function TRN_EQ_SNGPC2.DoGetHashFromZipFile(pNomeArquivo: string): string;
    var
      vIdmd5: TIdHashMessageDigest5;
      vFs: TFileStream;
    begin
      vIdmd5 := TIdHashMessageDigest5.Create;
      vFs := TFileStream.Create(pNomeArquivo, fmOpenRead or fmShareDenyWrite);
      try
        Result := vIdmd5.HashStreamAsHex(vFs);
      finally
        vFs.Free;
        vIdmd5.Free;
      end;
    end;
    3º - Efetuo o envio do arquivo
     
    FDSDados.DataSet.FieldByname('MENSAGEM').AsString := vGerenciador.EnviarArquivo(FInventario.Usuario, FInventario.Senha,
      FDSDados.DataSet.FieldByname('SNGPC_HASH').AsString, vNomeArquivo, vHomologacao); // ***
      
    // *** Método de envio do arquivo
    function TSngpc2Gerenciador.EnviarArquivo(pEmail, pSenha, pHash, pArquivo: string; pTeste: Boolean): string;
    var
      FacWsTeste: ITSngpc2SoapTeste;
      FacWsProducao: ITSngpc2SoapProducao;
      vFile: TByteDynArray;
    begin
      Result := EmptyStr;
    
    
      try
        if pTeste then
        begin
          vFile := FileToByteArray(pArquivo); // ****
    
    
          FacWsTeste := TSngpc2SoapTeste.Create;
          with FacWsTeste do
          begin
            WsTeste := LoadSngpcSoapTeste();
            Result := WsTeste.EnviaArquivoSNGPC(pEmail, pSenha, vFile, pHash);
          end;
        end
        else
        begin
          vFile := FileToByteArray(pArquivo);
    
    
          FacWsProducao := TSngpc2SoapProducao.Create;
          with FacWsProducao do
          begin
            WsProducao := LoadSngpcSoapProducao();
            Result := WsProducao.EnviaArquivoSNGPC(pEmail, pSenha, vFile, pHash);
          end;
        end;
      except
        on E: Exception do
          raise Exception.Create(E.Message);
      end;
    end;
     
    // *** Método para converter o arquivo no formato TByteDynArray
    function TSngpc2Gerenciador.FileToByteArray(const pFileName: string): TByteDynArray;
    const
      BLOCK_SIZE = 1024;
    var
      BytesRead, BytesToWrite, Count: Integer;
      F: file of Byte;
      pTemp: Pointer;
    begin
      AssignFile(F, pFileName);
      Reset(F);
      try
        Count := FileSize(F);
        SetLength(Result, Count);
        pTemp := @Result[0];
        BytesRead := BLOCK_SIZE;
        while (BytesRead = BLOCK_SIZE) do
        begin
          BytesToWrite := Min(Count, BLOCK_SIZE);
          BlockRead(F, pTemp^, BytesToWrite, BytesRead);
          pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
          Count := Count - BytesRead;
        end;
      finally
        CloseFile(F);
      end;
    end;

    Já virei esse código do avesso um monte de vezes, e até hoje continuo com esse erro.

     

  21. Olá Renan... o meu aplicativo foi desenvolvido no Delphi 7 e veja a diferença entre a minha unit importada com a sua:

        function  ValidarUsuario(const Email: WideString; const Senha: WideString): WideString; stdcall;
        function  EnviaArquivoSNGPC(const Email: WideString; const Senha: WideString; const Arq: TByteDynArray; const HashIdentificacao: WideString): WideString; stdcall;
        function  ConsultaDadosArquivoSNGPC(const Email: WideString; const Senha: WideString; const CNPJ: WideString; const Hash: WideString): WideString; stdcall;
    
    
        function  ValidarUsuario(const Email: string; const Senha: string): string; stdcall;
        function  EnviaArquivoSNGPC(const Email: string; const Senha: string; const Arq: TByteDynArray; const HashIdentificacao: string): string; stdcall;
        function  ConsultaDadosArquivoSNGPC(const Email: string; const Senha: string; const CNPJ: string; const Hash: string): string; stdcall;
    

     Sérgio

     

    Isso é porque o WideString do Delphi 7 é o tipo string do Delphi XE+

×
×
  • 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.