Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Boa noite pessoal, estive investigando no google mas é muito pobre de material sobre SNGPC estou com o problema do membro renan acima diz que meu arquivo contem caracteres inválidos, já tentei de tudo e o incrível é que se eu upar pelo site da anvisa funciona ok, testei o código do jair molina acima e deu o mesmo erro vou anexar o xml e o zip além de postar o código que estou usando se alguém tiver uma luz eu agradeço demais.

procedure TfrmSNGPC2.btnEnviarClick(Sender: TObject);
var
  arr : TByteDynArray;
  xml : TXMLDocument;
  msg : IXMLMensagemSNGPCType;
  ws : sngpcSoap;
  HashIdentificacao : String;
  Retorno : String;
  Stream : TStringStream;
  afile: file of byte;
  buffer: TByteArr;  // array of byte;
  i: Integer;
  Arq : TFileStream;
  aArray : TByteDynArray;
  x : string;
  teste :  AnsiString;
begin
  if MessageDlg('Deseja Enviar Arquivo ['+Arquivo+'] Para SNGPC ?', mtWarning, [mbYes, mbNo], 0) <> mrYes then
    abort;
  //
  xml := TXmlDocument.Create(nil);
  xml.Active := False;
  xml.FileName := '';
  //
  // Transmissao do Arquivo para Anvisa
  //
  if rgMetodo.ItemIndex = 0 then
  begin
    ArquivoZip := ChangeFileExt(Arquivo,'.ZIP');
    AbZipper1.FileName := ArquivoZip;
    AbZipper1.AddFiles(Arquivo,0);
    AbZipper1.Save;
    AbZipper1.CloseArchive;
    //
    AssignFile(afile, ArquivoZip);
    Reset(afile);
    SetLength(buffer, FileSize(afile));
    For i := 1 to FileSize(afile) do
      Read(afile, buffer[i - 1]);
    CloseFile(afile);
  end;
  //
  //
  //
  if rgMetodo.ItemIndex = 1 then 
  begin
    tsqZip1.ZipFileName := ChangeFileExt(Arquivo,'.ZIP');
    tsqZip1.FilesToZip.Add(Arquivo);
    tsqZip1.Execute;
  end;
  //
  xml.LoadFromFile(Arquivo);
  //
  if cbhomologacao.Checked then
  begin
    HTTPRIO1.URL          := 'http://homologacao.anvisa.gov.br/sngpc/webservice/sngpc.asmx';
    HTTPRIO1.WSDLLocation := 'http://homologacao.anvisa.gov.br/sngpc/webservice/sngpc.asmx?wsdl';
  end
  else
  begin
    HTTPRIO1.URL          := 'http://sngpc.anvisa.gov.br/webservice/sngpc.asmx';
    HTTPRIO1.WSDLLocation := 'http://sngpc.anvisa.gov.br/webservice/sngpc.asmx?wsdl';
  end;
  HTTPRIO1.Service      := 'sngpc';
  HTTPRIO1.Port         := 'sngpcSoap';
  //
  ws := HTTPRIO1 as sngpcSoap;
  //
  Retorno := ws.ValidarUsuario(cxDBTextEdit1.Text, cxDBTextEdit2.Text);
  Memo1.Lines.Add('Validação: '+retorno);
  //
  if Retorno = 'Ok' then
  begin
    //
    HashIdentificacao:= MD5Print(MD5String(xml.XML.text));
    //
    Memo1.Lines.Add(DateTimeToStr(now));
    Memo1.Lines.Add('===Envio===');
    memo1.lines.Add('Hash: '+HashIdentificacao);
    memo1.Lines.Add('Arquivo: '+ArquivoZip);
    //
    // showmessage(xml.XML.Text);
    //
    if rgMetodo.ItemIndex = 0 then
      Retorno := ws.EnviaArquivoSNGPC(cxDBTextEdit1.Text, cxDBTextEdit2.Text, CopyByteArray(buffer), HashIdentificacao);
    if rgMetodo.ItemIndex = 1 then
      Retorno := ws.EnviaArquivoSNGPC(cxDBTextEdit1.Text, cxDBTextEdit2.Text, FIleToByteArray(ArquivoZip), HashIdentificacao);
    Memo1.Lines.Add('Envio: '+retorno);
    //
    //                       1234567890123456789012345678
    //
    if copy(Retorno,1,28) = 'Arquivo recebido com sucesso' then
      Memo1.Lines.Add('Arquivo '+ArquivoZip+' Enviado Com Sucesso')
    else
      Memo1.Lines.Add('Falha no Envio do Arquivo '+ArquivoZip);
    //
  end
  else
  begin
    Memo1.Lines.Add('Falha no Envio do Arquivo '+Arquivo);
  end;
  //
  Memo1.Lines.Add('');
  //
  Arquivo := '';
  edtArquivo.Text := Arquivo;
  // Fim da Rotina de Transmicao
 
