ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comparar tabela local com tabela em nuvem?
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Abr 14, 2014 5:08 pm    Assunto: Comparar tabela local com tabela em nuvem? Responder com Citação

Boa tarde,

Tenho uma tabela em nuvem e outra local preciso comparar as duas tabelas.

Consigo fazer um select na tabela em nuvem e também na tabela local, mais não sei como comparar se as duas tabelas estas com os mesmos dados idênticos.

Obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 9:10 am    Assunto: Responder com Citação

Não consigo imaginar nada alem de um while entre as duas tabelas

Local e na nuvem, e comparar ID a ID entre elas.

Mais ai acho um processo um pouco demorada. Só que não consigo imaginar nada além disso.

Obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 9:41 am    Assunto: Responder com Citação

Olá, alguém pode me ajudar na lógica?

Como não consegui de outra forma então estou tentando num laço de repetição.
Os selects estão corretos, mais a lógica não, porque não sei como comparar o ID local com ID em nuvem e ir para o proximo ID local se ou dois forem iguais.
Código:
procedure TF_Protecao_OnLine.CompareTable_Loc_Web;
var
  codigoLocal, codigoWeb: Integer;
begin
  Seleciona_Dados_ServidorWeb(FProcessos_Web.Connection_Firebird,
              zQryLocal);
  zQryLocal.First;
  //laço na tabela local
  while not zQryLocal.Eof do
  begin
    codigoLocal := zQryLocal.FieldByName('codigo').AsInteger;
    //laço na tabela em nuvem
    Seleciona_Dados_ServidorWeb(FProcessos_Web.Connection_MySQL,
              QMySQL);
    QMySQL.First;
    while not QMySQL.Eof do
    begin
      codigoWeb := QMySQL.FieldByName('codigo').AsInteger;
      if codigoLocal = codigoWeb then
        zQryLocal.Next
      else
        QMySQL.Next;
    end;
  end;
end;


Obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Abr 15, 2014 10:11 am    Assunto: Responder com Citação

Olá Adriano.

Acho que se vc usar o locate se diminui ai o uso de memória, fica mais fácil tbm.

Só preciso entender uma coisa:
Os dados Locais podem não ter no banco WEB.
Mais os dados WEB tem todos os dados Locais?
É isso ou tanto um quanto outro podem não ter as mesmas informações?

Dependendo o caso acho que da pra montar um SELECT pra ficar mais fácil.

Aguardo sua resposta.
_________________
O ser humano busca e defende aquilo que ama.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 10:14 am    Assunto: Responder com Citação

marcosbaixista escreveu:
Olá Adriano.

Acho que se vc usar o locate se diminui ai o uso de memória, fica mais fácil tbm.

Só preciso entender uma coisa:
Os dados Locais podem não ter no banco WEB.
Mais os dados WEB tem todos os dados Locais?
É isso ou tanto um quanto outro podem não ter as mesmas informações?

Dependendo o caso acho que da pra montar um SELECT pra ficar mais fácil.

Aguardo sua resposta.
Olá marcosbaixista, o que eu preciso é que a tabela na web seja idêntica a tabela local, se for diferente ai para o processo.

Obrigado amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Abr 15, 2014 10:25 am    Assunto: Responder com Citação

Hum, deixa eu ver se entendi.

Ex:
Tabela 01
Código - 1,2,3,4,5,6,7

Tabela 02
Código - 1,2,3,4,5,6,7,8,9,10,11,12....

Neste caso a Tabela 02 tem alguns dados a mais do que na Tabela 01. Neste caso vc iria parar o processo? Ou só pararia o processo se na Tabela 02 estivesse faltando algum elemento da Tabela 01?
_________________
O ser humano busca e defende aquilo que ama.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 10:31 am    Assunto: Responder com Citação

marcosbaixista escreveu:
Hum, deixa eu ver se entendi.

Ex:
Tabela 01
Código - 1,2,3,4,5,6,7

