Comparar Dados em 2 Memo
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:
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
Curtidas 0
Respostas
Marcusbraga
18/12/2004
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...
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...
GOSTEI 0
Aersoftware
18/12/2004
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:
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:
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:
GOSTEI 0
Marcelo Saviski
18/12/2004
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]);
GOSTEI 0
Renato_sp
18/12/2004
Amigo tbm aproveitei e fiz uma function para sua duvida.. ai esta ela
Para utiliza-la é simples
Memo3.Lines:=DiferencaMemo(memo1, memo2);
Espero que te ajude
Renato / SP
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
GOSTEI 0
Aersoftware
18/12/2004
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:
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:
GOSTEI 0
Aersoftware
18/12/2004
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:
Allan Elias Ramos :wink:
GOSTEI 0
Aersoftware
18/12/2004
Putz, depois q postei vi q nao dava pra editar e esqueci de botar isso.. a solução q encontrei foi essa..
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:
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:
GOSTEI 0
Renato_sp
18/12/2004
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
Qual foi o erro da function? Fez os testes como no exemplo?
Espero resposta...
Renato / SP
GOSTEI 0
Aersoftware
18/12/2004
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:
Allan Elias Ramos :wink:
GOSTEI 0
Aersoftware
18/12/2004
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:
Allan Elias Ramos :roll:
GOSTEI 0
Aersoftware
18/12/2004
Há, só uma ultima coisinha, nao entendi o pq da comparaçao abaixo, no código q adaptei da sua função:
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:
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:
GOSTEI 0
Aersoftware
18/12/2004
Ú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.
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.
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..
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
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
GOSTEI 0