end;

SNGPCInventario10062013.XML

SNGPCInventario10062013.ZIP

SNGPCInventario10062013.XML

SNGPCInventario10062013.ZIP

Link para o comentário
Compartilhar em outros sites

Olá Francisco,

 

Já consegui enviar e validar o inventário inicial e as movimentações de entrada e saída.

Precisando de ajuda é só falar.

 

 

Boa noite, estou concluindo a primeira parte do componente que trata das classes de informações do SNGPC (Movimentação e Inventário). Já é possível gerar os XML's com base nas informações do componente. Até amanhã eu já terei feito todos os testes junto a ANVISA. Ainda não fiz a comunicação com os Webservices, estou enviando os arquivos diretamente pelo site para testar, essa será a próxima etapa. Caso alguém se interesse pelo que já fiz é só pedir que mando o projeto.

 

 

Boa noite, coloquei os fontes do componente em: https://sourceforge.net/projects/sngpc/files/latest/download?source=files

Como não tive muito tempo eu criei as classes para inclusão dos dados e gerão dos arquivos somente. Não tive tempo de fazer nenhuma rotina validação dos dados e nem as rotinas de consumo dos WebServices, caso alguém se habilite pode ficar a vontade. Tá difícil enviar dados para ANVISA pois os serviços estão muito instáveis.

 

 

Que a Anvisa iria ferrar com todos os programadores isso eu já sabia.

Ontem tentando transmitir o Inventario de um cliente, depois de muito tentar e não conseguir pelo programa,

acabei enviando diretamente pelo site e deu certo.

Voltando ao programa descobri que o webservice do SNGPC de homologação está diferente do de produção

Homologação : http://homologacao.anvisa.gov.br/sngpc/webservice/sngpc.asmx?WSDL

Produção : http://sngpc.anvisa.gov.br/webservice/sngpc.asmx?WSDL

Tentando adequar o programa para envio, a aplicação trava, então estou tentando fazer um procedimento mais simples que é

checar se a senha do usuário está correta

Mesmo assim não consegui fazer funcionar, a aplicação trava.

Postei aqui o código para que os colegas com mais experiência consigam ajudar.

procedure TSge078b.BitBtn1Click(Sender: TObject);

var

  Ws: SngpcSoap;

  ChecaUsu: ValidarUsuario;

  MensRet: ValidarUsuarioResponse;

begin

  ChecaUsu:= ValidarUsuario.Create;

  ChecaUsu.Email:= '[email protected]';

  ChecaUsu.Senha:= 'senha';

  MensRet:= ValidarUsuarioResponse.Create;

  Ws:= GetSngpcSoap;

  try

    MensRet:= Ws.ValidarUsuario(ChecaUsu);

    Mensagem(MensRet.ValidarUsuarioResult);

    Self.Close;

  except

    Mensagem('Não foi possível enviar o arquivo XML. Verifique se sua conexão com a internet está funcionando');

  end;

