Ir para conteúdo
Fórum Script Brasil
  • 0

Monitorar Tabela Access


Guest --João Paulo --

Pergunta

Guest --João Paulo --

Olá pessoal, eu pesquisei na internet mas não encontrei algo que pudesse me ajudar, é o seguinte, um cliente tem um sistema prontinho já rodando na sua máquina, o banco deste programa é o access e não tem o código fonte, e o que eu preciso fazer nesse banco, é ao final de cada mês, verificar se algum dado de cliente foi alterado, ou se foi incluído algum cliente novo, e trazer somente esses dados, Clientes Novos e que Tiveram alterações de cadastro.

Para as alterações de cadastro, eu poderia, de repente criar uma tabela, e renovar ela a cada importação, assim verificando se os dados na tabela de origem estão diferentes da minha.

Será que esta seria a maneira mais viável de realizar este procedimento, ou tem alguma maneira mais eficaz?

Qualquer dica ou link para dica eu agradeço.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Crie um programa em delphi para ler as suas tabelas em access ( use componentes ADO ou outro ) e desta maneira voce poderá ao final de cada mês, verificar se algum dado de cliente foi alterado, ou se foi incluído algum cliente novo, e trazer somente esses dados, Clientes Novos e que Tiveram alterações de cadastro.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --João Paulo --

Voce diz, inicialmente devo fazer uma cópia da tabela , e verificar à partir dessa cópia ?

Aí atualizar ela também com os dados alterados para ser possível a verificação no mes seguinte

Link para o comentário
Compartilhar em outros sites

  • 0
Voce diz, inicialmente devo fazer uma cópia da tabela , e verificar à partir dessa cópia ?

Aí atualizar ela também com os dados alterados para ser possível a verificação no mes seguinte

Na verdade, ao fazer este programa, voce pode fazer nele a mesma coisa que faz com o outro. Mas a principio é isso, use uma copia da tabela, para fazer o que voce esta querendo... com o tempo voce pode implementar todas as rotinas que existem no outro programa ou até mesmo melhorar essas rotinas e deixa-lo como programa definitivo no lugar do outro.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

Eu criei uma cópia da tabela, agora para fazer o código para comparação eu fiz assim

Select * from clientes c, clientesCopia cc where not(c.idcliente=cc.idcliente)and(c.NomeCliente=cc.NomeCliente)
...

Eu vou incluir todos os campos das duas tabelas no select, mas, eu pergunto, teria uma maneira mais prática para realizar este select sem que eu tenha que digitar todos os 40 campos da tabela para comparação ("c.NomeCliente=cc.NomeCliente") ?

Eu encontrei algumas dicas na internet mas nenhuma deu certo.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Joao Paulo --

Eu coloquei os campos das tabelas na condição where(todos os campos), mas ele dá o erro "Consulta muito complexa", de que outra maneira eu poderia comparar todos os campos de duas tabelas ?

eu entei assim

