Jump to content
Fivewin Brasil

replicar tabela de uma banco dados em bancos diferentes.


marcioe

Recommended Posts

Amigos preciso fazer assim

tenho 02 bancos de dados em um ou pode ser em servidor diferente de for o caso. porem algumas tabelas preciso que sejam identicas sempre, tipo a tabela de clientes, cidades, e vendedores

sempre será a banco 01 quem será o banco (mestre)

Exemplo.:

db_banco_01 (onde é cadastrado os clientes, cidades, etc...)
e
db_banco_02 ( onde vai receber esses dados)

Porem amigos, não posso mandar replicar Tudo, pois os bancos tem tabelas diferentes, as unicas identicas são as que devem ser (replicadas) no caso clientes, cidades, e vendedores

Preciso que a cadastrar o cliente 23002 apos gravar ele vá para o banco de dados db_banco_02, se eu modifcar a mesma coisa apos gravar ele atualizar o segundo banco

Link to comment
Share on other sites

Márcio, tentei de varias formas, trigger , replicação pelo próprio banco mas só funcionou perfeito via programação.

abaixo uma rotina do módulo para voce ver como eu faço a atualização da tabela grupo de produtos

//----------------------------------------------------------------------------//
function nivela_grupro()
// nivelamento cadastro de grupo ida
sqlsetconnection(nConn2)
cPesq_Sql:= "SELECT * FROM grupro WHERE grupro.DTALTERA >="+STR_SQL ( ddtinicio )+"order by grupro.CODGRU"
fecha("grupro")
use grupro as cPesq_Sql alias grupro new via 'mysql'
sqlsetconnection(nConn1)
do while !eof() .and. !lsair
fecha("peslocal")
xsql:= "SELECT * FROM grupro where grupro.CODGRU= '"+(grupro->codgru)+"'"
use grupro as xsql alias peslocal new via 'mysql'
go top
if eof()
TRY
SqlExec("Start Transaction")
INCLUIX( "grupro", "grupro", { {"CODGRU" , grupro->codgru }, ;
{"DESGRU" , grupro->desgru }, ;
{"MARCOM" , grupro->marcom }, ;
{"PERLUC" , grupro->perluc }, ;
{"DEPART" , grupro->depart }, ;
{"MEN1GRU", grupro->men1gru},;
{"MEN2GRU", grupro->men2gru},;
{"DTALTERA", grupro->DTALTERA},;
{"HRALTERA", grupro->HRALTERA},;
{"PROXGRU", grupro->PROXGRU}} )
SqlExec("Commit")
CATCH
SqlExec("RollBack")
END
else
if ( peslocal->DTALTERA < ddtinicio ) .or. ( peslocal->DTALTERA = ddtinicio .and. peslocal->HRALTERA < grupro->HRALTERA )
TRY
SqlExec("Start Transaction")
ALTERAX( "grupro", "CODGRU='"+grupro->codgru+"'", { { "DESGRU" , grupro->desgru }, ;
{ "MARCOM" , grupro->marcom }, ;
{ "PERLUC" , grupro->perluc }, ;
{ "DEPART" , grupro->depart }, ;
{ "MEN1GRU", grupro->men1gru},;
{ "MEN2GRU", grupro->men2gru},;
{ "DTALTERA", grupro->DTALTERA},;
{ "HRALTERA", grupro->HRALTERA},;
{ "PROXGRU", grupro->PROXGRU}} )
SqlExec("Commit")
CATCH
SqlExec("RollBack")
END
endif
endif
select grupro
skip
nreplicacao++
if cmsg_andamento != "Nivelando grupo dos produtos ida"
cmsg_andamento := "Nivelando grupo dos produtos ida"
omsg_andamento:refresh()
ctime2 := time()
otime2:refresh()
endif
enddo
close all
// nivelamento cadastro de grupo volta
sqlsetconnection(nConn1)
cPesq_Sql:= "SELECT * FROM grupro WHERE grupro.DTALTERA >="+STR_SQL ( ddtinicio )+" order by grupro.CODGRU"
use grupro as cPesq_Sql alias grupro new via 'mysql'
sqlsetconnection(nConn2)
do while !eof() .and. !lsair
fecha("peslocal")
xsql:= "SELECT * FROM grupro where grupro.CODGRU= '"+(grupro->codgru)+"'"
use grupro as xsql alias peslocal new via 'mysql'
go top
if eof()
TRY
SqlExec("Start Transaction")
INCLUIX( "grupro", "grupro", { { "CODGRU" , grupro->codgru }, ;
{ "DESGRU" , grupro->desgru }, ;
{ "MARCOM" , grupro->marcom }, ;
{ "PERLUC" , grupro->perluc }, ;
{ "DEPART" , grupro->depart }, ;
{ "MEN1GRU", grupro->men1gru},;
{ "MEN2GRU", grupro->men2gru},;
{ "DTALTERA", grupro->DTALTERA},;
{ "HRALTERA", grupro->HRALTERA},;
{ "PROXGRU", grupro->PROXGRU}} )
SqlExec("Commit")
CATCH
SqlExec("RollBack")
END
else
if ( peslocal->DTALTERA < ddtinicio ) .or. ( peslocal->DTALTERA = ddtinicio .and. peslocal->HRALTERA < grupro->HRALTERA )
TRY
SqlExec("Start Transaction")
ALTERAX( "grupro", "CODGRU='"+grupro->codgru+"'", { { "DESGRU" , grupro->desgru }, ;
{ "MARCOM" , grupro->marcom }, ;
{ "PERLUC" , grupro->perluc }, ;
{ "DEPART" , grupro->depart }, ;
{ "MEN1GRU", grupro->men1gru},;
{ "MEN2GRU", grupro->men2gru},;
{ "DTALTERA", grupro->DTALTERA},;
{ "HRALTERA", grupro->HRALTERA},;
{ "PROXGRU", grupro->PROXGRU}} )
SqlExec("Commit")
CATCH
SqlExec("RollBack")
END
endif
endif
select grupro
skip
nreplicacao++
if cmsg_andamento != "Nivelando grupo dos produtos volta"
cmsg_andamento := "Nivelando grupo dos produtos volta"
omsg_andamento:refresh()
ctime2 := time()
otime2:refresh()
endif
enddo
close all
return .t.
// -------------------------------------------------------------------------- //
Funcionamento semelhante para rede local ou remoto, é só criar duas conecções.
Daniel Segura
Link to comment
Share on other sites

Márcio, voce precisa apenas fazer as conecções, veja abaixo:

as variáveis que uso são chost_principal, chost_local, db , user, pwd

nConn1 = Número da Primeira conecção

nConn2 = Número da Segunda Conecção

chost_principal = IP loja matriz

chost_local = IP loja filial

db = Base de Dados

user = Usuário

pwd = Senha

// Primeira

SQL CONNECT ON alltrim( chost_principal ) PORT 3306 DATABASE db USER user PASSWORD pwd LIB "MySQL"
nConn1:= SQLGetConnection()
If nConn1 = 0
status_replica:=.f.
sysrefresh()
stop_replica()
return .t.
endif
// Segunda
SQL CONNECT ON alltrim( chost_local ) PORT 3306 DATABASE db USER user PASSWORD pwd LIB "MySQL"
nConn2:= SQLGetConnection()
If nConn2 = 0
SQL DISCONNECT FROM nConn1
status_replica:=.f.
sysrefresh()
stop_replica()
return .t.
endif
no meu caso o db (base de dados) é igual o que muda é o local chost_local e chost_principal
no seu caso o local seria igual e a base de dados que muda db1 e db2
Daniel Segura
Link to comment
Share on other sites

Uso da seguinte forma:

tenho 10 dbs ex: (db0, db1, db2... db9), o db0 seria o db universal digamos assim, todas as tabelas cliente, vendedor sao contidas nesse database (tabelas de cadastro)

quando o usuario entrar no sistema, sempre abre dois dbs, o db0 e um outro db(1a9), ficando duas conexões abertas.

os dbs de 1 a 9 seria o numero de empresa que o cliente tem.

entao se o usuario entrar na empresa-01(db1), o programa vai abrir as conexões db0 e o db1. ao cadastrar um cliente o mesmo é gravado na tabela que se encontra no db0... e quanto faz um pedido o mesmo é gravado na tabela que esta no db1.

se o cliente na abertura do programa escolher a empresa-02(db2) o programa vai abrir a conexao db0 e db2...como a tabela de cliente esta contida no db0 servira para a empresa-02.

caso queira um exemplo posto aqui

uso sqlrdd

Link to comment
Share on other sites

Sistem, Seus dados são replicados?

Uso desta forma que voce falou num sistema contabil, mas sem replicar.

Exemplo, No mesmo dia um cliente compra na loja de Osasco, retira na loja de São Roque, e paga a uma parcela na loja de Sorocaba e quando ele passar por Campinas 1 hora depois poderá pedir um extrato de todo seu movimento?

da forma que eu faço todas as ações são gravadas localmente e depois de 2 a 3 minutos em todas as outras lojas estarão replicados os dados.

Se cair a internet tudo continua como se nada tivesse acontecido. Quando ela volta a funcionar reinicia a replicação e em instantes tudo fica lançado.

Daniel Segura

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...