end;

Bom dia, o componente para SNGPC está em que nível, já foram feitos testes? Gostaria de maiores informações e se possivel receber o componente para colaborar. Meu email [email protected]

Editado por allancmello
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
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.

 

Link para o comentário
Compartilhar em outros sites

Olá pessoal, eu consegui avançar bastante no componente do SNGPC, porém acabei por não dar continuidade devido as dificuldades de fazer os testes na Anvisa, e depois me envolvi em outros projetos também. Alguém chegou a usar o componente? Eu achei uma solução mais simples para meu software pois descobri que o laboratório Teuto fornece o aplicativo para SNGPC gratuitamente, ai entao eu exporto os dados para a base de dados deles e o aplicativo faz o resto. Não temos muitas farmácias em nossa carteira de clientes e optamos por não colocar a função do SNGPC em nosso aplicativo.

Link para o comentário
Compartilhar em outros sites

Renan Garcia de Oliveira 

segue o rotina e exemplo para vc resolver o seu problema

 

 

//Função para Remover Caracter de uma string;
function TFormGerarETransmiteXML.RemoveAcento(Str: string): string;
const ComAcento = 'àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ.';
      SemAcento = 'aaeouaoaeioucuAAEOUAOAEIOUCU ';
var x: Integer;
begin;
  for x := 1 to Length(Str) do
    if Pos(Str[x],ComAcento) <> 0 then Str[x] := SemAcento[Pos(Str[x], ComAcento)];
  Result := Str;
end;
 
      vLinha:= '                    <nomePrescritor>'+RemoveAcento(QVenda.FieldByName('NOME').AsString)+'</nomePrescritor>'; 
 

Att
Rodrigo Guelf
 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Faz um teste, onde você deva utilizar um tstringlist no loadfromfile se for do delphi 2009 pra cima adicionei mais um parâmetro além do nome do arquivo separando por virgula

LoadFromFile('c:\sxx', Tenconding.utf8)

 

veja se resolve seu problema

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Link para o comentário
Compartilhar em outros sites

É 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'.

Voce ja tentou gerar o Hash com indy

pode não funcionar 

mas vale a pena tentar

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Oi Fabio,

 

Obrigado por sua boa intenção ao doar os fontes...

 

Mas mesmo a tarefa de transformar um fonte em componente do ACBr não é simples, e se depender de algum desenvolvedor ativo, provavelmente ela não ocorra tão cedo...

 

Se tiver disposição de você mesmo terminar os passos necessários, ai sim, fica mais fácil para outros desenvolvedores do ACBr lhe ajudar...

Exemplos: (não sei se algo aqui se aplica a seus fontes, pois nem mesmo os analisei)

- Remover a dependências de Units específicas de uma versão do Delphi e/ou de API do Windows

- "Assinar" todos os fontes do componente com o cabeçalho da licença LGPL

- Usar nomenclatura de classes como demais componentes do projeto, Ex: TACBrAlgumaCoisa

- Criar um projeto de Demo com o intuito de Testar o componente e Treinar os novos usuários (demonstrar o uso)

- Criar um Package, com Imagem...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Consultores

Só lembrando, que se alguém mais quiser fazer o que o Daniel disse, seria bom também.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

É 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'.

Você ainda tem problemas com o envio ?

 

Sérgio

Equipe ACBr Sérgio Assunção
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

[email protected]

Link para o comentário
Compartilhar em outros sites

Bom dia, amigos, estou convertendo este componente para lazarus, este do link

 

http://sourceforge.net/projects/sngpc/files/

 

gostaria de saber se tem versão nova dele ou alguma alteração, vou manter a compatibilidade com os comando dos xml do delphi, AddChild, Attributes, ChildValues, talvez seria um bom começo para a reutilização no ACBR.

 

Att.

Anderson Junior

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2472 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...