marcioe Posted September 27, 2013 Report Share Posted September 27, 2013 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 Quote Link to comment Share on other sites More sharing options...
joaosolution Posted September 27, 2013 Report Share Posted September 27, 2013 Marcio Acredito que se você criar uma trigger no BD será mais fácil pois o próprio BD irá controlar estas atualizações. http://www.linhadecodigo.com.br/artigo/3567/mysql-basico-triggers.aspx Att João Bosco Quote Link to comment Share on other sites More sharing options...
CIACPD Posted September 27, 2013 Report Share Posted September 27, 2013 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 Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted September 27, 2013 Report Share Posted September 27, 2013 Daniel, usas qual ferramenta para conexão com Banco ? Quote Link to comment Share on other sites More sharing options...
CIACPD Posted September 27, 2013 Report Share Posted September 27, 2013 SQLLIB para MySql SQLRDD para os demais este código que postei é usado com a SQLLIB. Daniel Segura Quote Link to comment Share on other sites More sharing options...
marcioe Posted September 27, 2013 Author Report Share Posted September 27, 2013 é SQLLIB PARA SQLLIB OS BANCOS DE DADOS FICAM N MESMO SERVIDOR. Quote Link to comment Share on other sites More sharing options...
CIACPD Posted September 28, 2013 Report Share Posted September 28, 2013 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 Quote Link to comment Share on other sites More sharing options...
sistem Posted September 28, 2013 Report Share Posted September 28, 2013 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 Quote Link to comment Share on other sites More sharing options...
CIACPD Posted September 28, 2013 Report Share Posted September 28, 2013 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 Quote Link to comment Share on other sites More sharing options...
marcioe Posted September 28, 2013 Author Report Share Posted September 28, 2013 amigo,s obrigado a todos pelo empenho em em ajudar. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.