 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 9:41 am Assunto: |
|
|
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 |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Abr 15, 2014 10:11 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 10:14 am Assunto: |
|
|
| 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 |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Abr 15, 2014 10:25 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 10:31 am Assunto: |
|
|
| 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 |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Abr 15, 2014 10:43 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 10:46 am Assunto: |
|
|
| 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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 11:53 am Assunto: |
|
|
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 |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Abr 15, 2014 12:02 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 1:03 pm Assunto: |
|
|
| 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 |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Abr 15, 2014 3:12 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Abr 15, 2014 5:08 pm Assunto: |
|
|
| 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 |
|
 |
casetek Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004 Mensagens: 211 Localização: Londrina - PR
|
Enviada: Ter Abr 15, 2014 7:16 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|