Ir para conteúdo
  • Cadastre-se

dev botao

Correção Na Função Buscarecf No Acbrcniee


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

Recommended Posts

Olá pessoal!

 

Um tempo atrás pedi para que pudessem alterar o fonte do BuscarECF no CNIEE, porque minha ECF de testes (Daruma MACH2) estava retornado o modelo sem espaços.

 

Mas agora tive um outro problema ao tentar usar o simulador da EpsonT81. Então eu fiz uma pequena alteração no fonte para poder resolver o problema.

 

Assim não precisaremos nos preocupar em informar para retirar ou não os espaços das strings das variáveis para realizar a busca.

 

Rodei aqui e funcionou perfeitamente, e não teve problema nenhum com relação a compatibilidade.

 

Abraços a toda equipe desenvolvedora do ACBr. Espero ter ajudado.

function TACBrCNIEE.BuscarECF(const AMarca, AModelo, AVersaoSB: String): TACBrCNIEERegistro;
var
  I: Integer;
  Marca, Modelo, VersaoSB: String;
  MarcaAtual, ModeloAtual, VersaoAtual: String;
begin
  // abrir a tabela se estiver fechada
  if Cadastros.Count <= 0 then
  begin
    if not Self.AbrirTabela then
      raise EACBrCNIEE.Create('Não foi possível abrir a tabela de CNIEE.');
  end;

  Result := nil;
  for I := 0 to Cadastros.Count - 1 do
  begin
    Marca    := AnsiUpperCase(AMarca);
    Modelo   := AnsiUpperCase(AModelo);
    VersaoSB := AnsiUpperCase(ACBrUtil.OnlyNumber(AVersaoSB));

    MarcaAtual  := AnsiUpperCase(Cadastros[I].DescrMarca);
    ModeloAtual := AnsiUpperCase(Cadastros[I].DescrModelo);
    VersaoAtual := AnsiUpperCase(ACBrUtil.OnlyNumber(Cadastros[I].Versao));

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;

    //Se não foi encontrado faz uma nova busca retirando os espaços
    Marca    := StringReplace(Marca,  ' ', '', [rfReplaceAll]);
    Modelo   := StringReplace(Modelo, ' ', '', [rfReplaceAll]);
    VersaoSB := StringReplace(VersaoSB, ' ', '', [rfReplaceAll]);

    MarcaAtual  := StringReplace(MarcaAtual,  ' ', '', [rfReplaceAll]);
    ModeloAtual := StringReplace(ModeloAtual, ' ', '', [rfReplaceAll]);
    VersaoAtual := StringReplace(VersaoAtual, ' ', '', [rfReplaceAll]);

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;
  end;
end;
Editado por vca_rj
Link para o comentário
Compartilhar em outros sites

Coloquei em meu configurador a função BuscaECF do CNIEE para me retornar o tipo da ECF e o CNIEE.

 

Quando eu testei com a ECF de teste (Daruma MACH 2) o modelo informado na tabela CNIEE é "MACH 2" e a ECF estava me retornando "MACH2".

 

Essa foi a primeira alteração que pedi para vocês, que aderiram a essa alteração.

 

Ontem precisei fazer um teste com o Simulador da Epson T81. Dessa vez o Simulador esta me retornando o modelo "TM-T81 FBII" e na tabela está "TM-T81FBII".

 

Então eu modifiquei para que fosse feita duas verificações: uma de forma normal sem retirar os espaços e a outra retirando os espaços dos valores enviados para função, tanto das variáveis alimentadas por nós como também das variáveis alimentadas pela tabela CNIEE.

 

Dessa forma elimina as divergências dos valores entre ECF e Tabela CNIEE por conta dos espaços.

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

  • Consultores
Essa foi a primeira alteração que pedi para vocês, que aderiram a essa alteração.

 

Tópico citado:

[]'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

  • Fundadores

Pelo que entendi do outro tópico a modificação já foi efetuada... bastando ao usuário informar True para a propriedade RemoveEspacos.. é isso mesmo ?

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

Não.

 

No tópico anterior, a alteração feita foi para as variáveis de entrada na função, passada pelo ECF, somente.

 

A alteração que precisei fazer é que além de retirar os espaços das vaiáveis passadas pelo ECF, foi preciso retirar também das variáveis retornadas da tabela CNIEE.

 

Assim, se você der uma olhada no código que eu postei, verá que está sendo feita duas consultas, uma com com as variáveis em seu estado normal e outra retirando os espaços das strings das variáveis.

 

O código anterior (após a alteração solicitada no post anterior):

E dentro da função "TACBrCNIEE.BuscarECF", coloquei o seguinte código:
...
  Marca    := AnsiUpperCase(AMarca);
  Modelo   := AnsiUpperCase(AModelo);
  VersaoSB := AnsiUpperCase(ACBrUtil.OnlyNumber(AVersaoSB));
 
  Result := nil;
  for I := 0 to Cadastros.Count - 1 do
  begin
    MarcaAtual  := AnsiUpperCase(Cadastros[I].DescrMarca);
    ModeloAtual := AnsiUpperCase(Cadastros[I].DescrModelo);
    VersaoAtual := AnsiUpperCase(ACBrUtil.OnlyNumber(Cadastros[I].Versao));
 
    //Retirar Espaços
    MarcaAtual  := StringReplace(MarcaAtual,' ','', [rfReplaceAll]);
    ModeloAtual := StringReplace(ModeloAtual,' ','', [rfReplaceAll]);
    VersaoAtual := StringReplace(VersaoAtual,' ','', [rfReplaceAll]);
 
    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then

Código com alteração da qual estou falando:

    //faz a busca sem alterar os valores das variáveis (sem retirar os espaços)
    Marca    := AnsiUpperCase(AMarca);
    Modelo   := AnsiUpperCase(AModelo);
    VersaoSB := AnsiUpperCase(ACBrUtil.OnlyNumber(AVersaoSB));

    MarcaAtual  := AnsiUpperCase(Cadastros[I].DescrMarca);
    ModeloAtual := AnsiUpperCase(Cadastros[I].DescrModelo);
    VersaoAtual := AnsiUpperCase(ACBrUtil.OnlyNumber(Cadastros[I].Versao));

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;

    //Se não foi encontrado na busca acima
    // faz uma nova busca retirando os espaços
    Marca    := StringReplace(Marca,  ' ', '', [rfReplaceAll]);
    Modelo   := StringReplace(Modelo, ' ', '', [rfReplaceAll]);
    VersaoSB := StringReplace(VersaoSB, ' ', '', [rfReplaceAll]);

    MarcaAtual  := StringReplace(MarcaAtual,  ' ', '', [rfReplaceAll]);
    ModeloAtual := StringReplace(ModeloAtual, ' ', '', [rfReplaceAll]);
    VersaoAtual := StringReplace(VersaoAtual, ' ', '', [rfReplaceAll]);

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;
Editado por vca_rj
Link para o comentário
Compartilhar em outros sites

Desculpe Daniel, não quero ser chato, mas onde está a incompatibilidade?

 

Pois não gostaria de ficar com os fontes diferentes do ACBrCNIEE!

 

Existe outra forma de fazer a busca do CNIEE eliminando os espaços das strings das variáveis?

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

É só manter, e teremos um código 100% eficiente, pois da forma atual ele só retira os espaços das variáveis passada pelo ECF. Daí aconteceu de alguns valores da tabela CNIEE serem diferentes.

 

Poderíamos deixar dessa forma, respeitando o parâmetro RemoverEspacos:

  ...
  Result := nil;
  for I := 0 to Cadastros.Count - 1 do
  begin
    Marca    := AnsiUpperCase(AMarca);
    Modelo   := AnsiUpperCase(AModelo);
    VersaoSB := AnsiUpperCase(ACBrUtil.OnlyNumber(AVersaoSB));

    MarcaAtual  := AnsiUpperCase(Cadastros[I].DescrMarca);
    ModeloAtual := AnsiUpperCase(Cadastros[I].DescrModelo);
    VersaoAtual := AnsiUpperCase(ACBrUtil.OnlyNumber(Cadastros[I].Versao));

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;

    //Se não foi encontrado faz uma nova busca retirando os espaços
    if RemoverEspacos then
    begin
      Marca    := StringReplace(Marca,  ' ', '', [rfReplaceAll]);
      Modelo   := StringReplace(Modelo, ' ', '', [rfReplaceAll]);
      VersaoSB := StringReplace(VersaoSB, ' ', '', [rfReplaceAll]);

      MarcaAtual  := StringReplace(MarcaAtual,  ' ', '', [rfReplaceAll]);
      ModeloAtual := StringReplace(ModeloAtual, ' ', '', [rfReplaceAll]);
      VersaoAtual := StringReplace(VersaoAtual, ' ', '', [rfReplaceAll]);

      if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
      begin
        Result := Cadastros[I];
        Exit;
      end;
    end;
  end;
Editado por vca_rj
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Fundadores
  • Solution

Acho que não precisamos de duas comparações... O problema é que o código atual não remove os espaços do parâmetro informado pelo usuário...

 

Por favor tente dessa maneira:

function TACBrCNIEE.BuscarECF(const AMarca, AModelo, AVersaoSB: String;
  const RemoveEspacos: Boolean): TACBrCNIEERegistro;
var
  I: Integer;
  Marca, Modelo, VersaoSB: String;
  MarcaAtual, ModeloAtual, VersaoAtual: String;
begin
  // abrir a tabela se estiver fechada
  if Cadastros.Count <= 0 then
  begin
    if not Self.AbrirTabela then
      raise EACBrCNIEE.Create('Não foi possível abrir a tabela de CNIEE.');
  end;

  Marca    := AnsiUpperCase(AMarca);
  Modelo   := AnsiUpperCase(AModelo);
  VersaoSB := AnsiUpperCase(ACBrUtil.OnlyNumber(AVersaoSB));

  if RemoveEspacos then
  begin
     Marca    := StringReplace(Marca,    ' ', '', [rfReplaceAll]);
     Modelo   := StringReplace(Modelo,   ' ', '', [rfReplaceAll]);
     VersaoSB := StringReplace(VersaoSB, ' ', '', [rfReplaceAll]);
  end;

  Result := nil;
  for I := 0 to Cadastros.Count - 1 do
  begin
    MarcaAtual  := AnsiUpperCase(Cadastros[I].DescrMarca);
    ModeloAtual := AnsiUpperCase(Cadastros[I].DescrModelo);
    VersaoAtual := AnsiUpperCase(ACBrUtil.OnlyNumber(Cadastros[I].Versao));

    if RemoveEspacos then
    begin
      MarcaAtual  := StringReplace(MarcaAtual,  ' ', '', [rfReplaceAll]);
      ModeloAtual := StringReplace(ModeloAtual, ' ', '', [rfReplaceAll]);
      VersaoAtual := StringReplace(VersaoAtual, ' ', '', [rfReplaceAll]);
    end;

    if (MarcaAtual = Marca) and (ModeloAtual = Modelo) and (VersaoAtual = VersaoSB) then
    begin
      Result := Cadastros[I];
      Exit;
    end;
  end;
end;

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

  • 1 mês depois ...

Oi Daniel! Desculpe a demora, acabei me agarrando com outras coisas e esqueci.

 

Fiz o teste com o código que você me passou, e deu certo.

 

Em meu código existe a chamada pela função BuscarECF em dois momentos, e em uma delas eu não havia setado como True para remover os espaços.

 

Obrigado.

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

  • Este tópico foi criado há 3861 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.