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á 4031 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

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
Postado (editado)

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
  • Consultores
Postado
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.
Postado

Isso EMBarbosa

 

Essa nova modificação simplifica o funcionamento da função sem a necessidade do usuário informar se quer ou não fazer a busca retirando os espaços.

Postado (editado)

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
Postado (editado)

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
Postado (editado)

É 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
  • 2 semanas depois ...
  • Fundadores
  • Solution
Postado

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.

  • 1 mês depois ...
Postado (editado)

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