Como fazer carga em PDVs

42 respostas
G

A DUVIDA É A SEGUINTE,
TENHO 3 PCS , UM SERVIDOR E DOIS CLIENTES , QUE NO CASO SÃO OS CAIXAS
QUERO CRIAR NOS CAIXAS UM BD IGUAL A DO SERVIDOR, E NO SISTEMA DO SERVIDOR CRIAR UM BOTÃO CARGA NOS CXS
QUE QUANDO CLICADO ELE PEGUE TODOS OS DADOS DA TABELA PRODUTOS E CLIENTES E ATUALIZE AS MESMAS NOS CAIXAS

E OUTRO BOTÃO QUE PUXE TODOS OS DADOS DA TABELA VENDAS E ITENSVENDA DO CAIXA E ATUALIZE AQUI NO SERVIDOR

O OBJETIVO É QUE OS CXS Ñ FIQUEM TÃO DEPENDENTE DO SERVIDOR, QUE CASO OCORRA ALGUM PROBLEMA NO SERVIDOR, OS CX
NÃO PAREM DE FUNCIONAR.

ANDEI PESQUISANDO E VI SOBRE SINCRONIZAÇÃO DE BD, MAIS NÃO TENHO IDÉIA DE COMO FAZER ISSO

MEU SISTEMA ESTA SENDO FEITO EM JAVA DESKTOP E MEU BD É MYSQL

VALEU GALERA
AGUARDO ALGUMA AJUDA

42 Respostas

L

Pelo amor de Deus quando for mandar uma mensagem desligue o caps lock.

Isso que vc está falando está “cheirando” a PAF …

G

BLZ,LUIZ

ENTAUN PELO QUE DEVE TER VISTO SOU NOVATO NESSA AREA , TERIA ALGUMA SOLUÇÃO PARA ESSE MEU PROBLEMA
AGUARDO

VLW

G

ah e foi mal pelo caps look

H

Também estou querendo fazer a mesma coisa que você no momento, mas ainda não defini como sincronizar, só sei que vou usar mySQL no servidor e um banco embedded nos PDVs, H2 ou Derby

L

grippa ,

Como o colega falou, é usar um banco local do tipo derby,h2 ou mesmo firebird e “matutar” como vc vai fazer essa sincronização na “munheca” porque não existe nada pronto.

D

Não cometa esse erro.
Use MySQL em todos.
A única restrição quanto ao convênio PAF/ECF é que a aplicação rode sem depender da rede.
Para sincronizar, eu criaria um outro app, que ficaria oculto e seria controlado por uma thread. Na inicialização e no encerramento do PDV, ele sincroniza e, neste intervalo, colocaria um gerador randômico, só para colocar ele em sleep por X tempo até a próxima sincronização.

H

luiz_renato:
grippa ,

Como o colega falou, é usar um banco local do tipo derby,h2 ou mesmo firebird e “matutar” como vc vai fazer essa sincronização na “munheca” porque não existe nada pronto.

Realmente não tem muito segredo, o problema é que cada caso é um caso e exigirá uma solução diferente, mas a ideia é a mesma pra todos, para a carga dos dados dos clientes e produtos basta fazer um update das tabelas, no caso das vendas dá um pouco mais de trabalho pra juntar os dados e atualizar no servidor, o importante mesmo é definir o intervalo de tempo entre as sincronizações…
Dá uma pesquisada sobre, tem n maneiras de resolver esse problema, eu penso que para o meu caso será melhor fazer via triggers

F

Amigo, você não consegue fazer essa sincronização via banco mesmo não?

Banco de dados distribuido? Talvez o mysql tem esse suporte.

H

Não cometa esse erro.
Use MySQL em todos.
A única restrição quanto ao convênio PAF/ECF é que a aplicação rode sem depender da rede.
Para sincronizar, eu criaria um outro app, que ficaria oculto e seria controlado por uma thread. Na inicialização e no encerramento do PDV, ele sincroniza e, neste intervalo, colocaria um gerador randômico, só para colocar ele em sleep por X tempo até a próxima sincronização.

Eu só não queria ter que instalar o banco em todas as máquinas, ou deixar a tarefa para o cliente, tirando isso acho melhor que seja assim, pois o próprio MySQL tem recursos para fazer a sincronização

F

Saca esses slides aqui. Acabei de buscar no google. Acho que o que você está procurando é contemplado pra esse cenário.

Mas primeiramente tem que confirmar se o mysql da suporte.

D

Sério, eu prestava suporte à aplicações com banco integrado, foi a pior fase da minha vida.
O esquema era esse mesmo (agravante que o banco do servidor era oracle 8i). E sempre dava pau nos mdbs da vida.
Aí, pra resolver, dá-lhe abrir o visual foxpro na máquina do cliente(!!!) e editar os arquivos corrompidos na mão.
Dá trabalho instalar e configurar o mysql, sim, mas dificilmente terá problema depois.

G

vou dar uma olha no link que o filipemarruda
mandou

vlw

G

ainda não consegui resolver minha duvida,
pretendo usar mysql em todos os pcs, mais como fazer isso na pratica?
tenho que criar um bd nos pdvs com a mesma estrutura do servidor ?

e como fazer um update na tabela produtos do pdv , com os dados da tabela produtos do servidor?

se alguem tiver algum ex , coloca ai pra esclarecer melhor a solução

vlw,

H

filipemarruda:
Saca esses slides aqui. Acabei de buscar no google. Acho que o que você está procurando é contemplado pra esse cenário.

Mas primeiramente tem que confirmar se o mysql da suporte.

É isso mesmo!

drsmachado :
Sério, eu prestava suporte à aplicações com banco integrado, foi a pior fase da minha vida.
O esquema era esse mesmo (agravante que o banco do servidor era oracle 8i). E sempre dava pau nos mdbs da vida.
Aí, pra resolver, dá-lhe abrir o visual foxpro na máquina do cliente(!!!) e editar os arquivos corrompidos na mão.
Dá trabalho instalar e configurar o mysql, sim, mas dificilmente terá problema depois.

Vlw pela dica, vou investir no mySQL mesmo…

grippa:
ainda não consegui resolver minha duvida,
pretendo usar mysql em todos os pcs, mais como fazer isso na pratica?
tenho que criar um bd nos pdvs com a mesma estrutura do servidor ?

e como fazer um update na tabela produtos do pdv , com os dados da tabela produtos do servidor?

se alguem tiver algum ex , coloca ai pra esclarecer melhor a solução

vlw,

Tecnicamente só precisa ter as tabelas necessárias para efetuar a venda, mas nem sempre isso será possível devido às chaves estrangeiras, eu faria um banco idêntico…
O update é igual você faz no banco local, a única diferença é que ao invés de acessar o bd local vc vai acessar um bd remoto, vc terá mais de uma classe de conexão …

G

certo, tenho que fazer mais classe pr conectar com bd do cx ,

dai na tela principal do meu sistema onde pretendo deixar o botão de carga , chamo um metodo que vai conectar com com bd do cx e fazer um update nas tabelas, é isso?

mais qual seria a sintaxe desse update?

H

grippa:
certo, tenho que fazer mais classe pr conectar com bd do cx ,

dai na tela principal do meu sistema onde pretendo deixar o botão de carga , chamo um metodo que vai conectar com com bd do cx e fazer um update nas tabelas, é isso?

mais qual seria a sintaxe desse update?

A lógica é essa, mas é sério que não sabe fazer um update?

Não sei como está desenvolvendo sua aplicação e quais as tecnologias utilizadas mas espero que essas ideias ajudem…
Andei pesquisando e creio que resolvi os meu problemas de como fazer para o meu caso … aqui trabalhamos com hibernate, só precisarei criar arquivos.cfg diferentes para cada banco e consequentemente criar SessionFactories diferentes para manipulá-los, as operações de insert e update não mudam nada do habitual, só vou ter que programar uma rotina para que a cada determinado período de tempo ficar atualizando os bancos …
O que me incomodava era como embutir o mySQL na instalação do sistema, baixei o mySQl “no install” e vou criar uma instalação dele com o sistema usando o innoSetup, com ele eu posso criar uma chave no registro para fazer com que o serviço do mySQL inicie junto com o windows e pronto, problema resolvido! :slight_smile:

G

vou tentar dessa maneira como você falou ,
pela logica é pr dar certo vamos ver na pratica , vlw pela ajuda

G

Não estou conseguindo conectar com o bd do outro pc,

static final String JDBC_DRIVER = com.mysql.jdbc.Driver;

static final String DATABASE_URL = jdbc:mysql://192.168.1.100/sistemacomercial”;

final private String usuario = root;

final private String senha = “”;

qual sera o motivo , ja tentei criar outros usuarios mais tambem não conecta
estou usando o windows 7 sera alguma configuração de rede ou sera alguma configuração no mysql q tenho que fazer?

de uma força ai galera !!!

H

Cara antes de mais nada sempre que for postar um código coloque entre as tags code e /code …

Dá uma olhada nestes tutoriais:
http://guj.com.br/articles/7
http://javafree.uol.com.br/artigo/1356/Acessando-banco-de-dados-em-Java-PARTE-1.html
http://javafree.uol.com.br/artigo/1357/Acessando-Banco-de-Dados-em-Java-PARTE-2.html
http://javafree.uol.com.br/artigo/1358/Acessando-Banco-de-Dados-em-Java-PARTE-3.html
http://javafree.uol.com.br/artigo/868854/Trabalhando-com-JDBC.html

G

antes de mais nada , valeu pela ajuda

consegui conectar com bd do outro pc , o problema era o firewall ,

agora a duvida é a seguinte qual seria a maneira correta de passar os dados da tabela produtos do servidor para a tabela produtos do bd do cx e atuallizar os que estão la ,quando clicar e carga pdv

H

Replicação talvez
http://dev.mysql.com/doc/refman/5.0/en/replication.html

G

boa noite henrique,

teria algum ex de como fazer isso,

H

Cara é só pesquisar, pesquise…

http://www.htmlstaff.org/ver.php?id=10155
http://rgadelha.wordpress.com/2011/06/24/como-configurar-replicacao-no-mysql/
http://itbygirls.blogspot.com.br/2009/08/replicacao-de-dados-utilizando-mysql.html
http://www.howtoforge.com/mysql_master_master_replication
http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html

G

não sei se foi a maneira correte de se fazer isso, mais deu certo

fiz o seguinte código

try {		         
		         c1.executeSQL("select * from produtos");
		       	    	  
			        while (c1.resultset.next())
			        {
			        	String codigo = c1.resultset.getString("codigo");
				        conCx.executeSQL("select * from produtosCx where codigo = '"+codigo+"'");
				        if(!conCx.resultset.next())
				        {				        	   	
				        	String sqlinsert = "insert into produtoscx (codigo,codBarras,nome,codSetor,nomeSetor,fornecedor,qtdMin,qtdTotal,icms,custo,margem,preco,data,obs) values ('"+c1.resultset.getString("codigo")+"','"+c1.resultset.getString("codBarras")+"','"+c1.resultset.getString("nome")+"" +
							 		"','"+c1.resultset.getString("codSetor")+"','"+c1.resultset.getString("nomeSetor")+"','"+c1.resultset.getString("fornecedor")+"','"+c1.resultset.getString("qtdMin")+"','"+c1.resultset.getString("qtdTotal")+"','"+c1.resultset.getInt("icms")+"','"+c1.resultset.getDouble("custo")+"','"+c1.resultset.getDouble("margem")+"','"+c1.resultset.getDouble("preco")+"'" +
							 				",'"+c1.resultset.getString("data")+"','"+c1.resultset.getString("obs")+"')";
							 conCx.statement.executeUpdate(sqlinsert);	
				        }
				        else
				        {
				        	 String sql = "UPDATE produtoscx set nome = '"+c1.resultset.getString("nome")+"' where codigo = "+codigo;
							 String sql2 = "UPDATE produtoscx set codSetor = '"+c1.resultset.getString("codSetor")+"' where codigo = "+codigo;
							 String sql3 = "UPDATE produtoscx set fornecedor = '"+c1.resultset.getString("fornecedor")+"' where codigo = "+codigo;	 
							 String sql4 = "UPDATE produtoscx set qtdMin = '"+c1.resultset.getString("qtdMin")+"' where codigo = "+codigo;	 
							 String sql5 = "UPDATE produtoscx set qtdTotal = '"+c1.resultset.getString("qtdTotal")+"' where codigo = "+codigo;	 
							 String sql6 = "UPDATE produtoscx set icms = '"+c1.resultset.getInt("icms")+"' where codigo = "+codigo;	 
							 String sql7 = "UPDATE produtoscx set custo = '"+c1.resultset.getString("custo")+"' where codigo = "+codigo;	 
							 String sql8 = "UPDATE produtoscx set margem = '"+c1.resultset.getString("margem")+"' where codigo = "+codigo;	 
							 String sql9 = "UPDATE produtoscx set preco = '"+c1.resultset.getString("preco")+"' where codigo = "+codigo;	 
							 String sql10 = "UPDATE produtoscx set data = '"+c1.resultset.getString("data")+"' where codigo = "+codigo;	 
							 String sql11 = "UPDATE produtoscx set obs = '"+c1.resultset.getString("obs")+"' where codigo = "+codigo;	 
							 String sql12 = "UPDATE produtoscx set nomeSetor = '"+c1.resultset.getString("nomeSetor")+"' where codigo = "+codigo;	 

							 conCx.statement.executeUpdate(sql);
							 conCx.statement.executeUpdate(sql2);
							 conCx.statement.executeUpdate(sql3);
							 conCx.statement.executeUpdate(sql4);
							 conCx.statement.executeUpdate(sql5);
							 conCx.statement.executeUpdate(sql6);
							 conCx.statement.executeUpdate(sql7);
							 conCx.statement.executeUpdate(sql8);
							 conCx.statement.executeUpdate(sql9);
							 conCx.statement.executeUpdate(sql10);
							 conCx.statement.executeUpdate(sql11);
							 conCx.statement.executeUpdate(sql12);
							 
				        }
			        }
		    } catch (SQLException e) {
		    	JOptionPane.showMessageDialog(null, "erro na carga dos PRODUTOS");
				e.printStackTrace();
		    }

com poucos cadastros funcionou , preciso testar com bastante registro pra ver quanto tempo isso vai demorar
e também preciso testar na pratica pra ver se quando estiver em uso os cx se fizer a carga não vai travar

H

Edite sua mensagem, as tags “code” ficam entre [] no início e [/] no fim

Exemplo:

public class Exemplo { /**/ }

Acima da caixa de mensagem tem várias opções de edição, sempre faça uso delas…

G

com sua experiencia na area, oque vc acha dessa solução

resolve meu problema ou vou ter dor de cabeça no futuro ?

H

Digamos que adm do sistema tenha atualizado vários preços às 7h30 da manhã e clicado no botão para enviar a carga, mas naquele horário não tem muito movimento e nem todos os caixas estavam em funcionamento … mas mesmo se estivessem todos e houvesse um problema na rede, o adm teria que ficar clicando no botão até ter certeza que todos os PDVs receberam os Updates de produtos e clientes? Depois que o adm clica no botão o trabalho dele está feito certo?! A partir daí a aplicação não deveria se responsabilizar inteiramente pela atualização de todos os PDvs?
Se não for assim quando aquele PDV for ligado haverá muitos problemas … a aplicação deve gerenciar tudo isso, prevendo todo e qualquer imprevisto a fim de que todo PDV trabalhe com dados atualizados, sem é claro que o funcionário tenha que ficar de 15 em 15 minutos clicando num botão, os sistemas existem pra isso…

H

Por isso eu havia sugerido replicação, você configura pra replicar as tabelas e pronto, não precisa fazer mais nada, assim que é atualizado um registro no Retaguarda, INSERT, UPDATE, DELETE, automaticamente ele atualiza no PDV e caso haja falha na comunicação ele aguarda e atualiza quando possível

G

sobre isso ja havia pensado, vou colocar um fedback com o retorno sobre as atualização se for bem sussedidas ou se ocorreu algum erro, outra possibilidade é de quando os pdvs forem ligados pela primeira vez recebera um carga

mais oque estou preocupado é o tempo que isso vai demorar com uma quantidade mto grande de registros tipos uns 12.000 cadastro

por enquanto pretendo deixar assim e mais adiante tento como vc me disse , uma replicação que pela sua explicação é a melhor maneira

H

Na verdade se você for trabalhar com bases idênticas, antes de colocar os PDVs pra funcionar e aproveitando que você vai ter que configurar a replicação em todos os mySql, simplesmente copia a base do Retaguarda pros PDVs com um HD externo :slight_smile:
Daí em diante a replicação se encarrega de tudo…

L

Eu implementei isso…
Uso na base central Postgresql e nos demais pcs…uso o derby… para efetuar a sincronização, pos pdvs acessam a base central e geram um arquivo com os dados exportados pelo postgres…depois eles importam esses dados para as bases locais

G

estou tentando fazer uma replicação do meu bd, como sugeriu mais estou com um duvida já no primeiro passo

no link
http://itbygirls.blogspot.com.br/2009/08/replicacao-de-dados-utilizando-mysql.html

1º Passo: Pare o serviço do MySQL e adicione as seguintes linhas no arquivo my.ini da Máquina 1 (Master 1 e Slave 2), dentro de [mysqld].

OBS.: O arquivo my.ini está localizado na pasta C:\Arquivos de programas\MySQL\MySQL Server 5.1

pois aqui no meu pc nessa pasta não contem esse arquivo my.ini , o mais semelhante é my-innodb-heavy-4G

H

grippa:
estou tentando fazer uma replicação do meu bd, como sugeriu mais estou com um duvida já no primeiro passo

no link
http://itbygirls.blogspot.com.br/2009/08/replicacao-de-dados-utilizando-mysql.html

1º Passo: Pare o serviço do MySQL e adicione as seguintes linhas no arquivo my.ini da Máquina 1 (Master 1 e Slave 2), dentro de [mysqld].

OBS.: O arquivo my.ini está localizado na pasta C:\Arquivos de programas\MySQL\MySQL Server 5.1

pois aqui no meu pc nessa pasta não contem esse arquivo my.ini , o mais semelhante é my-innodb-heavy-4G

Só vai ter esse arquivo se você tiver optado por baixar o MySQL MSI Installer, aquele que você configura passo a passo na janela, caso tenha baixado o MySQL “no install” que é o .ZIP aí não vai ter esse arquivo

http://dev.mysql.com/downloads/mysql/

G

segui esse tutorial
http://www.devmedia.com.br/mysql-replicacao-de-dados/22923

deu tudo certinho, só deu erro na hora de dar o start no slave, primeiro deu error 1200
depois reiniciei o pc e tentei de novo agora esta dando o seguinte erro

ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log"

tentei reconfigurar td de novo mais da o mesmo erro,

oque sera que esta errado?

H

Acho que não há nada errado mas dá uma olhada aqui, pode ser uma solução http://perplexed.co.uk/301_restoring_a_broken_slave.htm

G

nesse link ele diz que deletou o seguinte arquivo

Eu deletei o arquivo do relay-log.info

/ var / lib / mysql / relay-log.info

não consegui achar esse arquivo.

na configuração do master da tudo certo, quando começo a confugurar o slave que da esse erro

mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.1.100’, ip do master
-> MASTER_USER=‘replicador’,
-> MASTER_PASSWORD=‘replica’,
-> MASTER_LOG_FILE=‘mysql-bin.000001’,
-> MASTER_LOG_POS=0;

quando faço eaae config que da o erro

tentei fazer am casaa que tenho o win 7 da o mesmo erro, desabilitei o firewal mais continua a mesma coisa

H

Vc fez toda a cofiguração corretamente como explicado aqui http://itbygirls.blogspot.com.br/2009/08/replicaca…de-dados-utilizando-mysql.html?
Concedeu as permissões de acesso antes da primeira replicação, se lembrou que as bases a serem replicadas devem ser idênticas?

G

Desinstalei o mysql e instalei de novo

criei um usuario replication e bd teste na duas maquinas
e fiz como esta dizendo no 1° passo no 2° passo e no ° passo

configurações feitas nos arquivos my
no master

server-id = 1
master-host = 192.168.1.102 ip da maquina que vai ser slave
master-user = replication
master-password = slave
master-port = 3306
log-bin = mysql-log
binlog-do-db = teste
log-error= logerror
log-slave-updates
relay-log=relay-log
relay-log-index=relay-log-index
relay-log-info-file=relay-log-info
sync_binlog=1
replicate-do-db= teste
report-host= 192.168.1.102 ip da maquina que vai ser slave
report-user=replication
report-password=slave
report-port=3306

[mysql.server]

user=mysql

basedir=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/”

[mysql_safe]

err-log=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/data”

pid-file=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/data/adrielle.pid”

e no slave
server-id = 2
master-host = 192.168.1.100 ip do maquina que vai master
master-user = replication
master-password = slave
master-port = 3306
log-bin = mysql-log
binlog-do-db = teste
log-error= logerror
log-slave-updates
relay-log=relay-log
relay-log-index=relay-log-index
relay-log-info-file=relay-log-info
sync_binlog=1
replicate-do-db= teste
report-host= 192.168.1.100 ip do maquina que vai master
report-user=replication
report-password=slave
report-port=3306

[mysql.server]

user=mysql

basedir=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/”

[mysql_safe]

err-log=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/data”

pid-file=“C:/Arquivos de programas/MySQL/MySQL Server 5.5/data/adrielle.pid”

dai quando vou iniciar o serviço do mysql da o seguinte erro

[color=red]Não foi possivel iniciar o serviço mysql em computador local
Erro 1067: O prosseço terminou de forma inesperada
[/color]

H

O mySql tem uma lista de mais de 2000 erros comuns, impossível alguém olhar e saber mas dando uma googlada por “mysql error 1067” aparecem algumas coisas tipo
http://help.onbit.com.br/index.php?title=Qual_a_Solu%C3%A7%C3%A3o_para_%E2%80%9CErro_de_Sistema_1067%E2%80%9D,_no_servidor_MySQL%3F

G

ta tenso ,

vendo esses tutoriais não parece ser algo tão complicado

mais estou apanhando pr caramba

continua dando o mesmo erro 1067 quando vou iniciar o serviço mysql

alquem me da help !!!

G

ta tenso ,

vendo esses tutoriais não parece ser algo tão complicado

mais estou apanhando pr caramba

continua dando o mesmo erro 1067 quando vou iniciar o serviço mysql

alquem me manda um help !!!

G

seguindo este outro tutorial consegui resolver parcialmente meu problema,

Agora a duvida é a seguinte como fazer replicação entre o servidor e os dois caixas,

com 2 pcs deu certo MASTER-MASTER tudo feito no serv replicava para o cx1 e vice versa

agora como que faço com 2° cx

Alguem tem alguma dica ??

Criado 26 de julho de 2012
Ultima resposta 5 de set. de 2012
Respostas 42
Participantes 6