PRODUTOS INDO PARA PEDIDOS DE OUTRO PDV

WEBIER 25/07/2017 22:52:04
#475410
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?
KERPLUNK 25/07/2017 23:03:14
#475411
Resposta escolhida
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?
WEBIER 25/07/2017 23:07:55
#475412
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...
KERPLUNK 26/07/2017 08:31:35
#475413
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.
PAULOOLIVEIRA 26/07/2017 08:52:06
#475417
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
KERPLUNK 26/07/2017 08:57:27
#475419
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...
OCELOT 26/07/2017 09:24:46
#475420
E como você está fazendo para pegar o COD_PEDIDO novo que foi gerado para poder adicionar na tabela dos itens do pedido?
FUTURA 26/07/2017 09:44:06
#475421
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.
WEBMASTER 26/07/2017 10:56:42
#475425
Sem duvida usar transaction como o Kerp ja comentou
NILSONTRES 26/07/2017 11:49:06
#475427
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.
FOXMAN 26/07/2017 14:20:40
#475433
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



Tópico encerrado , respostas não são mais permitidas