terça-feira, 10 de agosto de 2010

Quebra de linha

Uma informação que parece não estar clara para todos, é a forma de se fazer quebras de linha no arquivo XML. Muitas pessoas tem se confundido com o que existe no manual de importação de lote de RPS por arquivos TXT. Tenham em mente que o lote no formato TXT é uma especificação feita pela própria prefeitura, portanto quem define suas regras é ela mesma, quando que o lote via webservice (e arquivo XML), quem define é a ABRASF, portanto a prefeitura TEM que seguir as regras definidas por ela (Modelo Nacional). Como dizia minha avó: "Uma coisa é uma coisa e outra coisa é outra coisa".

Então na hora de fazer alguma coisa nos lotes com arquivos XML, não procurem informações no manual do lote TXT, vocês só vão se confundir.

Respondendo à pergunta, a forma de se fazer a quebra de linha no arquivo XML é incluindo-se os caracteres de término de linha e o caractere de retonno de carga.

Exemplo:
...
Dim discriminacao as String
discriminacao = "Dados de Serviço:" & chr(13) & chr(10)
discriminacao = discriminacao & "Esse serviço possui quebra de linha"
...

Desta forma ao se imprimir a NFS-e o campo discriminação irá possuir duas linhas.

7 comentários:

  1. Olá Apoena, tudo bem?

    Você saberia informar se existe alguma maneira de imprimir dinamicamente a NFSe.

    Um dos motivos seria o fato de que algumas informações, que aparecem no layout do site NotaCarioca em produção, não são enviados via consulta pelo WebService. O campo "Observação" no rodapé da NFSe é um exemplo, muda da acordo com algumas regras pré-definidas pela prefeitura.

    Isso afeta diretamente a impressão da NFSe localmente usando os dados retornados pela consulta via Webservice, pois não posso garantir que a impressão da NFSe feita pelo usuário seja igual à NFSe prouzida pelo site NotaCarioca. Pra um escritório que gera uma alto número de Notas se torna inviável imprimir pelo site e ficar separando depois.

    Se algué ja tiver passado por esse problema e tiver ums solução em .Net por gentileza me repassem, pois é de extrema importância. Um código .Net que gere pdf através de uma url usando algum componente free também seria uma alternativa.

    Muito Obrigado!

    Willie Lucena

    ResponderExcluir
  2. Vou levantar essa dúvida com o pessoal de atendimento da prefeitura.. Caso haja uma novidade, eu crio um novo post. Abraços, Apoena...

    ResponderExcluir
  3. Ola Apoema. Como vai?

    Estou desenvolvendo uma aplicação para geração e envio do XML com RPS e estou barrando em um problema no momento da autenticação da transmissão.

    Conversando com a equipe da prefeitura, eles me disseram que a forma correta para autenticar a transmissão seria utilizando:

    ClientCertificates.Add(certificado);

    No projeto exemplo disponibilizado, vi que você utiliza uma outra forma:

    ClientCredentials.ClientCertificate.Certificate = certificado;

    Quando tento utilizar a forma indicada pela equipe da prefeitura, o visual studio não identifica a definição do ClientCertificates.

    Quando utilizo a forma como está sendo utilizada no projeto, recebo o erro na execução do método:

    NfseSoapClient.RecepcionarLoteRps

    O erro é o seguinte:

    System.ServiceModel.Security.MessageSecurityException was unhandled

    Message="A solicitação HTTP está proibida com o esquema de autenticação de cliente 'Anonymous'."
    [...]
    InnerException: System.Net.WebException

    Message="O servidor remoto retornou um erro: (403) Proibido."
    Source="System"

    Será que você poderia me dar alguma dica para poder resolver este problema?

    Abs,
    Luiz Eduardo

    ResponderExcluir
  4. Luiz... Estive bem atarefado nas ultimas semanas. Assim que tiver um tempinho, tento analisar esse problema...

    ResponderExcluir
  5. Vc tentou usar o cliente de teste que eu disponibilizo no blog? Gera algum erro com ele? Eu testei aqui e o comportamento foi normal... Não recebi o erro 403... Como vc utiliza seu certificado? Ele é um token plugado na USB ou está instalado na máquina? Vc está fornecendo a chave priva dele na hora que informa o certificado? Tente acessar o link do serviço da mesma maquina que está com o cliente (https://notacarioca.rio.gov.br/wsnacional/nfse.asmx). Veja se seu browser solicita a chave ou se ele já acessa normalmente. O certificado deve ser incluído no canal da mesma forma que o browser inclui...

    No caso, pelo que eu vi na documentação, a forma mais correta de se adicionar o certificado no canal de comunicação é:
    ObjetoReferenciaWS.ClientCertificates.Add(VariavelCertificado);

    Vou dar uma olhada no projeto de exemplo para deixa-li dessa forma (em breve).

    ResponderExcluir
  6. Luiz... Dei uma olhada melhor e pesando de uma outra forma tentei criar um projeto com o VS 2005 e o .Net Framework 2.0...

    Aparentemente tudo era igual mas a classe que o VS criou ao referenciar o WS ficou BEEEEM diferente... Nesse ambiente não conseguia fazer o ADD do certificado no ClientCertifocates, a única forma que encontrei foi do modo que vc citou anteriormente aí passei a receber esse erro 403...

    Consegui contornar esse problema, na classe gerada pelo VS que implementa uma interface "SoapHttpClientProtocol" com a referencia ao próprio WS. No construtor da classe, alterei uma propriedade privada "useDefaultCredentialsSetExplicitly" para “True” e uma propriedade pública "UseDefaultCredentials" para "FALSE" , pois credencial padrão continha as minhas credenciais de rede (???) e aí tudo funcionou bem.

    Espero ter ajudado,

    Apoena...

    ResponderExcluir
  7. Bom dia, eu não consigo nem referenciar o certificado como no exemplo e muito menos tenho uma classe que implementa "SoapHttpClientProtocol".
    Alguma sugestão?

    ResponderExcluir