Tabela 02
Código - 1,2,3,4,5,6,7,8,9,10,11,12....

Neste caso a Tabela 02 tem alguns dados a mais do que na Tabela 01. Neste caso vc iria parar o processo? Ou só pararia o processo se na Tabela 02 estivesse faltando algum elemento da Tabela 01?


Então marcosbaixista, por exemplo na tabela local é a referencia se tem nela tem que ter na tabela web

Exemplo
Tab Local 1,2,3,4,5,6

Tab Web 1,3,4,5,6

Ai deve parar o processo porque não estão iguais.

As duas tabelas são gravadas iguais, mais em se tratando de web pode oscilar e não gravar algum código ai fica errado.

Entendeu amigo?

Obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Abr 15, 2014 10:43 am    Assunto: Responder com Citação

Ah entendi.
Bom se vai precisar de um while de qualquer maneira ai. A lógica seria o seguinte.

- Pegar os códigos da Tabela 01.
- Varrer a Tabela 02 para ver se encontra todos os dados.

Então no caso se teria que dar um while na Tabela 01 para pegar os códigos dela, esse códigos são os que vc precisa comparar lá na WEB, e armazenar isso num array por exemplo.

Depois vc pode usar o IN no sql para comparar no banco.
Ex: Vou fazer sem testar, só de exemplo ok.

Código:

While not Tabela01.Eof do begin
   //aqui vc montaria uma string com todos os códigos da tabela 01 para usar o IN no SQL de pesquisa certo.
   Codigos:= Tabela01.FieldByName('CODIGO').AsString + ',';
end;
//depois pesquisaria na WEB.
QryAuxiliar.Close;
QryAuxiliar.SQL.Clear;
QryAuxiliar.SQL.Add('SELECT * FROM TABELA02 WHERE CODIGO in [Codigos]');
QryAuxiliar.Open;
//agora verifique se QryAuxiliar retornou todos os dados, caso contrário está faltando dados da tabela 01.


O caminho é mais ou menos por ai, usando o IN no SQL vc verifica se todos os códigos estão presente na Tabela WEB de uma só vez.

Tenta fazer ai, qualquer dúvida só postar ok.
_________________
O ser humano busca e defende aquilo que ama.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 10:46 am    Assunto: Responder com Citação

marcosbaixista escreveu:
Ah entendi.
Bom se vai precisar de um while de qualquer maneira ai. A lógica seria o seguinte.

- Pegar os códigos da Tabela 01.
- Varrer a Tabela 02 para ver se encontra todos os dados.

Então no caso se teria que dar um while na Tabela 01 para pegar os códigos dela, esse códigos são os que vc precisa comparar lá na WEB, e armazenar isso num array por exemplo.

Depois vc pode usar o IN no sql para comparar no banco.
Ex: Vou fazer sem testar, só de exemplo ok.

Código:

While not Tabela01.Eof do begin
   //aqui vc montaria uma string com todos os códigos da tabela 01 para usar o IN no SQL de pesquisa certo.
   Codigos:= Tabela01.FieldByName('CODIGO').AsString + ',';
end;
//depois pesquisaria na WEB.
QryAuxiliar.Close;
QryAuxiliar.SQL.Clear;
QryAuxiliar.SQL.Add('SELECT * FROM TABELA02 WHERE CODIGO in [Codigos]');
QryAuxiliar.Open;
//agora verifique se QryAuxiliar retornou todos os dados, caso contrário está faltando dados da tabela 01.


O caminho é mais ou menos por ai, usando o IN no SQL vc verifica se todos os códigos estão presente na Tabela WEB de uma só vez.

Tenta fazer ai, qualquer dúvida só postar ok.
Entendi marcosbaixista, vou fazer aqui, depois eu posto o resultado amigo.

Obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 11:53 am    Assunto: Responder com Citação

Olá e como armazeno este array? Fiz aqui dois testes num stringlist e num string e não deu muito certo não, não sei se é porque tem muitos códigos gravados nesta tabela.

