Ir para conteúdo
  • Cadastre-se

dev botao

Perda de informação no corpo do relatorio gerencial


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

Recommended Posts

  • Membros Pro

Bom dia,

Identificamos em nossos testes internos que, em alguns casos, o conteúdo do relatório gerencial está sendo cortado durante a impressão. Nós estamos chamando a impressão através da "ACBrECF.RelatorioGerencial(ECF_lstRG, Vias, Indice);". O estranho é que não são todos os relatórios em que ocorre a perda de informação.

Em debug, notamos que o problema ocorre na procedure "TACBrECF.LinhaRelatorioGerencial", precisamente na linha "SL.Text := Buffer ;":

if MaxLinhasBuffer < 1 then
   begin
     ComandoLOG := 'LinhaRelatorioGerencial( "'+Linha+'", '+IntToStr(IndiceBMP)+' )';
     fsECF.LinhaRelatorioGerencial( DecodificarTagsFormatacao( Linha ), IndiceBMP ) ;
   end
  else
   begin
     Texto  := '' ;
     Buffer := DecodificarTagsFormatacao( Linha );
     Buffer := AjustaLinhas(Buffer, Colunas) ;
     SL     := TStringList.Create ;
     try
        SL.Text := Buffer ;

        For Lin := 0 to SL.Count - 1 do
        begin
           Texto := Texto + SL[Lin] + sLineBreak;

           if (Lin mod MaxLinhasBuffer) = 0 then
           begin
              TentaImprimirLinhas( Texto, IndiceBMP ) ;
              Texto := '' ;
           end ;
        end ;

        if Texto <> '' then
           TentaImprimirLinhas( Texto, IndiceBMP ) ;
     finally
        SL.Free ;
     end ;
   end ;

Conseguimos contornar o problema trocando o "SL.Text := Buffer ;" por "SL.add(Buffer);", ficando o trecho acima da seguinte forma:

  if MaxLinhasBuffer < 1 then
   begin
     ComandoLOG := 'LinhaRelatorioGerencial( "'+Linha+'", '+IntToStr(IndiceBMP)+' )';
     fsECF.LinhaRelatorioGerencial( DecodificarTagsFormatacao( Linha ), IndiceBMP ) ;
   end
  else
   begin
     Texto  := '' ;
     Buffer := DecodificarTagsFormatacao( Linha );
     Buffer := AjustaLinhas(Buffer, Colunas) ;
     SL     := TStringList.Create ;
     try
        //SL.Text := Buffer ;
        SL.add(Buffer);

        For Lin := 0 to SL.Count - 1 do
        begin
           Texto := Texto + SL[Lin] + sLineBreak;

           if (Lin mod MaxLinhasBuffer) = 0 then
           begin
              TentaImprimirLinhas( Texto, IndiceBMP ) ;
              Texto := '' ;
           end ;
        end ;

        if Texto <> '' then
           TentaImprimirLinhas( Texto, IndiceBMP ) ;
     finally
        SL.Free ;
     end ;
   end ;

Gostaríamos da opinião de vocês.

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@Intelliware

Você está com os fontes atualizados?

Estamos aplicado varias alterações no tratamento das strings.

Veja se consegue identificar o conteúdo que é perdido, pode haver uma quebra de linha nesse texto ou outro carácter causando isso.

Foram aplicadas varias alterações nas funções do ACBrUtil e pode sim ter causado algum resultado diferente do esperado.

Se tentar identificar o ponto passa ai pra gente te ajudar a resolver.

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Daniel, fizemos os testes com sua atualização, mas não resolveu. Uma informação que ficou faltando na postagem é que o problema ocorreu em um ECF Daruma. Fizemos os testes também em uma Sweda, mas nela não ocorreu a perda de informação, com o mesmo texto.

O EcfTeste não passou por este bloco, ele entrou no primeiro if "if MaxLinhasBuffer < 1 then", logo não ocorreu o problema. Agora, se forço a passar para o "else", ocorre o mesmo problema. Segue o texto que fizemos os testes:

</linha_dupla>
<ce>ENDEREÇO DE ENTREGA</ce>
<ce>REF. AO CUPOM: 013671 - VIA: 01/01</ce>
<ce>VALOR TOTAL: R$ 7,39</ce>
</linha_dupla>
CLIENTE:
<e>MARIA DA SILVA</e>
DATA: 23/03/2016   HORA: 15:54:54   OPR: ADMIN
</linha_simples>
QUANTIDADE DE CAIXA(S): <e>001</e>
END.: <e>RUA DA SAUDADE</e>
<e>208,JARDIM YARA</e>
<e>POUSO ALEGRE,MG,37.550-</e>
<e>000</e>
TEL.: <e>(35)9999-9999 (CELUL</e>
<e>AR PESSOAL)</e>
</linha_simples>
VASSOURA: <e>1</e>
<e>OVOS</e>
CONGELADOS: <e>congelado</e>
FARDOS: <e>2</e>
CAIXAS: <e>1</e>
</linha_simples>
EMP.: <e>ZE</e>
'Nº das caixas/Adicional:
<e>teste adicional</e>
</linha_simples>

Waldir, estamos com os fontes atualizados há umas 3 semanas, versão que instalamos nos nossos clientes.

O interessante é que apenas trocando o "SL.Text := Buffer ;" por "SL.add(Buffer);" resolve nosso problema.

Obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@Intelliware,

Obrigado pelo retorno, me ajuda bastante na tarefa que estou determinado a concluir.

Depois de sua resposta ainda ficou algumas duvidas:

  1. Pelo que entendi o problema já ocorria antes dessas alterações?
  2. Você está usando impressora fiscal ECF?
  3. Qual o trecho que ele perde?
  4. Qual sua versão de Delphi ou está usando o Free Pascal/Lazarus?

Pra mim essas respostas ajudam a tentar compreender melhor o que ocorre.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

1. Não sei te dizer, pegamos este problema internamente ontem, mas acredito que não pois diversos testes semelhantes foram feitos em versões mais antigas e nunca notamos tal problema;

2. Sim, o problema ocorreu no ECF Daruma FS700;

3. A partir da linha "<e>MARIA DA SILVA</e>" ele corta o restante e já imprime o rodapé;

4. Utilizo o Delphi XE2.

Obs.: nosso " MaxLinhasBuffer" está setado em 3, se aumento, não muda nada, agora se passo 0, como do ecfTeste, passando para o primeiro bloco do if, imprime normalmente.

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@Intelliware

Vamos fazer um teste?

Na linha 4397 da unit ACBrECFClass.pas

inclui por favor esse código abaixo:

Relatorio.SaveToFile('c:\relatorio_gerencial.txt');

Mude o caminho para o destino que preferir ai.

Confira pra gente se o conteúdo está correto ou se foi cortado antes desse ponto.

Vou continuar dai pra frente se ele estiver certo ou dai pra traz se ele já chegou cortado.

Continuo aqui nos testes

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@Intelliware

Veja pra mim por favor se com essa função o problema ocorre!

Essa função é a original sem alterações.

 

function AjustaLinhas(Texto: AnsiString; Colunas: Integer ;
   NumMaxLinhas: Integer = 0; PadLinhas: Boolean = False): AnsiString;
Var
  Count,P,I : Integer ;
  Linha, CurrLineBreak : AnsiString ;
begin
  { Trocando todos os #13+#10 por #10 }
  CurrLineBreak := sLineBreak ;
  if (CurrLineBreak <> #13+#10) then
     Texto := AnsiString(StringReplace(String(Texto), #13+#10, #10, [rfReplaceAll])) ;

  if (CurrLineBreak <> #10) then
     Texto := AnsiString(StringReplace(String(Texto), String(CurrLineBreak), #10, [rfReplaceAll])) ;

  { Ajustando a largura das Linhas para o máximo permitido em  "Colunas"
    e limitando em "NumMaxLinhas" o total de Linhas}
  Count  := 0 ;
  Result := '' ;
  while ((Count < NumMaxLinhas) or (NumMaxLinhas = 0)) and
        (Length(Texto) > 0) do
  begin
     P := pos(#10, String( Texto ) ) ;
     if P > (Colunas + 1) then
        P := Colunas + 1 ;

     if P = 0 then
        P := min( Length( Texto ), Colunas ) + 1 ;

     // somar 2 quando encontrar uma tag para não quebrar ela
     if (Copy(Texto, P-1, 1) = '<') or (Copy(Texto, P-2, 2) = '</') then
        inc(P, 2);

     I := 0 ;
     if copy(Texto,P,1) = #10 then   // Pula #10 ?
        I := 1 ;

     Linha := copy(Texto,1,P-1) ;    // Remove #10 (se hover)

     if PadLinhas then
        Result := Result + PadRight( Linha, Colunas) + #10
     else
        Result := Result + Linha + #10 ;

     Inc(Count) ;
     Texto := copy(Texto, P+I, Length(Texto) ) ;
  end ;

  { Permitir impressão de uma linha em branco }
  if Result = '' then
    Result := Result + #10;
end;

Ela é da unit ACBrUtil.

Precisa remover o const da declaração anterior.

Vou rever a logica da versão que atual.

 

 

 

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

  • Fundadores
  • Solution

Modifiquei essa rotina para não depender do TStringList...

Enviei uma possível correção para o SVN

Tb achei um Bug na impressão de Cod.Barras de ecfEscfECf no Delphi... enviei uma possível correção...

  • Curtir 3
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

  • Este tópico foi criado há 3140 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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.

The popup will be closed in 10 segundos...