Select * from clientes where not exists(select * from ClientesCopia where
(clientes.idcliente=ClientesCopia.idcliente)and(clientes.NomeCliente=ClientesCopia.NomeCliente)...

E retorna esse erro "Consulta muito complexa",

Link para o comentário
Compartilhar em outros sites

  • 0
Eu coloquei os campos das tabelas na condição where(todos os campos), mas ele dá o erro "Consulta muito complexa", de que outra maneira eu poderia comparar todos os campos de duas tabelas ?

eu entei assim

Select * from clientes where not exists(select * from ClientesCopia where

(clientes.idcliente=ClientesCopia.idcliente)and(clientes.NomeCliente=ClientesCopia.NomeCliente)...

E retorna esse erro "Consulta muito complexa",

voce tem que tentar algo assim:

1ª tabela: ( Query1 )

select * from Clientes

2ª tabela: ( Query2 )

select * from ClientesCopia

para fazer a comparação entre as duas tabelas

procedure TForm1.Button1Click(Sender: TObject);
var i, num : integer;
begin
   Query1.First;
   for i := 1 to Query1.RecordCount do  // pega o registro
      begin
         for Num := 1 to Query1.FieldCount do
            begin
               if Query1.Fields[Num] = Query2.Fields[Num] then  // compara o conteudo de cada campo do registro
                  begin
                     // se o conteudo do campo for igual faça

                  end
               else
                  begin
                     // se o conteudo do campo não for igual faça


                  end;
            end;
      Query1.Next;
      end;
end;

OBS: este é apenas um exemplo bem simples para voce ter um ponto de partida.. voce deve modifica-lo de acordo com as suas necessidades

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --João Paulo --

Bom dia

Deu boa aqui, seguindo a sua dica, saiu algo assim

while not(Query_Alterados.Eof)do
  begin
  for a := 0 to Query_Alterados.RecordCount -1 do  // pega o registro
      begin
         for Num := 0 to Query_Alterados.FieldCount -1 do
            begin
            s:=Query_Apoio.Fields[Num].AsString;
            t:=Query_Alterados.Fields[Num].AsString;                                                                                
               if (s <> t )then 
               begin                                                            
               ClientDataSet1.Append;                                          
               ClientDataSet1codigo.Value    :=Query_Apoio.Fields[0].AsString
               ...
        ClientDataSet1.Post; 
        Query_Alterados.Next;                                          
               Query_Apoio.Next;;

Bom, fiz assim, aí terminei pegando os clientes que tem em uma tabela mas não tem na outra, agora, gostaria de saber, como faço para inserir os clientes que estão no ClientDataSet e não existem no banco e para somente alterar os que já existem, assim

No ClientDataSet apareceram 3 Clientes, 1 foi porque sofreu alterações nos dados e os outros dois, são clientes novos, aí teria que fazer um Update de 1 Cliente e um Insert dos outros dois.

Tem como fazer isso diretamente, já que o ClientDataSet tem todos os campos a serem modificados, tipo, verifica pelo campo código, se existe no banco, somente altera, senão ele inclui.

Link para o comentário
Compartilhar em outros sites

  • 0
No ClientDataSet apareceram 3 Clientes, 1 foi porque sofreu alterações nos dados e os outros dois, são clientes novos, aí teria que fazer um Update de 1 Cliente e um Insert dos outros dois.

Tem como fazer isso diretamente, já que o ClientDataSet tem todos os campos a serem modificados, tipo, verifica pelo campo código, se existe no banco, somente altera, senão ele inclui.

Voce está no caminho certo

if (s <> t )then 
            begin                                                            
               ClientDataSet1.Append;                                          
               ClientDataSet1codigo.Value    :=Query_Apoio.Fields[0].AsString
               ...
               ClientDataSet1.Post; 
               Query_Alterados.Next;                                          
               Query_Apoio.Next;
            end
        else
            begin
                // se já existir é só atualizar os dados
                ClientDataSet1.Edit;
                
                // coloque aqui as alterações que forem necessarias
                ...
                ClientDataSet1.Post; 
                Query_Alterados.Next;                                          
                Query_Apoio.Next;
            end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --João Paulo --

Jhonas, antes de mais nada, obrigado pela atenção, eu fiz algo assim

ClientDataSet1.Close;
ClientDataSet1.CreateDataSet();
ClientDataSet1.Active:=True;
b:=Query_Apoio.RecordCount;          //<--------------Aqui estou contando para comparar lá embaixo
c:=Query_Alterados.RecordCount;    //<---------------Também...
while not(Query_Alterados.Eof)do
  begin
  for a := 0 to Query_Alterados.RecordCount -1 do  // pega o registro
      begin
         for Num := 0 to Query_Alterados.FieldCount -1 do
            begin
            s:=Query_Apoio.Fields[Num].AsString;
            t:=Query_Alterados.Fields[Num].AsString;

//-------------------Pega o que teve alterações---------------------------------
                                                                                
               if (s <> t )then  //compara o conteudo de cada campo do registro 
               begin                                                            
               ClientDataSet1.Append;                                           
               ClientDataSet1codigo.Value     :=Query_Apoio.Fields[0].AsString;  
               ClientDataSet1nome. Value      :=Query_Apoio.Fields[1].AsString;  
               ...
               ...
               ClientDataSet1.Post;
               UpdateAlterados();           //<---------Altera os dados                                  
               Query_Alterados.Next;                                            
               Query_Apoio.Next;                                                
               end                                                              
               else                                                             
                begin                                                           
                                                                                
                end;                                                            
            end;                                                                
      end;                                                                      
  Query_Alterados.Next;                                                         
  Query_Apoio.Next;                                                             
                                                                                
  end;
{Até aqui, ele estava pegando somente os registros que sofreram alteração, e à partir daqui, como uma tabela está maior que a outra  (b>c), ele está pegando somente os dados seguinte, que no caso são os clientes novos, repare que eu coloquei a procedure insert logo após o post, e coloquei também um "ClientDataSet.Last", está correto? Pode ficar assim  ? Eu acredito que assim, ele vai pegar sempre o último registro que foi incluído no ClientDataSet e inserir no banco}
                                                                          
//------------------------Pega os registros novos-------------------------------
if(b>c)then                                                                     
  while not(Query_Apoio.Eof)do                                                  
    begin                                                                       
    ClientDataSet1.Append;                                                      
    ClientDataSet1codigo.Value    :=Query_Apoio.Fields[0].AsString;             
    ClientDataSet1nome.Value      :=Query_Apoio.Fields[1].AsString;             
    ClientDataSet1fantasia.Value  :=Query_Apoio.Fields[2].AsString;             
    ...
    ...          
    ClientDataSet1.Post;
    ClientDataSet1.Last;
    InsertNovos();                  //<---------Insere os dados                                      
    Query_Apoio.Next;                                                           
    end;

Ufa... (Quase fizemos um tutorial disso :wacko: )

Lembrando que isto tudo está dentro de um único botão, que após esse código escreve em um txt os dados do ClientDataSet, para serem exportados para outro sistema. Ele inserir bonitinho e alterou também, a minha preocupação é se futuramente, com o programa tendo várias alterações e inclusões, ele venha a inserir dados em duplicidade, tipo, se ali onde eu coloquei para ir para o final, lá não esteja um ítem novo, e sim um que já exista

Link para o comentário
Compartilhar em outros sites

  • 0
Lembrando que isto tudo está dentro de um único botão, que após esse código escreve em um txt os dados do ClientDataSet, para serem exportados para outro sistema. Ele inserir bonitinho e alterou também, a minha preocupação é se futuramente, com o programa tendo várias alterações e inclusões, ele venha a inserir dados em duplicidade, tipo, se ali onde eu coloquei para ir para o final, lá não esteja um ítem novo, e sim um que já exista

voce esta fazendo apenas comparação com quantidades de registros

if(b>c)then

a minha preocupação é se futuramente, com o programa tendo várias alterações e inclusões, ele venha a inserir dados em duplicidade, tipo, se ali onde eu coloquei para ir para o final, lá não esteja um ítem novo, e sim um que já exista

neste caso não faça somente comparação de quantidade, mas tambem de conteudo dos campos .

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...