Fórum Sincronização de BD #395102

04/02/2011

0

Bom, tenho a seguinte situação:
Temos um BD no computador Central que fica na LOJA, e os vendedores (cada um possui um notebook) saem para realizar vendas pelo notebook e automaticamente vai sendo calculado estoque, e tudo mais. Só que cada vendedor tem um BD (que é o espelho do BD central) no seu notebook, este vendedor realiza todas as vendas possiveis durante a semana e etc. Quando o vendedor entra na loja que fica o BD central, o notebook no vendedor que tem o mesmo BD mais com informações atualizadas deve ser sincronizado com o BD central, afim de atualizar tambem o BD central. 
Vou dar um exemplo para tentar explicar melhor:
No bd central tenho a seguinte tabela com o seguinte registro:NOME DO VENDEDOR: Paulo dos SantosESTOQUE ATUAL: 100
Ao decorrer da semana o vendedor realiza toda as operações possiveis e seu bd local (que esta no notebook) está assim:NOME DO VENDEDOR: Paulo dos SantosESTOQUE ATUAL: 10 
porém, o bd central continua com aquelas mesmas informações antigas, e só vai ser atualizado quando o vendedor entrar na loja e conectar-se na rede para sincronizar as informações.

Agora a pergunta, como posso fazer isso ? Esse sincronismo do mesmo banco (com a mesma estrutura) mais com registros distintos.
Ronaldo Lanhellas

Ronaldo Lanhellas

Responder

Posts

04/02/2011

Marco Salles

Se vc usar DbExpress , dando um ApplayUpdates vc atualiza o Banco de Dados   Vou dar Um Exemplo simples .. Ole os componentes   Um SqlConnection Um SqlQuery  .... Select * From NomeDeUmaTabelaSua  *** Tabela do Firebird *** Um TDataSetProvider Um ClientDataSet Um DataSouce Um Dbgrid Faça as devidas ligaçoes entre ele ( Não vou entrar no merito das ligaçoes) certifique-se que esta tudo configurado   O Mais importante aqui é a propriedade KeepConection e Connected do SqlConnection em False ; e Active do query tb em False pronto , vc ja esta Trbalhando Desconectado   Em um Botão vc faz   procedure TForm7.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ClientDataSet1.Open;
end;   Se vc quiser testar derrube a conexão e continue trablalando com o clientDataSet .. Insira muitos registros , faça alteraçoes delete , com os devidos cuidados pq tem que configurar providres flags etc e coisa e tal , mas para uma tabela simples não tem problema .. Passado um tempo , ative a conexão e basta dar um ApllayUpdates para que seu Banco seje Atualizado   Tb se vc der um clik no seu servidor em Property com o btão direito vai ver que o Numeoro de conexão é igual a zero ( Faça este teste com a Propriedade KeepConnection:=True) Perceba que a conexão ficou presa com o clientDataSet   com a propriedade KeepConnection em False     Agora com a propriedade KeepConnection Em True    
Responder

Gostei + 0

06/02/2011

Ronaldo Lanhellas

Obrigado pela explicação Marcos, mais "modeste a parte" você só falou o que eu já sabia, creiu que você não entendeu o meu problema. Preciso sincronizar varios banco de dados a um central, sendo que todos tem a mesma estrutura, mais cada um tem registros distintos. QUando sincronizar o banco central soma todos esses registros.
Responder

Gostei + 0

06/02/2011

Marco Salles

Então vc tem que criar uma StoreProcedure na base de dados .. A cada registro que for "entrando" para ser adicionado a StoreProcedure é disparada e vai atualizando o Estoque de um Determinado produto com o valor de entrada ( no caso de Troca) ou saida ( No caso de venda ) Então acho que se entendo direito a solução é criar um StoreProcedure
Responder

Gostei + 0

06/02/2011

Ronaldo Lanhellas