O código agora esta assim.

Código:
procedure TF_Protecao_OnLine.CompareTable_Loc_Web;
var
  codigoLocal: TStringList;
  cLocal: String;
begin
  codigoLocal := TStringList.Create;
  try
    Seleciona_Dados_ServidorWeb(FProcessos_Web.Connection_Firebird,
                zQryLocal);
    zQryLocal.First;
    //laço na tabela local, armazeno num array o codigo
    while not zQryLocal.Eof do
    begin
      codigoLocal.Text := codigoLocal.Text + zQryLocal.FieldByName('codigo').AsString + ',';
      zQryLocal.Next;
    end;
    //depois retira a ultima virgula da string
    codigoLocal.Text :=  Copy(codigoLocal.Text,1, Length(codigoLocal.Text) - 1);

    //depois pesquiso na WEB.
    QMySQL.Close;
    QMySQL.SQL.Clear;
    QMySQL.SQL.Text := 'SELECT * FROM protecao_corp WHERE codigo IN ('+ codigoLocal.Text +')';
    QMySQL.Open;
  finally
    codigoLocal.Free;
  end;
end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Abr 15, 2014 12:02 pm    Assunto: Responder com Citação

Então, eu falei array mais acho que vc terá que fazer uma string mesmo para não ter problemas com a montagem do SQL.

No caso ficaria assim essa parte de pegar o código:



Código:

var
   Codigos: String;
begin
   while not Tabela01.Eof do begin
      Codigos:= Tabela01.FieldByName('CODIGO').AsString + ','; //Aqui vc pega o código como string mesmo para não ter problemas com compatibilidade.
   end;
   //agora monta o SQL.
   Tabela02.SQL.Add('SELECT * FROM TABELA02 WHERE CODIGO in [Codigos]'); //sem aspas entre as [] porque acredito que o campo CODIGO seja do tipo integer aqui.
end;


No caso a String Codigos ficaria assim depois de montada.
Ex: 1,2,3,4,5,6,7,8......

O caminho é por ai. Ta fácil de resolver agora.

Qualquer coisa poste ai ok.
_________________
O ser humano busca e defende aquilo que ama.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 1:03 pm    Assunto: Responder com Citação

marcosbaixista escreveu:
Então, eu falei array mais acho que vc terá que fazer uma string mesmo para não ter problemas com a montagem do SQL.

No caso ficaria assim essa parte de pegar o código:



Código:

var
   Codigos: String;
begin
   while not Tabela01.Eof do begin
      Codigos:= Tabela01.FieldByName('CODIGO').AsString + ','; //Aqui vc pega o código como string mesmo para não ter problemas com compatibilidade.
   end;
   //agora monta o SQL.
   Tabela02.SQL.Add('SELECT * FROM TABELA02 WHERE CODIGO in [Codigos]'); //sem aspas entre as [] porque acredito que o campo CODIGO seja do tipo integer aqui.
end;


No caso a String Codigos ficaria assim depois de montada.
Ex: 1,2,3,4,5,6,7,8......

O caminho é por ai. Ta fácil de resolver agora.

Qualquer coisa poste ai ok.
Estava vendo aqui e o resultado do IN no select traz o que estão na outra tabela

Por exemplo
na tabela01
1,2,3,4,5,6

na tabela02
2,3,4,20,21,22

o select
Código:
SELECT * FROM tabela02 WHERE codigo IN (1,2,3,4,5,6)


o resultado foi
2,3,4

O que eu preciso é se for diferente da primeira então não faça nada.

Obrigado amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Abr 15, 2014 3:12 pm    Assunto: Responder com Citação

Adriano

Se pode contar a de registros na tabela 01 e comparar com o retorno do SQL.

Tipo assim:

Código:

var
   Codigos: String;
   QtdCod: Int;
begin
   QtdCod:= 0;
   while not Tabela01.Eof do begin
      Inc(QtdCod);
      Codigos:= Tabela01.FieldByName('CODIGO').AsString + ','; //Aqui vc pega o código como string mesmo para não ter problemas com compatibilidade.
   end;
   //agora monta o SQL.
   Tabela02.SQL.Add('SELECT CODIGO FROM TABELA02 WHERE CODIGO in [Codigos]'); //sem aspas entre as [] porque acredito que o campo CODIGO seja do tipo integer aqui.
    if Tabela02.RecordCount = QtdCod then begin
       //faça alguma ação desejada
    end
    else begin
       //aborte a operação ou não faça nada.
    end;
end;


Tipo pegue a quantiade de registros da primeira tabela e compara com a quantidade de registros retornados da segunda tabela, ai se faz um if pra comprar entende?

Qualquer coisa poste ai ok.
_________________
O ser humano busca e defende aquilo que ama.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Abr 15, 2014 5:08 pm    Assunto: Responder com Citação

marcosbaixista escreveu:
Adriano

Se pode contar a de registros na tabela 01 e comparar com o retorno do SQL.

Tipo assim:

Código:

var
   Codigos: String;
   QtdCod: Int;
begin
   QtdCod:= 0;
   while not Tabela01.Eof do begin
      Inc(QtdCod);
      Codigos:= Tabela01.FieldByName('CODIGO').AsString + ','; //Aqui vc pega o código como string mesmo para não ter problemas com compatibilidade.
   end;
   //agora monta o SQL.
   Tabela02.SQL.Add('SELECT CODIGO FROM TABELA02 WHERE CODIGO in [Codigos]'); //sem aspas entre as [] porque acredito que o campo CODIGO seja do tipo integer aqui.
    if Tabela02.RecordCount = QtdCod then begin
       //faça alguma ação desejada
    end
    else begin
       //aborte a operação ou não faça nada.
    end;
end;


Tipo pegue a quantiade de registros da primeira tabela e compara com a quantidade de registros retornados da segunda tabela, ai se faz um if pra comprar entende?

Qualquer coisa poste ai ok.
Mais ai eu poderia fazer dois selects count ou recordcount como esta ai e comparar as duas tabelas.

Tipo
Código:
 if Tabela02.RecordCount = Tabela01.RecordCount then


Pode ser uma forma que resolve, mais queria comparar código a código e ver se estão idênticos os códigos, mais se não houver outra forma de comparar estes códigos um a um vamos partir para o count mesmo.


Obrigado amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
casetek
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004
Mensagens: 211
Localização: Londrina - PR

MensagemEnviada: Ter Abr 15, 2014 7:16 pm    Assunto: Responder com Citação

Olá Adriano.

Cenário 1 - Tabela1 igual a Tabela2:

Tabela1 (primary keys)= 1,2,3,4,5,6
Tabela2 (primary keys)= 1,2,3,4,5,6

select sum(id) as soma1, count(id) as qtde1 from tabela // local
select sum(id) as soma2, count(id) as qtde2 from tabela // remota

soma1 = 21 qtde1 = 6
soma2 = 21 qtde1 = 6

if (soma1 = soma2) and (qtde1 = qtde2) then
OK-- tabelas iguais

======================================

Cenário 2 - Tabela1 DIFERENTE da Tabela2:

Tabela1 (primary keys)= 1,2,3,4,5,6
Tabela2 (primary keys)= 1,2,4,5,6

select sum(id) as soma1, count(id) as qtde1 from tabela // local
select sum(id) as soma2, count(id) as qtde2 from tabela // remota

soma1 = 21 qtde1 = 6
soma2 = 18 qtde2 = 5

if (soma1 = soma2) and (qtde1 = qtde2) then
OK-- tabelas iguais
else
Tabelas diferentes - Ai você percorre a tabela remota em busca dos registros faltantes.


Como o id é um auto-incremento, utilizando essas 2 verificações (sum e count) se houver diferença na quantidade de registros os valores não vão ser iguais.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB