Sincronização de BD
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.
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
Curtidas 0
Respostas
Marco Salles
04/02/2011
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
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
GOSTEI 0
Ronaldo Lanhellas
04/02/2011
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.
GOSTEI 0
Marco Salles
04/02/2011
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
GOSTEI 0
Ronaldo Lanhellas
04/02/2011
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
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
GOSTEI 0
Marco Salles
04/02/2011
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 ?????
GOSTEI 0
Ronaldo Lanhellas
04/02/2011
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?
GOSTEI 0
Marco Salles
04/02/2011
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
GOSTEI 0
José
04/02/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0