GARANTIR DESCONTO

Fórum Comparar Dados em 2 Memo #262629

18/12/2004

0

Olá pessoal, tudo bem? Espero q sim..

Como posso fazer pra comparar o conteúdo de dois memos?

O q quero fazer é o seguinte, vou ter uma lista de nomes em um deles, e no outro, vou ter a lista q tenho no banco de dados.. aí quero comparar pra ver se o 1º nome da primeira lista é igual a algum do outro memo.. na verdade a comparação seria pra ver se é diferente.. seria, se um campo do 1º memo for diferente dos campos do 2º memo, um terceiro memo vai receber esse nome, e assim até chegar ao ultimo nome do 1º memo..

Isso seria pra saber quais nomes eu nao tenho cadastrado no banco de dados..



Allan Elias Ramos :wink:


Aersoftware

Aersoftware

Responder

Posts

19/12/2004

Marcusbraga

Tente isso

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, existe : integer;
nome : string;
begin

i:=0;
while memo1.lines[i] <> ´´ do
begin
nome := memo1.lines[i];
j:=0;
existe:=0;
while memo2.Lines[j] <> ´´ do
begin
if nome = memo2.Lines[j] then//verifica se existe o nome no memo2
existe:=1;
inc(j);
end;
if existe = 0 then
Memo3.Lines.Add(nome)

inc(i);
end;
end;

espero ter ajudado...


Responder

Gostei + 0

20/12/2004

Aersoftware

Amigo, fiz uma pequena modificação no código, mas algo esta dando errado, e não sei o q pode ser... ele ficou assim:

    for i := 0 to MmListaGeral.Lines.Count do
      begin
        for j := 0 to MmListaDados.Lines.Count do
          begin
            if (MmListaGeral.Lines[i]) <> (MmListaDados.Lines[j]) then
              begin
                MmListaFaltantes.Lines.Add(MmListaGeral.Lines[i]);
              end;
          end;
      end;


O MmListaGeral é onde vai ser listado os nomes feito pelo gerador.. no caso, o usuário digita um nome (ex. Homem-Aranha) e um número inicial e final.. o gerador lista no memo o nome Homem-Aranha + os números, do inicial ao final...

No MmListaDados é listados todos os nomes de revistas que tem no banco de dados..

O problema q ta dando é q, no MmListaFaltantes, ele lista todos os nomes q estão no MmListaGeral, só q várias vezes cada um... no teste q fiz, lista 5x o nº 1, 2, 3, etc.. nao sei se tem a ver q o MmListaDados tem 5 Nomes listados, pq sao 5 revistas q tenho pra teste..

A idéia é listar no 3º memo somente os nomes que não tenha no 2º.. :wink:



Allan Elias Ramos :roll:


Responder

Gostei + 0

21/12/2004

Marcelo Saviski

Tente com isso:

    for i := 0 to MmListaGeral.Lines.Count do 
       if MmListaDados.Lines.IndexOf(MmListaGeral.Lines[i])) = -1 then
         MmListaFaltantes.Lines.Add(MmListaGeral.Lines[i]); 



Responder

Gostei + 0

21/12/2004

Renato_sp

Amigo tbm aproveitei e fiz uma function para sua duvida.. ai esta ela

Function DiferencaMemo(MemoComparar, MemoBase:TMemo):TStringList;
var
x, i:Integer;
Lista:TStringList;
Existe:boolean;
begin
   Lista:=TStringList.Create;
   for x:=0 To MemoComparar.lines.Count do
     begin
        Existe:=False;
        For i:=0 to MemoBase.Lines.Count do
           if MemoComparar.Lines[x] = MemoBase.Lines[i] then
               begin
                  Existe:=True;
                  break;
               end;
            if Existe=True then
               Continue;
         Lista.add(MemoComparar.Lines[x]);
     end;
  result:=Lista;
end;


Para utiliza-la é simples

Memo3.Lines:=DiferencaMemo(memo1, memo2);

Espero que te ajude
Renato / SP


Responder

Gostei + 0

21/12/2004

Aersoftware

Renato, testei a função e deu o mesmo problema q estava tendo usando o procedimento que coloquei acima..

Marcelo, fiz o [b:b769e9fb60]if[/b:b769e9fb60] como vc falou e realmente funcionou.. o único problema q deu é q ele me listou várias vezes os arquivos.. vou botar abaixo exatamente como lista...

[b:b769e9fb60]Lista de Arquivos Gerados:[/b:b769e9fb60]

Wolverine #001
Wolverine 002
Wolverine 003
Wolverine 004
Wolverine 005
Wolverine 006
Wolverine 007
Wolverine 008
Wolverine 009
Wolverine 010


[b:b769e9fb60]Lista de Arquivos do Banco de Dados:[/b:b769e9fb60]

