Ir para conteúdo
  • Cadastre-se

dev botao

Quebra de Linha em Detalhamentos e Observações


Ver Solução Respondido por Diogo Loff,

Recommended Posts

Postado

Olá! Pessoal!

Mais a titúlo de duvida, até então a versão da NFe que estava usando estava com padrão default sempre sendo a quebra de linha o pipe "|", agora não mais, pelo que vi esta o ";".

Bom eu ajustei a propriedade para continuar sendo o pipe pois em todo meu sistema estas informações são gravadas já assim no banco de dados.

A pergunta que quero fazer é, existe algum problema continuar usando pipe? Dei uma busca no forum e vi várias discuções uns falando para não usar mais o pipe, outros falando para usar o sLineBreak, em fim mas sem nenhuma explicação do motivo.

Postado

A certo estão padronizando tudo com Pipe isto é ótimo, sempre usei assim, mas para mim eu já não estava tendo problemas até ontem atualizar a versão. Nas observações da NF parou de funcionar o Pipe. Inclusive fazendo testes mesmo forçando não esta aceitando para este campo. Entre Pedido e Qtde de Peças deveria ter quebrado e não impresso os Pipes, a versão que eu tinha era de Jan/24 do ACBr e estava ok. Tive que atualizar devido a mudanças nas  tags de credito presumido aqui em SC.

 

image.thumb.png.996017d5b0d1e3316863dc4e7f083ee1.png

Postado

Bom dia então identificando aqui, acho que é algo com o report em fast ou algum bug. Não lembrava mais como aqueles campos era montados e eles são montados na tag InfAdic como xCampo e xTexto, o Pipe não esta sendo colocado pelo sistema e sim é dentro do ACBr na rotina da unit ACBrDFEDANFeReport procedimento da linha 489. Aqui ele percorre os campos e vai colocando o Pipe, porem na impressão por algum motivo não esta mais quebrando, a versão de Jan/24 na mesma rotina estava colocando ';'  IfThen((i = (obsCont.Count - 1)), '', ';'); provavelmente em algum local não esta entendendo mais isto ai.

function TACBrDFeDANFeReport.ManterInfContr(ANFe: TNFe): String;
  // Informações de uso livre do contribuinte com "xCampo" e "xTexto"
var
  i: Integer;
begin
  Result := '';
  if FImprimeInfContr then
  begin
    with ANFe.InfAdic do
    begin
      if obsCont.Count > 0 then
      begin
        for i := 0 to (obsCont.Count - 1) do
        begin
          Result := Result +
            obsCont.Items[i].xCampo + ': ' +
            obsCont.Items[i].xTexto +
            IfThen((i = (obsCont.Count - 1)), '', CaractereQuebraDeLinha);
        end;

        Result := Result + CaractereQuebraDeLinha + ' ';
      end;
    end;
  end;
end;

 

Postado

Ja encontrei o problema segue sugestão:

 

Na Unit ACBrNFeDANFEFRDM.pas procedimento "TACBrNFeFRClass.CarregaInformacoesAdicionais" linha 1492 estava fixo ainda ';' ponto e virgula, troquei pela variavel da quebra . 

 

Antes:

Campos := Split(';', wObs);

 

Agora:

Campos := Split(FDANFEClassOwner.CaractereQuebraDeLinha, wObs); // não atende devido ser char

Este seria o ideal, porem o Splti é char, e o caractere de quebra pode ser composto, para resolver meu problema fixei o Pipe "|". Poderia ser um StringReplace antes por #13, para depois usar o split, mas ai ferra com as observações que estão em texto corrido, estas estão já usando #13. Então tem que avaliar melhor uma solução mais completa. Vou deixar para vocês que são feras e conhecem o componente como ninguem.

Campos := Split('|', wObs); // deixei fixo.

 

Segue anexo o fonte.

 

Aproveitando neste fonte tem uma adequação que a tempos venho fazendo, não sei se cabe para vocês ajustarem, mas tem realação quando é indicado evento de indicação de transportador que vem sempre a observação com acentuações, na impressão do evento fica tudo bagunçado a parte textual. Caso queiram ajustar.

procedure TACBrNFeFRClass.CarregaDadosEventos; linha 1981.

Antes:

FieldByName('xCondUso').AsString  := CondicoesUso;

 

Agora:

FieldByName('xCondUso').AsString  := UTF8ToNativeString(CondicoesUso);

ACBrNFeDANFEFRDM.zip

  • Consultores
Postado

Bom dia,

Criada a TK-6038 para avaliação.

Obrigado pela contribuição.

  • Curtir 1
Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

Postado

Bom dia,

Estamos com a seguinte situação:

Ao chamar a função ACBrNFe.NotasFiscais.Items[0].Imprimir está sendo realizada a seguinte pilha de chamadas de funções:

image.thumb.png.1290e3ca7e913cda5708a8fd6de1c47a.png

 

A última função TACBrDFeDANFeReport.CaractereQuebraDeLinha está desta maneira:

function TACBrDFeDANFeReport.CaractereQuebraDeLinha: String;
begin
  Result := TACBrNFe(ACBrNFe).Configuracoes.WebServices.QuebradeLinha;
end;

Fazendo um trace into nesta chamada está indo para TACBrNFe.GetConfiguracoes da Unit ACBrNFe (linha 475):

function TACBrNFe.GetConfiguracoes: TConfiguracoesNFe;
begin
  Result := TConfiguracoesNFe(FPConfiguracoes);
end;

Ao tentar executar esta linha, está ocorrendo a seguinte exception:

image.png.e864d648fb2e6090a2aeeed90dd865f1.png

 

Acredito que seja algo relacionado à este tópico, pois está relacionado à quebra de linha, porém não consegui encontrar onde fazer a correção.

Postado (editado)

Boa tarde, peguei mais uma situação e fiz outra correção em outro arquivo que segue anexo ACBrDFeDANFeReport.

Na função TACBrDFeDANFeReport.ManterInfAdFisco(ANFe: TNFe): String; linha 442.

Tem uma verificação assim:

if infAdFisco > '' then
  begin
    if ANFe.InfAdic.infCpl > '' then
      Result := infAdFisco + IfThen(Copy(infAdFisco, Length(infAdFisco), 1) = CaractereQuebraDeLinha, '', CaractereQuebraDeLinha + ' ')
    else
      Result := infAdFisco;
  end;

Ela somente verifica se tem a infCpl preenchida para forçar a quebra de linhas nas observações, porem tem mais blocos posteriores a este, e se por acaso eu tenho algum outro preenchido mas o "infCpl" não, acaba ficando tudo na mesma linha.

 

Modifiquei assim:

function TACBrDFeDANFeReport.ManterInfAdFisco(ANFe: TNFe): String;
  // Informações de interesse do fisco
var
  infAdFisco: string;
  obsSequencia: Boolean;
begin
  Result := '';
  infAdFisco := RemoverQuebraLinhaFinal(ANFe.InfAdic.infAdFisco);
  obsSequencia := (ANFe.InfAdic.infCpl > '') or (ANFe.InfAdic.obsFisco.Count > 0) or (ANFe.InfAdic.procRef.Count > 0) or (ANFe.InfAdic.obsCont.Count > 0);

  if infAdFisco > '' then
  begin
    if obsSequencia then
      Result := infAdFisco + IfThen(Copy(infAdFisco, Length(infAdFisco), 1) = CaractereQuebraDeLinha, '', CaractereQuebraDeLinha)
    else
      Result := infAdFisco;
  end;
end;

Criei uma variavel boolean somente para simplicar a comparação e coloquei todos os que estão baixo (ANFe.InfAdic.infCpl > '') or (ANFe.InfAdic.obsFisco.Count > 0) or (ANFe.InfAdic.procRef.Count > 0) or (ANFe.InfAdic.obsCont.Count > 0);

Na atribuição inicial da variavel removi a quebra de linha do final, pois pode ser que esteja vindo do sistema com #13#10 no final e se vir assim irá acabar ficando com duas quebras após a mofidicação.

Eu conferi as outras rotinas e elas todas estão adicionando a quebra sempre que possuirem dados, somente nesta que é uma das primeiras que não estava correto.

Também removi um espaço em branco que estava sempre colocando ao final.

ACBrDFeDANFeReport.zip

Editado por Diogo Loff
erro
Postado
16 horas atrás, Daniel Simoes disse:

O Pipe é o novo padrão de quebra de linha dos componentes DFe... Se você não configurar outro, ele que será utilizado...

@Juliomar Marchetti, veja o tópico abaixo:

 

 

2 horas atrás, Infoel disse:

Bom dia,

Estamos com a seguinte situação:

Ao chamar a função ACBrNFe.NotasFiscais.Items[0].Imprimir está sendo realizada a seguinte pilha de chamadas de funções:

image.thumb.png.1290e3ca7e913cda5708a8fd6de1c47a.png

 

A última função TACBrDFeDANFeReport.CaractereQuebraDeLinha está desta maneira:

function TACBrDFeDANFeReport.CaractereQuebraDeLinha: String;
begin
  Result := TACBrNFe(ACBrNFe).Configuracoes.WebServices.QuebradeLinha;
end;

Fazendo um trace into nesta chamada está indo para TACBrNFe.GetConfiguracoes da Unit ACBrNFe (linha 475):

function TACBrNFe.GetConfiguracoes: TConfiguracoesNFe;
begin
  Result := TConfiguracoesNFe(FPConfiguracoes);
end;

Ao tentar executar esta linha, está ocorrendo a seguinte exception:

image.png.e864d648fb2e6090a2aeeed90dd865f1.png

 

Acredito que seja algo relacionado à este tópico, pois está relacionado à quebra de linha, porém não consegui encontrar onde fazer a correção.

Então não tive nenhum problema assim, atualizei os fontes ontem, somente mesmo esta questão da quebra das observações que esta meio estranha, fora isto nada. Geralmente estes erros assim de AccessViolation após atualizar o ACBr é porque faltou algum passo na atualização. Eu por exemplo sempre removo o ACBr de dentro dos pacotes do delphi, depois executo o bat para remover todos os dcu e depois rodo o instalador.

Por exemplo nesta versão comparada a que eu usava em janeiro teve modificações nas libs por padrão a capicom não esta mais ativa e inclusive da um erros no componente, eu tive que abrir as unit por exemplo que usa o ACBrNFe e atualizar o componente, pois estava dando erros de properties, salvar novamente a tela e recompilar. 

  • Curtir 1
Postado

Só conseguimos fazer funcionar com a seguinte alteração no arquivo ../ACBr/Fontes/ACBrDFe/ACBrNFe/DANFE/ACBrDFeDANFeReport.pas:

image.thumb.png.8c3f937fbfd733c0e14ae13fb18d74ec.png

Obs: Ao fazer alterações nos arquivos .pas do ACBr para testar, é necessário executar o instalador para compilar os arquivos .dcu. Caso não seja executado o instalador as modificações serão ignoradas.

Postado

Aqui esta perfeito, no seu caso se ali esta dando erro de acessviolation é sinal que o objeto não esta vindo correto, provavelmente ficou alguma coisa errada na atualização dos fontes e instalação do componente. Ou também você tem algum path lá no libary do Delphi apontando para alguma versão do ACBr diferente.

Postado (editado)

Não seria possível, foi executado o script do .bat de remover arquivos para todas as unidades, foi excluído toda a pasta do ACBr (com excessão da pasta .svn), puxado os arquivos denovo, executado o instalador e o path só está apontado para a pasta Acbr\Lib\Delphi\LibD7\Win32. Se tiver mais algum passo podemos testar para ver se corrige.

Editado por Infoel
Postado
Em 01/10/2024 at 09:28, Diogo Loff disse:

Ja encontrei o problema segue sugestão:

 

Na Unit ACBrNFeDANFEFRDM.pas procedimento "TACBrNFeFRClass.CarregaInformacoesAdicionais" linha 1492 estava fixo ainda ';' ponto e virgula, troquei pela variavel da quebra . 

 

Antes:

Campos := Split(';', wObs);

 

Agora:

Campos := Split(FDANFEClassOwner.CaractereQuebraDeLinha, wObs); // não atende devido ser char

Este seria o ideal, porem o Splti é char, e o caractere de quebra pode ser composto, para resolver meu problema fixei o Pipe "|". Poderia ser um StringReplace antes por #13, para depois usar o split, mas ai ferra com as observações que estão em texto corrido, estas estão já usando #13. Então tem que avaliar melhor uma solução mais completa. Vou deixar para vocês que são feras e conhecem o componente como ninguem.

Campos := Split('|', wObs); // deixei fixo.

 

Segue anexo o fonte.

 

Aproveitando neste fonte tem uma adequação que a tempos venho fazendo, não sei se cabe para vocês ajustarem, mas tem realação quando é indicado evento de indicação de transportador que vem sempre a observação com acentuações, na impressão do evento fica tudo bagunçado a parte textual. Caso queiram ajustar.

procedure TACBrNFeFRClass.CarregaDadosEventos; linha 1981.

Antes:

FieldByName('xCondUso').AsString  := CondicoesUso;

 

Agora:

FieldByName('xCondUso').AsString  := UTF8ToNativeString(CondicoesUso);

ACBrNFeDANFEFRDM.zip 17.33 kB · 0 downloads

Neste item coloquei uma sugestão da parte dos eventos para converter o encoding. Não precisa mais, de alguma forma na versão nova esta vindo correto, provavelmente foi ajustado em outro ponto.

  • Consultores
Postado
On 10/1/2024 at 4:12 PM, Infoel said:

Só conseguimos fazer funcionar com a seguinte alteração no arquivo ../ACBr/Fontes/ACBrDFe/ACBrNFe/DANFE/ACBrDFeDANFeReport.pas:

image.thumb.png.8c3f937fbfd733c0e14ae13fb18d74ec.png

Obs: Ao fazer alterações nos arquivos .pas do ACBr para testar, é necessário executar o instalador para compilar os arquivos .dcu. Caso não seja executado o instalador as modificações serão ignoradas.

Boa tarde @Infoel.

Por favor, pode disponibilizar um MVP que simule o problema?

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado

Bom dia @Diogo Loff.

Primeiro de tudo, muito obrigado pela contribuição!

Toda colaboração é e sempre será mais do que bem vinda.

Estou analisando as contribuições que disponibilizou.

Na unit ACBrNFeDANFEFRDM.pas, você sugeriu modificar no Split o ponto e vírgula(;) pelo pipe(|).

Para este caso, eu entendo que isso acabaria chumbando o pipe e não respeitaria a config propriamente dita.

Eu substitui o Split pelo StringReplace direto(conforme foi feito com o CT-e em situação semelhante).

Fiz um teste em meu ambiente e parece estar tudo certo, mas por garantia, também pedi um apoio ao pessoal que possui a versão indicada do Fast Report(não aquela que vem no GetIt) para que também façam um teste antes de disponibilizar.

Na unit ACBrDFeDANFeReport.pas, você sugeriu uma modificação que faz a quebra em casos que haja o infAdic, não tenha o infCpl, mas tenha outras informações posteriormente.

Por favor, pode disponibilizar um exemplo de como está no XML que ocorreu o problema?

Em meus testes estou utilizando um XML que está desta forma:

<infAdic>
  <infAdFisco>InfAdFisco: PED123; PED465; ;|</infAdFisco>
  <obsCont xCampo="ObsCont-Ped132;|">
    <xTexto>ObsCont-Texto; Text2; Texto3|</xTexto>
  </obsCont>
  <obsFisco xCampo="ObsFisco-Ped123|">
    <xTexto>ObsFisco-Texto; Texto2; Texto3;|</xTexto>
  </obsFisco>
  <procRef>
    <nProc>02/2024</nProc>
    <indProc>4</indProc>
    <tpAto>14</tpAto>
  </procRef>
</infAdic>

(tem ponto e vírgula e pipe para testar a configuração).

Em meus testes com o Fortes, tanto no impresso em retrato quanto no impresso em paisagem, não vi diferença aplicando a alteração para o que já está no SVN.

Nos prints abaixo, a parte de cima é com a unit do SVN e a de baixo é com a alteração sugerida:

Retrato.jpgPaisagem.jpg

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Postado

Opa boa tarde @Diego Foliene!

Sim quando a questão do Pipe eu mesmo coloque fixo porque como disse o split não resolvia ai só resolveu pra mim, acredito que da forma como vc fez é o correto.

 

Quando as observações que ficam ali erradas quando tem mais observações em sequencia, vou remover a alteração e te mandar o XML e o print da impressão para você ver o que acontece.

  • Consultores
Postado
4 minutes ago, Diogo Loff said:

Quando as observações que ficam ali erradas quando tem mais observações em sequencia, vou remover a alteração e te mandar o XML e o print da impressão para você ver o que acontece.

Combinado, fico no aguardo.

Caso ache que tenha informações sensíveis e não possa ser enviado direto aqui, envie para [email protected] com o link do tópico do fórum no corpo do e-mail por favor.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Solution
Postado
17 horas atrás, Diego Foliene disse:

Combinado, fico no aguardo.

Caso ache que tenha informações sensíveis e não possa ser enviado direto aqui, envie para [email protected] com o link do tópico do fórum no corpo do e-mail por favor.

Bom dia, segue aqui o que acontece com o fonte original. O XML mandei por e-mail, pois tem dados de cliente.

 

Se estou emitindo a NFe não valido na receita e tento imprimir, ela fica correta:

image.thumb.png.d4cbcfba3af0e31d7421495d31dd5acc.png

 

Porem após validar na receita ela fica errada, concatenando a ultima observação na sequencia:

image.thumb.png.55366def30eb83e25bbd05fbcb734788.png

 

Aqui neste exemplo com o fonte original isto somente não acontece se informar uma observação no campo "InfAdic.infCpl". Se eu NÃO informar neste campo, e informar no primeiro "InfAdic.infAdFisco" e depois informar em outros InfAdic.obsFisco, InfAdic.procRef ou InfAdic.obsCont, qualquer um destes vai concatenar na "InfAdic.infAdFisco" após validar o XML.

No exemplo estou informando infAdFisco e duas observações no obsCont.

Com a customização que fiz este problema não acontece mais.

  • Curtir 1
  • Consultores
Postado
On 10/10/2024 at 8:48 AM, Diogo Loff said:

Bom dia, segue aqui o que acontece com o fonte original. O XML mandei por e-mail, pois tem dados de cliente.

 

Se estou emitindo a NFe não valido na receita e tento imprimir, ela fica correta:

image.thumb.png.d4cbcfba3af0e31d7421495d31dd5acc.png

 

Porem após validar na receita ela fica errada, concatenando a ultima observação na sequencia:

image.thumb.png.55366def30eb83e25bbd05fbcb734788.png

 

Aqui neste exemplo com o fonte original isto somente não acontece se informar uma observação no campo "InfAdic.infCpl". Se eu NÃO informar neste campo, e informar no primeiro "InfAdic.infAdFisco" e depois informar em outros InfAdic.obsFisco, InfAdic.procRef ou InfAdic.obsCont, qualquer um destes vai concatenar na "InfAdic.infAdFisco" após validar o XML.

No exemplo estou informando infAdFisco e duas observações no obsCont.

Com a customização que fiz este problema não acontece mais.

Boa tarde!

Arquivos recebidos!

De fato, o comportamento foi observado no impresso quando em paisagem.

Adotando sua contribuição, deixou de ocorrer.

Fiz um teste com o layout em retrato e o mesmo não foi afetado.

Contribuição enviada ao SVN na Rev-35594.

Por favor, queiram atualizar seus fontes, reinstalar o ACBr para realizar novos testes e reportar qualquer problema.

  • Curtir 1
Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

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