Fórum Comparar Dados em 2 Memo #262629
18/12/2004
0
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
Curtir tópico
+ 0Posts
19/12/2004
Marcusbraga
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
20/12/2004
Aersoftware
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
21/12/2004
Marcelo Saviski
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
21/12/2004
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
21/12/2004
Aersoftware
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
21/12/2004
Aersoftware
Allan Elias Ramos :wink:
Gostei + 0
21/12/2004
Aersoftware
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
21/12/2004
Renato_sp
Qual foi o erro da function? Fez os testes como no exemplo?
Espero resposta...
Renato / SP
Gostei + 0
21/12/2004
Aersoftware
Allan Elias Ramos :wink:
Gostei + 0
21/12/2004
Aersoftware
Allan Elias Ramos :roll:
Gostei + 0
21/12/2004
Aersoftware
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
23/12/2004
Aersoftware
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
Clique aqui para fazer login e interagir na Comunidade :)