Hehehe.. ainda não entendeu amigão, acho que estou explicando da forma errada, a gerencia de estoque tenho funcionando tudo ok por storeProcedures.
Vou dar um exemplo do que preciso:
Tenho uma LOJA com um Computador que fica 1 Banco de Dados, com as seguintes tabelas e registros:TABELA: VENDEDORNOME: PAULOPRODUTO: MEIAQNT: 100
Quando o vendedor sai da LOJA, ele leva consigo um notebook com um "espelho" desse banco de dados (pois ele não irá usar a internet), então tudo que ele faz de alteração no notebook só vai afetar aquele banco de dados que está no notebook dele, e o banco de dados da LOJA no momento fica desatualizado. O que ocorre é que quando ele voltar para a LOJA essas novas informações que agora estão no notebook do VENDEDOR terão que ser todas passadas para o banco de dados da LOJA.Só isso ! :D
Responder

Gostei + 0

07/02/2011

Marco Salles

Acho que vc é que não esta entendendo ...  Veja   Quando o vendedor sai da LOJA, ele vai perder a conexão com o banco neste momento ele tem os dados no cds então ele da um  ClientDataSet1.SaveToFile(); e desliga o computador e vai viajar , vai vender   Na proxima cidade qnd ele ligar o notebook ele carrega os dados dando um ClientDataSet1.LoadFromFile();   Ate agora ele não fez nada ... Pois bem começa a vender , trocar etcc , no fim do processo ele da novamente um ClientDataSet1.SaveToFile();  .. Ai que entra a magia do clientDataSet , este pode conter muitos registros mas neste processo so o delta é salvo no Arquivo Otimizando o processo de leitura e escrita   então ele fica , Lendo , vendendo , salvando e assim vai ate o dia dele retornar   No dia que ele retorna o Grande momento .   ele da um ClientDataSet1.LoadFromFile();  e depois um ApplayUpdates e o midas faz o resto   enfim o processo é este .. Será que eu ainda não entendi ?????
Responder

Gostei + 0

07/02/2011

Ronaldo Lanhellas

Agora sim, muito boa a solução, tinha pensado em algo já mais concerteza a sua é melhor ! Agora tem como me explicar melhor como funciona o SaveTofile do CDS ? Ele vai salvar em um XML ? QUais as tabelas ele salva ? Só as modificadas ou todas do banco?
Responder

Gostei + 0

07/02/2011

Marco Salles

Ele vai salvar em um XML ?
  O Formato é Xml , mais precisamente Xml DataPacker ..    
como funciona o SaveTofile do CDS
  O SaveTofile , vc usa dois parametros  o primeiro parametro é o caminho ..Para o caminho vc faz assim     Declares uses Wsystem;  // delphi 2010 OK ....   begin cds.savetofile(gsAppPath+'Dados/NomeDatabela.xml',dfXMLUTF8); ) ... //CLaro que a pasta Dados tem que ser previamente criada   ps) O Nome da Tabela é o Nome mesmo ( Se for Produto sera Produtos e assim sucessivamente)   ps) o Segundo parametro é do tipo .. TDataPacketFormat = (dfBinary, dfXML, dfXMLUTF8); eu prefiro o ultimo , aceita acentos  
QUais as tabelas ele salva ? Só as modificadas ou todas do banco?  
  So as a tabelas que serão modificadas , alem das que fizerem parte do processo . Por exemplo , a tabela Produto O vendedor não vai modificar nesta Tabela , mas ela fara parte dos items da venda . Ela pode ir junto , so não vai ter o modulo de edita-la..  mas nada impede de salvar todas .. Mas se não vai usa-las desnecessário   Atençao.. Qnd se usa Mestre-Detalhe com o NESTEDDATASET ( isto é ) Relacionamento RAD do Delphi sem ter que fazer na unha , vc so salva a Tabela MESTRE , e ao carregar o Detalhe ja fica carregado   Detalhe importante é que deixe a opção FileName no Objeto Inspector em Branco .. Não atribua nada a ela Com isto todos os post que vc for dando no cds so serão carregados efetivamente qnd der um SaveToFile E Como se fosse o ApplayUpdates do modo sem conexão   Por exemplo LoadFromFile >> carrega Edit , insere , deleta SaveTofile >>> armazena (( se não der tudo que vc fez fica perdido))  Analogicamente ApplayUpdates do modo sem conexão    
Responder

Gostei + 0

16/05/2013

José

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar