PRODUTOS INDO PARA PEDIDOS DE OUTRO PDV

 Tópico anterior Próximo tópico Novo tópico

PRODUTOS INDO PARA PEDIDOS DE OUTRO PDV

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#475410 - 25/07/2017 22:52:04

WEBIER
URUCUI
Cadast. em:Dezembro/2003


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?



#475411 - 25/07/2017 23:03:14

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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?

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#475412 - 25/07/2017 23:07:55

WEBIER
URUCUI
Cadast. em:Dezembro/2003


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...




#475413 - 26/07/2017 08:31:35

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#475417 - 26/07/2017 08:52:06

PAULOOLIVEIRA
RIO CLARO - SP
Cadast. em:Fevereiro/2004


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


Paulo Oliveira


Impossivel é Deus pecar, o resto a gente da um jeito!

#475419 - 26/07/2017 08:57:27

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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...

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#475420 - 26/07/2017 09:24:46

OCELOT
SOROCABA
Cadast. em:Março/2012


E como você está fazendo para pegar o COD_PEDIDO novo que foi gerado para poder adicionar na tabela dos itens do pedido?



#475421 - 26/07/2017 09:44:06

FUTURA
.
Cadast. em:Maio/2004


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.



#475425 - 26/07/2017 10:56:42

WEBMASTER
CURITIBA
Cadast. em:Janeiro/2001


Membro da equipe
Sem duvida usar transaction como o Kerp ja comentou

WebMaster - VBMania

Nao me mande e-mail com duvidas
Para isso e que existe o forum do VBMania !!!

#475427 - 26/07/2017 11:49:06

NILSONTRES
SAO PAULO
Cadast. em:Março/2012


Última edição em 26/07/2017 11:50:27 por NILSONTRES

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.




#475433 - 26/07/2017 14:20:40

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
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






Grupo DotNet.Br no FaceBook



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário