Sugestão de gravar pedido e itens de pedidos????
Boa tarde, uso Dbexpress com Firebird
Já postei esta minha dúvida aqui antes mais até hoje não obtive sucesso..
Alguém poderia me mandar um exemplo, uma sugestão de como eu faço para poder gravar um pedido e seus itens, sem que eu perca a sequencia de pedidos? os itens serão digitado diretamente em um dbgrid.
Obs: estarei efetuando os pedidos em estações da rede, vários usuários estarão fazendo pedido simultaneamente.
Obrigado!
jelves@terra.com.br
Já postei esta minha dúvida aqui antes mais até hoje não obtive sucesso..
Alguém poderia me mandar um exemplo, uma sugestão de como eu faço para poder gravar um pedido e seus itens, sem que eu perca a sequencia de pedidos? os itens serão digitado diretamente em um dbgrid.
Obs: estarei efetuando os pedidos em estações da rede, vários usuários estarão fazendo pedido simultaneamente.
Obrigado!
jelves@terra.com.br
Jelves
Curtidas 0
Respostas
Jelves
10/01/2004
sobe
GOSTEI 0
Nish
10/01/2004
Se você conseguir fazer me avise, estou com um problema parecido...
GOSTEI 0
Jelves
10/01/2004
Ok, digo o mesmo para você.
GOSTEI 0
Wolverine
10/01/2004
o bd é único? digo ele esta no serve e tds gravam lá
tipo assim,no beforePos vc faz um busca no BD do código a ser gravado, se o mesmo ñ existir, ele é gravado, se sim cod:=cod+1 e pesquisa denovo, ou pesquisa o ultimo registro gravado e faz cod:=cod+1
espero ñ ter falado besteira :oops: e ter lhe dado uma luz :idea:
tipo assim,no beforePos vc faz um busca no BD do código a ser gravado, se o mesmo ñ existir, ele é gravado, se sim cod:=cod+1 e pesquisa denovo, ou pesquisa o ultimo registro gravado e faz cod:=cod+1
espero ñ ter falado besteira :oops: e ter lhe dado uma luz :idea:
GOSTEI 0
Sanses
10/01/2004
varia muito de caso a caso, de banco a banco, não de qual banco, mas como foi criado. Eu faço assim, coloco um trigger e um generator no IB e salvo o novo pedido, dai, pelo código gerado pela inserção desse novo registro eu lanço os itens. Não sei se esta é a melhor forma, mas faço assim por não saber de uma melhor, caso encontrem compartilhem comigo tb. Obrigado!!
Sanses
Sanses
GOSTEI 0
Jelves
10/01/2004
sobe
GOSTEI 0
Jelves
10/01/2004
Pessoal eu deixei um exemplo fonte disponivel desta dúvida no seguinte endereço: http://www.jelves.hpg.ig.com.br
´Exemplo da minha dúvida´ está em extensão DOC mude a extensão para ZIP descompacte ele no D: caso vc não tenha repartição no seu HD, poderá descompactar dentro do C: e setar o caminho do SQLCONECTION que está no datamodule ´DM´.
Veja bem não sei se esta é a melhor solução, inclusive se vc tiver uma idéia melhor sou todo ouvido..
Quando vc executar o exemplo vc digita um código de usuário; (18, ou 19), nota-se que o código do pedido e dos itens do pedido será preenchido com ´0´(Zero), o esquema é o seguinte após terminar de digitar os itens dentro do dbgrid, eu irei mandar gravar, e quando eu mandar gravar eu pegarei o próximo generator do Código da tabela Master e substituirei o ´0´ por esse código, e farei um While nos itens e substituirei o ´0´ por este código.
Eu já tentei fazer isto, mais não deu certo, talvez eu não estou sabendo como fazer.
Obrigado a todos!
Jelves
´Exemplo da minha dúvida´ está em extensão DOC mude a extensão para ZIP descompacte ele no D: caso vc não tenha repartição no seu HD, poderá descompactar dentro do C: e setar o caminho do SQLCONECTION que está no datamodule ´DM´.
Veja bem não sei se esta é a melhor solução, inclusive se vc tiver uma idéia melhor sou todo ouvido..
Quando vc executar o exemplo vc digita um código de usuário; (18, ou 19), nota-se que o código do pedido e dos itens do pedido será preenchido com ´0´(Zero), o esquema é o seguinte após terminar de digitar os itens dentro do dbgrid, eu irei mandar gravar, e quando eu mandar gravar eu pegarei o próximo generator do Código da tabela Master e substituirei o ´0´ por esse código, e farei um While nos itens e substituirei o ´0´ por este código.
Eu já tentei fazer isto, mais não deu certo, talvez eu não estou sabendo como fazer.
Obrigado a todos!
Jelves
GOSTEI 0
Jelves
10/01/2004
sobe
GOSTEI 0
Mprocha
10/01/2004
colegas, se eu entendi a pergunta feita, então vejam se assim resolvi:
se vcs utilizam BD´s que não possuem o objeto SEQUENCE do Oracle e deve estar acontecendo de 2 usuarios criarem pedidos c/ numeros iguais ! entao criem uma tabela que guarde o ultimo numero de pedido feito e até mesmo outros tipos de sequencia.
ex
select * from tab_sequencias
TIPO SEQUENCIA
----------------------------------------
PEDIDO 785145
COD_PRODUTO 5698
COD_FORNECEDOR 563
COD_CLIENTE 124
daí no evento afterInsert da query pedido vc da um lock nesse registro pega a SEQUENCIA e depois soma + 1 e da um Update p/ atualizar e logo em seguida desbloqueia ela, e depois segue o procedimento normal.
A grosso modo a minha ideia é essa, depois é só ir lapidando, recomendo que se trave somente o reg e nao a tabela inteira..
Se não for isso a pergunta, desconsiderem ok !
[]s
Marcos Pinheiro da Rocha
se vcs utilizam BD´s que não possuem o objeto SEQUENCE do Oracle e deve estar acontecendo de 2 usuarios criarem pedidos c/ numeros iguais ! entao criem uma tabela que guarde o ultimo numero de pedido feito e até mesmo outros tipos de sequencia.
ex
select * from tab_sequencias
TIPO SEQUENCIA
----------------------------------------
PEDIDO 785145
COD_PRODUTO 5698
COD_FORNECEDOR 563
COD_CLIENTE 124
daí no evento afterInsert da query pedido vc da um lock nesse registro pega a SEQUENCIA e depois soma + 1 e da um Update p/ atualizar e logo em seguida desbloqueia ela, e depois segue o procedimento normal.
A grosso modo a minha ideia é essa, depois é só ir lapidando, recomendo que se trave somente o reg e nao a tabela inteira..
Se não for isso a pergunta, desconsiderem ok !
[]s
Marcos Pinheiro da Rocha
GOSTEI 0
Jelves
10/01/2004
Obrigado Marcos, mais ainda não é isso.. baixe o exemplo que deixei disponivel para vc dar uma olhada, qualquer coisa me mande um email
jelves@bol.com.br
jelves@bol.com.br
GOSTEI 0
Jelves
10/01/2004
sobe
GOSTEI 0
Biriga
10/01/2004
Meu caro, tenho um sistema parecido, para contorna esse problema utilizo uma tabela de controle de codigo e duas funcoes q controlam a busca, insercao, e atualizacao desses codigos, da seguinte manetira
TABELA
TabCodigo
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 0
---------------------------
DUAS FUNCOES
[b:2128772b26]Novocodigo(nome_tabela);[/b:2128772b26] CHAMADA NO SHOW DO FORM
- efetua uma busca em TabCodigo pelo nome_tabela ordena pelo codigo em forma crescente.
- se tiver apenas um registro incrementa e retorna o novo codigo, no caso acima retornara 1 e a tabela ficara da seguinte forma
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 1
---------------------------
- se tiver mais de um registro retorna o de menor codigo excluindo o mesmo.
[b:2128772b26]AbortNovoCodigo(codigo_abortado,nome_tabela) [/b:2128772b26]CHAMADA NO FECHAMENTO DO FORM
- Regrava na tabela TabCodigo o Codigo_abortado
Ex: Se 5 clientes abriram o for_pedido e apenas o c1 e c3 gravaram o pedigo, c2,c4 e c5 cancelaram fecharam o form a tabela ficará, supondo que abriram sequencialmente c1,c2,c3...
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
Pedido | 2
---------------------------
Pedido | 4
---------------------------
Se uma novo cliente c4 abrir o form_pedido(CHAMA FUNCAO NOVOCODIGO) seu codigo será 2 e a tabela ficara da seguinte maneira
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 4
---------------------------
Pedido | 5
---------------------------
Nota: se c4 fechar(CHAMA FUNCAO ABORTNOVOCODIGO) o form novamente a tabela TabCodigo ficara como era antes
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
Pedido | 2
---------------------------
Pedido | 4
---------------------------
Mas se c4 Gravar(CHAMA NOVOCODIGO APOS GRAVAR PEDIGO) o pedido a tabela TabCodigo ficara da seguinte maneira
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
e o form_pedido de c4 ja tera um NovoCodigo que sera 4
e assim sucessivamente... pelo menos utilizo assim e nunca deu erro.
NOTA:
quando chamo a funcao novocodigo, geralmente gravo esse codigo em uma variavel global do formulario, costumo chamar de codigo_do_formulario.
Espero ter ajudado, pq foi foda escrever isso tudo... heheheh!!!! mas estamos aqui e pra contribuir...
TABELA
TabCodigo
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 0
---------------------------
DUAS FUNCOES
[b:2128772b26]Novocodigo(nome_tabela);[/b:2128772b26] CHAMADA NO SHOW DO FORM
- efetua uma busca em TabCodigo pelo nome_tabela ordena pelo codigo em forma crescente.
- se tiver apenas um registro incrementa e retorna o novo codigo, no caso acima retornara 1 e a tabela ficara da seguinte forma
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 1
---------------------------
- se tiver mais de um registro retorna o de menor codigo excluindo o mesmo.
[b:2128772b26]AbortNovoCodigo(codigo_abortado,nome_tabela) [/b:2128772b26]CHAMADA NO FECHAMENTO DO FORM
- Regrava na tabela TabCodigo o Codigo_abortado
Ex: Se 5 clientes abriram o for_pedido e apenas o c1 e c3 gravaram o pedigo, c2,c4 e c5 cancelaram fecharam o form a tabela ficará, supondo que abriram sequencialmente c1,c2,c3...
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
Pedido | 2
---------------------------
Pedido | 4
---------------------------
Se uma novo cliente c4 abrir o form_pedido(CHAMA FUNCAO NOVOCODIGO) seu codigo será 2 e a tabela ficara da seguinte maneira
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 4
---------------------------
Pedido | 5
---------------------------
Nota: se c4 fechar(CHAMA FUNCAO ABORTNOVOCODIGO) o form novamente a tabela TabCodigo ficara como era antes
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
Pedido | 2
---------------------------
Pedido | 4
---------------------------
Mas se c4 Gravar(CHAMA NOVOCODIGO APOS GRAVAR PEDIGO) o pedido a tabela TabCodigo ficara da seguinte maneira
---------------------------
tabela | ultimoCodigo
---------------------------
Pedido | 5
---------------------------
e o form_pedido de c4 ja tera um NovoCodigo que sera 4
e assim sucessivamente... pelo menos utilizo assim e nunca deu erro.
NOTA:
quando chamo a funcao novocodigo, geralmente gravo esse codigo em uma variavel global do formulario, costumo chamar de codigo_do_formulario.
Espero ter ajudado, pq foi foda escrever isso tudo... heheheh!!!! mas estamos aqui e pra contribuir...
GOSTEI 0
Jelves
10/01/2004
obrigado biriba, mais ainda não é isto que estou precisando....Se alguém mais tiver alguma sugestão ou exemplo fonte, eu agradeço...
jelves@bol.com.br
jelves@bol.com.br
GOSTEI 0
Mprocha
10/01/2004
:(
eu acho que ainda não entendi sua duvida ...
vê se é isso:
O usuario A, B e C inserem itens de pedidos ao mesmo tempo mas no mesmo pedido de numero 999999 ???
[]s
Marcos Rocha
eu acho que ainda não entendi sua duvida ...
vê se é isso:
O usuario A, B e C inserem itens de pedidos ao mesmo tempo mas no mesmo pedido de numero 999999 ???
[]s
Marcos Rocha
GOSTEI 0
Jelves
10/01/2004
Marcos
Bom, veja bem.. o usuário A,B,C insere o pedido e itens de pedido ao mesmo tempo, sem problema, pois até ai nenhum deles terão o número do pedido, quando eles mandarem gravar o banco mandará para eles o numero do pedido na sequência, aonde este numero serão colocado no cabeçalho e nos itens.. A = 001 B=002 C=003 e assim sucesivamente.
O meu maior problema tá sendo no lançamento no Dbgrid, pois tenho que fazer um while setando o numero do pedido quando eu mandar gravar..
Acredito que terei que fazer transações, para resolver isto.. só não sei como fazer.. dê uma olhada no exemplo que deixei disponivel na minha página...
Assim que matar este problema estarei disponibilizando a solução na página: http://www.jelves.hpg.ig.com.br
Obrigado
Jelves
Bom, veja bem.. o usuário A,B,C insere o pedido e itens de pedido ao mesmo tempo, sem problema, pois até ai nenhum deles terão o número do pedido, quando eles mandarem gravar o banco mandará para eles o numero do pedido na sequência, aonde este numero serão colocado no cabeçalho e nos itens.. A = 001 B=002 C=003 e assim sucesivamente.
O meu maior problema tá sendo no lançamento no Dbgrid, pois tenho que fazer um while setando o numero do pedido quando eu mandar gravar..
Acredito que terei que fazer transações, para resolver isto.. só não sei como fazer.. dê uma olhada no exemplo que deixei disponivel na minha página...
Assim que matar este problema estarei disponibilizando a solução na página: http://www.jelves.hpg.ig.com.br
Obrigado
Jelves
GOSTEI 0
Jelves
10/01/2004
Bom veja bem..
O usuários A B C começam ao mesmo tempo digitar um pedido, até ai tudo bem, pois nenhum deles tem o numero do pedido ainda..
O que acontece??..
O usuário ´A´ mandar gravar o pedido, o sistema vai até o banco puxa o numero do próximo pedido, grava no cabeçalho(tabela master), faz-se um wilhe no itens do dbgrid e coloca número do pedido(detalhe) e após isto grava o cabeçalho e os itens no banco, ou seja, vc só terá o numero do pedido quando mandar gravar..
A 201
B 202
C 203
Dê uma olhada no exemplo que deixei no site.
Jelves
O usuários A B C começam ao mesmo tempo digitar um pedido, até ai tudo bem, pois nenhum deles tem o numero do pedido ainda..
O que acontece??..
O usuário ´A´ mandar gravar o pedido, o sistema vai até o banco puxa o numero do próximo pedido, grava no cabeçalho(tabela master), faz-se um wilhe no itens do dbgrid e coloca número do pedido(detalhe) e após isto grava o cabeçalho e os itens no banco, ou seja, vc só terá o numero do pedido quando mandar gravar..
A 201
B 202
C 203
Dê uma olhada no exemplo que deixei no site.
Jelves
:(
eu acho que ainda não entendi sua duvida ...
vê se é isso:
O usuario A, B e C inserem itens de pedidos ao mesmo tempo mas no mesmo pedido de numero 999999 ???
[]s
Marcos Rocha
GOSTEI 0
Mprocha
10/01/2004
entendi !
cada pessoa tem uma logica, porem eu tenho um sistema de pizzaria que usa pedidos, no meu sistema eu faço um pouco diferente e até agora nao deu problemas.
Como eh um sistema pequeno eu uso Ado acessando o access 2000, e uso transacao, pois o access nao eh um servidor de BD. Eu costumo 1o. pegar o prox No de Ped e depois eu inicio a transacao, com isso quando o usuario inclui um item eu ja tenho o No do ped de antemao, entao eu nao preciso dar um while para popular essa coluna no momento de salvar. E caso ocorra algum erro inesperado ou o usuario desista do pedido eu dou um rollback cancelando a inclusao do pedido inteiro e nao o no. do pedido que ja foi salvo com +1 antes do inicio da transacao.
E eu nao uso table, eu uso querys master/detail, p/ relaciona-los eu faço assim:
(faça tudo do jeito que vc já sabe, depois aponte a propriedade datasource da query detail para o datasource da query master,
após feito isso coloque no select da query detail o seguinte: select .... from itens... where num_pedido = :num_pedido (tem que ser o mesmo nome de coluna da query master), depois disso ao dar um open no master e no detail vc perceberá que já está sincronizado automaticamente Ok).
Se achou interessante essa forma, eu tenho mais dicas ainda pra vc, de qq forma vou tentar acessar seu site pois aqui na empresa nao tenho delphi intalado eu trabalho com Oracle developer.
[]s
Marcos Rocha
cada pessoa tem uma logica, porem eu tenho um sistema de pizzaria que usa pedidos, no meu sistema eu faço um pouco diferente e até agora nao deu problemas.
Como eh um sistema pequeno eu uso Ado acessando o access 2000, e uso transacao, pois o access nao eh um servidor de BD. Eu costumo 1o. pegar o prox No de Ped e depois eu inicio a transacao, com isso quando o usuario inclui um item eu ja tenho o No do ped de antemao, entao eu nao preciso dar um while para popular essa coluna no momento de salvar. E caso ocorra algum erro inesperado ou o usuario desista do pedido eu dou um rollback cancelando a inclusao do pedido inteiro e nao o no. do pedido que ja foi salvo com +1 antes do inicio da transacao.
E eu nao uso table, eu uso querys master/detail, p/ relaciona-los eu faço assim:
(faça tudo do jeito que vc já sabe, depois aponte a propriedade datasource da query detail para o datasource da query master,
após feito isso coloque no select da query detail o seguinte: select .... from itens... where num_pedido = :num_pedido (tem que ser o mesmo nome de coluna da query master), depois disso ao dar um open no master e no detail vc perceberá que já está sincronizado automaticamente Ok).
Se achou interessante essa forma, eu tenho mais dicas ainda pra vc, de qq forma vou tentar acessar seu site pois aqui na empresa nao tenho delphi intalado eu trabalho com Oracle developer.
[]s
Marcos Rocha
GOSTEI 0