PRODUTOS INDO PARA PEDIDOS DE OUTRO PDV
Boa noite pessoal,
Uso VB6+SQL serve 2008
Tenho um servidor, com banco de dados unico dele
Uso varios terminais (05 maquinas).... todas com PDV...
Procedimento simples: abro uma venda (cria um registro na tabela pedidos), com um cod_pedido unico para essa venda..,
Todos os produtos que eu adicionar nessa venda, é criado um registro na tabela [Ô]Pedido_itens[Ô] com o cod_Pedido daquela venda... tudo ordenado e autonumerado
ATé AI TUDO BEM!
o porem é no horario de fluxo intenso... ou seja, loja lotada, 05 terminais adicionando produtos ao mesmo tempo.
[Ô]as vezes[Ô] aparece produtos da venda de um outro terminal num outro terminal.... revi os codigos e nao achei erro... porem isso só acontece em fluxos grandes
o que devo fazer para evitar esse tipo de coisas?
Uso VB6+SQL serve 2008
Tenho um servidor, com banco de dados unico dele
Uso varios terminais (05 maquinas).... todas com PDV...
Procedimento simples: abro uma venda (cria um registro na tabela pedidos), com um cod_pedido unico para essa venda..,
Todos os produtos que eu adicionar nessa venda, é criado um registro na tabela [Ô]Pedido_itens[Ô] com o cod_Pedido daquela venda... tudo ordenado e autonumerado
ATé AI TUDO BEM!
o porem é no horario de fluxo intenso... ou seja, loja lotada, 05 terminais adicionando produtos ao mesmo tempo.
[Ô]as vezes[Ô] aparece produtos da venda de um outro terminal num outro terminal.... revi os codigos e nao achei erro... porem isso só acontece em fluxos grandes
o que devo fazer para evitar esse tipo de coisas?
Isso é problema de concorrência. Existem várias maneiras de contornar esse problema, vai depender de como você está fazendo. Vou tentar adivinhar o que você faz:
Você cria um registro na tabela de venda(cabeçalho da venda). O campo que serve como identificador é gerado com uma contagem ou um auto-numerador, acertei?
Você cria um registro na tabela de venda(cabeçalho da venda). O campo que serve como identificador é gerado com uma contagem ou um auto-numerador, acertei?
tabela PEDIDOS cria um campo COD_PEDIDO = autonumeração
quando passo o primeiro produto, ele cria o primeiro registro na tabela PEDIDOS_ITENS com:
CODIGO (autonumeracao)
COD_PEDIDO
DESCRICAO
PRECO
QUANT
ETC...
quando passo o primeiro produto, ele cria o primeiro registro na tabela PEDIDOS_ITENS com:
CODIGO (autonumeracao)
COD_PEDIDO
DESCRICAO
PRECO
QUANT
ETC...
Foi o que imaginei... Bem, você tem várias opções:
1 - Fazer a venda em memória: Você adiciona dados da venda e dos produtos em um objeto em memória e só grava ao final em uma única transação. Isso garante que gravações concorrentes não terão o mesmo número.
2 - Reserva de identificador: Basicamente uma tabela com um campo e um registro, onde você pega o número, soma um e regrava. Isso pode ser feito por Stored Procedure o que seria o ideal.
3 - Usar transações: SQL Server tem um suporte excelente à isso.
1 - Fazer a venda em memória: Você adiciona dados da venda e dos produtos em um objeto em memória e só grava ao final em uma única transação. Isso garante que gravações concorrentes não terão o mesmo número.
2 - Reserva de identificador: Basicamente uma tabela com um campo e um registro, onde você pega o número, soma um e regrava. Isso pode ser feito por Stored Procedure o que seria o ideal.
3 - Usar transações: SQL Server tem um suporte excelente à isso.
uma outra forma....
pega o ip da maquina, ou o usuario logado.... cria uma tabela auxiliar (usuario,produto,qtd,unit,total) por ex...
quando fechar insere os dados da venda na tabela principal , e dropa a tabela auxiliar...
blz
pega o ip da maquina, ou o usuario logado.... cria uma tabela auxiliar (usuario,produto,qtd,unit,total) por ex...
quando fechar insere os dados da venda na tabela principal , e dropa a tabela auxiliar...
blz
Citação::
uma outra forma....
pega o ip da maquina, ou o usuario logado.... cria uma tabela auxiliar (usuario,produto,qtd,unit,total) por ex...
quando fechar insere os dados da venda na tabela principal , e dropa a tabela auxiliar...
blz
Vixi! Que coisa esquisita isso...
E como você está fazendo para pegar o COD_PEDIDO novo que foi gerado para poder adicionar na tabela dos itens do pedido?
WEBIER, eu ja tive esse tipo de problema, ha muito tempo atras, e resolvi mudando a lógica. Hoje eu tenho uma tabela, que tem um campo que controla o numero do pedido, então o usuário faz a venda, adicionando os itens, e apenas ao salvar, bloqueio essa tabela, pego o numero do pedido, e ja atualizo com (+1), em seguida libero a tabela. Desta forma é impossÃvel duplicar pedidos, e a concorrência fica sob controle, ao modo que a velocidade é tão grande, que não é percebido pelos usuários. Ja uso assim ha anos, e nunca mais tive problemas de concorrência.
Sem duvida usar transaction como o Kerp ja comentou
Citação:Sem duvida usar transaction como o Kerp ja comentou
eu acho que transações deve ser usado em todos os casos, em vendas então onde se paga comissões e altera estoques nem se fala, mas muitos nem sabem o que é isso, faça uma pesquisa.
Um sistema sem transações a banco de dados é uma bomba relógio.
Isso é fácil de resolver, o problema é que muitos buscam utilizar campos de codigo de pedido com autoincrement.
Como eu tive que desenvolver um novo aplicativo de PDV para meu Supermercado, resolvi mudar também o sistema de identificação de PDV.
Atualmente toda minha frente de caixa utilizam como nome do computador(PDV1,PDV2,PDV3,PDV4 e um outro pdv como backup denominado PDV99).
Diante disso ao abrir uma venda o numero do pedido é do tipo string concatenando o nome do pdv(PDV1) + data atual(26-07-2017) + a HORA atual(13:54:35)
Sei que isso pode afetar a performace no sentido de uma busca por exemplo, mas até o momento não tenho o que reclamar.
Como utilizo MySQL tendo como tipo de tabela MyIsam, as transações não são utilizadas.
Uma das formas que fiz para garantir que um pdv não perca uma venda(em uma falta de energia e sem no-break, isso nem a venda salva na memoria resolveria) foi a criação de uma tabela que armazena
o pedido e outra que armazena os produtos(como o Paulo citou).
Ao abrir uma venda , chamo uma SP no servidor para criar uma tabela temporária(passando como parâmetro o código do pedido). Essa SP cria as tabelas temporárias com o nome do PDV que chamou.
A cada produto passado no pdv, é adicionado na tabela temporária. Caso Falte energia, ao retornar, eu checo se existe a tabela temporaria. Caso exista eu continuou com a venda normalmente e ao finalzar a venda eu DROPO a tabela e pronto.
Pode até parecer esquisito, mas no meu caso, eu exploro mais os recursos do servidor(mysql) do que recursos de programação, sem contar que qualquer alteração que eu desejar fazer tenho como primeiro recurso o servidor.
Atualmente meu servidor tem entre SPs e Functions mais de 100 objetos
Como eu tive que desenvolver um novo aplicativo de PDV para meu Supermercado, resolvi mudar também o sistema de identificação de PDV.
Atualmente toda minha frente de caixa utilizam como nome do computador(PDV1,PDV2,PDV3,PDV4 e um outro pdv como backup denominado PDV99).
Diante disso ao abrir uma venda o numero do pedido é do tipo string concatenando o nome do pdv(PDV1) + data atual(26-07-2017) + a HORA atual(13:54:35)
Sei que isso pode afetar a performace no sentido de uma busca por exemplo, mas até o momento não tenho o que reclamar.
Como utilizo MySQL tendo como tipo de tabela MyIsam, as transações não são utilizadas.
Uma das formas que fiz para garantir que um pdv não perca uma venda(em uma falta de energia e sem no-break, isso nem a venda salva na memoria resolveria) foi a criação de uma tabela que armazena
o pedido e outra que armazena os produtos(como o Paulo citou).
Ao abrir uma venda , chamo uma SP no servidor para criar uma tabela temporária(passando como parâmetro o código do pedido). Essa SP cria as tabelas temporárias com o nome do PDV que chamou.
A cada produto passado no pdv, é adicionado na tabela temporária. Caso Falte energia, ao retornar, eu checo se existe a tabela temporaria. Caso exista eu continuou com a venda normalmente e ao finalzar a venda eu DROPO a tabela e pronto.
Pode até parecer esquisito, mas no meu caso, eu exploro mais os recursos do servidor(mysql) do que recursos de programação, sem contar que qualquer alteração que eu desejar fazer tenho como primeiro recurso o servidor.
Atualmente meu servidor tem entre SPs e Functions mais de 100 objetos
Tópico encerrado , respostas não são mais permitidas