Wolverine 001
Wolverine 002
Wolverine 003
Wolverine 004
Wolverine 005


[b:b769e9fb60]Lista de Número Faltantes:[/b:b769e9fb60]

Wolverine 006
Wolverine 006
Wolverine 006
Wolverine 006
Wolverine 006
Wolverine 006
Wolverine #007
Wolverine 007
Wolverine 007
Wolverine 007
Wolverine 007
Wolverine 007
Wolverine 008
Wolverine 008
Wolverine 008
Wolverine 008
Wolverine 008
Wolverine 008
Wolverine 009
Wolverine 009
Wolverine 009
Wolverine 009
Wolverine 009
Wolverine 009
Wolverine 010
Wolverine 010
Wolverine 010
Wolverine 010
Wolverine 010
Wolverine 010


Ou seja, ele listou exatamente os faltantes, mas listou várias vezes.. :cry:



Allan Elias Ramos :wink:


Responder

Gostei + 0

21/12/2004

Aersoftware

Oi, nova atualização.. mexendo nele e vendo alguns problemas q tava dando eu consegui fazer ele listar certinho.. tipo, no exemplo acima, se eu tenho gerado Wolverine #001 a 010 e tenho pelo banco Wolverine 001 a 005, no 3º memo ele me lista Wolverine 006 a 010.. como tem q ser.. só q, ele me lista no terceiro memo, como se tivesse listados as 11 edições.. tipo, no lugar q ficaria os numeros de 1 a 5, o memo fica em branco e a partir do 6º ele aparece do 6 ao 10.. como eu teria q fazer pra ele listar esses registros no topo do memo, sem esse espaço??



Allan Elias Ramos :wink:


Responder

Gostei + 0

21/12/2004

Aersoftware

Putz, depois q postei vi q nao dava pra editar e esqueci de botar isso.. a solução q encontrei foi essa..

    for i := 0 to MmListaGeral.Lines.Count do
      begin
        for j := 0 to MmListaDados.Lines.Count do
          begin
            if MmListaDados.Lines.IndexOf(MmListaGeral.Lines[i]) = -1 then
              begin
                Nome := MmListaGeral.Lines[i];
              end;
          end;
        MmListaFaltantes.Lines.Add(Nome);
      end;


Ou seja, a cada volta no segundo for, ele vai colocar o nome faltante em uma variável, evitando assim ele me listar 5 vezes ele, ja q ele vai pesquisar essas 5 vezes.. entao, estando numa variavel, ele pode listar quantas vezes quiser, q só vai exibir uma vez, antes do 1º for ir adiante.. :wink:



Allan Elias Ramos :roll:


Responder

Gostei + 0

21/12/2004

Renato_sp

Amigo a function que te enviei ta absolutamente correta fui alguns testes e todos o resultado foi satisfatorio, pode ser que nao venha a entender o que quis, mas a function que te enviei ela pega e joga no memo3 tudo que ta diferente do memo1 para o memo2

Qual foi o erro da function? Fez os testes como no exemplo?

Espero resposta...
Renato / SP


Responder

Gostei + 0

21/12/2004

Aersoftware

Fiz sim Renato... ela fez o q o outro exemplo q passei fazia... jogava os resultados várias vezes no 3º memo.. nao sei bem o q aconteceu.. :cry:



Allan Elias Ramos :wink:


Responder

Gostei + 0

21/12/2004

Aersoftware

Renato, perdão.. peguei sua função e só transformei ela num procedimento e funcionou perfeitamente.. muito obrigado.. obrigado a todos pela ajuda.. abraços.. :wink:



Allan Elias Ramos :roll:


Responder

Gostei + 0

21/12/2004

Aersoftware

Há, só uma ultima coisinha, nao entendi o pq da comparaçao abaixo, no código q adaptei da sua função:

  for i := 0 To MmListaGeral.Lines.Count do
    begin
      Existe := false;
      for j := 0 to MmListaDados.Lines.Count do
        if MmListaGeral.Lines[i] = MmListaDados.Lines[j]
          begin
            Existe := true;
            break;
           end;
        if Existe = true then
          Continue;
          MmListaFaltantes.Lines.Add(MmListaGeral.Lines[i]);
    end;
end;


Pq ele continua se o Existe for Verdadeiro, que fez a pesquisa se um é igual ao outro.. se o q acontece é ele listar os que são diferentes entre os dois memos?



Allan Elias Ramos :wink:


Responder

Gostei + 0

23/12/2004

Aersoftware

Última perguntinha sobre esse assunto, depois eu juro q encerro ele.. hehe.. tentei fazer isso mas nao consegui.. o programa pra gerar esses números ficou divido em 3 partes.. assim:

1. Essa primeira parte faz um pesquisa no banco de dados por revistas que esteja no grupo e subgrupo selecionado pelo usuário.. depois dessa pesquisa, ele joga somente o nome da revista no MmListaDados.

  DmDados.ClientNacionais.Close; //fecha o cliente pra pesquisa
  with DmDados.SqlNacionais do //faz a pesquisa pelo Grupo e SubGrupo selecionado
    begin
      close;
      CommandText :=
        ´Select * From TbRevNacionais Where FkCod_Grupo =´
        + IntToStr(DbLkUpGrupos.KeyValue)
        + ´And FkCod_SubGrupo =´
        + IntToStr(DbLkUpSubGrupos.KeyValue)
        + ´Order By NomeNumero´;
      open;
    end;
  DmDados.ClientNacionais.Open;
  DmDados.ClientNacionais.First; //depois da pesquisa, vai pro primeiro registro
  while not DmDados.ClientNacionais.Eof do //enquanto nao for o ultimo registro
    begin
      MmListaDados.Lines.Add(DmDados.ClientNacionais.FieldByName(´NomeNumero´).AsString); //O Memo de dados recebe os nomes das revistas
      DmDados.ClientNacionais.Next; //vai pro proximo registro pra seguir o loop
    end;


2. Essa segunda parte, pega um nome digitado pelo usuário, mais um numero inicial, numero final e quantos zeros terá a esquerda do número e gera os nomes como foram cadastrados no banco de dados.. Ex. Se eu tenho no banco a revista Wolverine #001.. mas de 001 a 100.. e colocar no gerador o nome, ´Wolverine ´, mais numero inicial 1 e final 100 e dizer q tem 2 zeros a esquerda, ele me gera no MmListaGeral os nomes Wolverine 001 a Wolverine 100.

  for Controle := StrToInt(EdtInicial.Text) to StrToInt(EdtFinal.Text) do //para o controle receber o nº inicial até o final, faça
    begin
      Resultado := IntToStr(Controle); //resultado recebe o valor de controle passado pra string
      if EdtZeros.Text = ´0´ then //se nao tiver zeros a esquerda
        begin
          Numeros := StrToInt(Resultado);
          Resultado := EdtNome.Text + Resultado; //resultado recebe ele mais resultado
          MmListaGeral.Lines.Add(Resultado); //mostra o resultado
        end
      else if EdtZeros.Text = ´1´ then //se tiver um zero a esquerda
        begin
          while (length(Resultado) < 2) do //enquanto as numeros forem menor q 2 digitos
          Resultado := ´0´ + Resultado; //resultado recebe 0 mais ele mesmo
          Numeros := StrToInt(Resultado);
          Resultado := EdtNome.Text + Resultado;
          MmListaGeral.Lines.Add(Resultado);
        end
      else if EdtZeros.Text = ´2´ then //se tiver dois zeros a esquerda
        begin
          while (length(Resultado) < 3) do //enquanto o numero de campos for menor q 3
          Resultado := ´0´ + Resultado; //resultado recebe 0 mais ele mesmo até ter dois zeros a esquerda
          Numeros := StrToInt(Resultado);
          Resultado := EdtNome.Text + Resultado; // resultado recebe o q ta no edit do nome mais ele mesmo, pra formar o nome mais as edições
          MmListaGeral.Lines.Add(Resultado); // lista geral recebe os nomes e edições geradas
        end;
    end;


3. E nessa terceira parte, essa que foi ajudada aqui por vcs que compara o primeiro memo, com o segundo e joga no terceiro os numeros q faltam..

  for i := 0 To MmListaGeral.Lines.Count do // para o i receber 0 e ir até o numero de registros no memo de lista gerada
    begin
      Existe := false; //variavel existe recebe falso
      for j := 0 to MmListaDados.Lines.Count do //para j receber 0 e ir até o numero de registros do memo de lista de dados
        if MmListaGeral.Lines[i] = MmListaDados.Lines[j] then //se o registro na posiçao i for iguao ao registro na posiçao j
          begin
            Existe := true; //existe recebe verdadeiro
            break; //para a pesquisa
           end;
        if Existe = true then //se registro for verdadeiro
          Continue; //continua
          MmListaFaltantes.Lines.Add(MmListaGeral.Lines[i]); //e o memo de faltantes recebe o registro da posiçao i no memo de lista gerada
    end;
end;


O código funciona perfeitamente.. a última implementação que quero fazer é pq isso vai me gerar um relatório de numeros faltantes.. e eu gostaria q nesse relatório constasse somente os números das edições, sem os nomes.. ao inves de ´Wolverine 001´, gostaria q fosse ´001´.. e assim por diante.. tem como implementar nesse código acima uma variável ou algo do tipo q guarde tb os números somente e liste em outro memo somente os números faltantes? sem as edições?



Allan Elias Ramos :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar