Fórum Delphi + Mysql + Tabela Vendas x Itens_vendas #562377
16/09/2016
0
Tenho um sistema Delphi XE8 com Mysql 5 usando Componentes DBExpres. O que preciso parece simples mas não é.
Tenho uma tabela de VENDAS e outra ITENS_VENDAS. O campo que liga as duas tabelas é o ID_VENDA. Onde na tabela VENDA ele é Auto_Increment, pois bem.
Como obter o valor ID_VENDA, para lançar na tabela ITENS_VENDA antes de gravar no banco? ( o comando LAST_INSERT_ID() não funciona, ou então não sei usar, sempre retorna o valor 0).
Ahhh mas então vc da um post e depois pega o numero. OK mas e se o usuario desistir da venda? como desfaço o post?
Alguém tem um exemplo de como trabalhar no delphi com essa relação de tabelas?
Casa
Curtir tópico
+ 0Post mais votado
16/09/2016
Sobre essa parte: "OK mas e se o usuario desistir da venda? como desfaço o post?"
Poderia também verificar se existe algum item, caso não faz um delete na venda
Jones
Jones Granatyr
Gostei + 1
Mais Posts
16/09/2016
Huidemar Costa
A forma que eu faria é salvar o "cabeçalho" da nota(Id_Venda, Numero, data, cliente/fornecedor), tendo feito isso terei o ID_VENDA, feito isso eu incluiria os itens da nota.
A tabela poderia ter um campo para dizer se a venda foi finalizada, caso não tenha sido finalizada, ou seja, o usuário desistiu da venda, ele exclui a Nota.
Gostei + 0
17/09/2016
Kellson
select Max(id) from cliente
ou
select @@identity as 'ULTIMOID' +1
Gostei + 0
17/09/2016
Kellson
Gostei + 0
17/09/2016
Kellson
faz um Virtual Clientdataset para armazenar os itens temporario, faça uma fct ou SP no proprio delphi para quando form lançando item ja somando para vc
botao finalizar
with query_venda do
begin
close;
sql.clear;
sql.text:='insert into venda(colunas) values( valores);
execsql;
sql.clear;
sql.text:='select Max(IVENDA) as ULTIMOID from venda;
VARIAVEL INTEGER OU STRING:=query.fieldbyname(ULTIMOID).value;
sql.clear;
sql.text:='select * from venda' // para nao dar exception not result
open;
end;
ate agora vc tem o id da venda
entao agora vem
while not(clientdataset.eof) do
begin
with query_ITEMVENDA do
begin
sql.add('insert into itemvenda(codigovenda,item,etc) values('+quotedstr(StringCodVenda)+',item,etc);
end;
clientdataset.next;
end
with adoquery_itemvenda do
begin
execsql;
end;
gambiarra pura kkkkkk, unica coisa que passou rapido pela minha cabeça, mas é claro se tiver fazendo na hora surge ideias melhores.
Gostei + 0
17/09/2016
Kellson
faz um Virtual Clientdataset para armazenar os itens temporario, faça uma fct ou SP no proprio delphi para quando form lançando item ja somando para vc
botao finalizar
with query_venda do
begin
close;
sql.clear;
sql.text:='insert into venda(colunas) values( valores);
execsql;
sql.clear;
sql.text:='select Max(IVENDA) as ULTIMOID from venda;
open <--------------------------------------------------------------------------------------------------------------- // abrir para trazer o resultado
VARIAVEL INTEGER OU STRING:=query.fieldbyname(ULTIMOID).value;
close;
sql.clear;
end;
ate agora vc tem o id da venda
entao agora vem
while not(clientdataset.eof) do
begin
with query_ITEMVENDA do
begin
sql.add('insert into itemvenda(codigovenda,item,etc) values('+quotedstr(StringCodVenda)+',item,etc);
end;
clientdataset.next;
end
with adoquery_itemvenda do
begin
execsql;
end;
gambiarra pura kkkkkk, unica coisa que passou rapido pela minha cabeça, mas é claro se tiver fazendo na hora surge ideias melhores.
Gostei + 0
17/09/2016
Casa
Gostei + 0
19/09/2016
Kellson
puts amigo nao tenho nenhum projeto, perdi meu HD com os projetos , porem ja fiz isso.
Gostei + 0
20/09/2016
Casa
puts amigo nao tenho nenhum projeto, perdi meu HD com os projetos , porem ja fiz isso.
Então fiz o teste aqui, e usar o comando MAX vai dar problema com a chave sim, ele só gera o id quando posta, se duas pessoas abrir uma venda ao memso tempo vai gerar o mesmo ID.
Consegue um exemplo pra mim?
Gostei + 0
20/09/2016
Raimundo Pereira
Uma alternativa é Criar uma tabela temporária.
TMP_Venda
ID_VENDA,Usado
Então, abriu a tela de vendas a primeira coisa é gerar um id e salvar na TMP_VENDA.
O próximo usuário em rede irá gerar um novo ID.
O número fica resguardado, Após comitt basta realizar um updade USADO=SIM.
Gostei + 0
20/09/2016
Kellson
1 - insert +1 =2
2 - insert +1=3
e nao simultaneo 1,2
Gostei + 0
20/09/2016
Kellson
Gostei + 0
20/09/2016
Kellson
create procedure inserir
@nome varchar(max),
@idade integer
as
insert into cliente(nome,idade) values(@nome,@idade)
select @@IDENTITY as 'ULTIMOID'
Gostei + 0
21/09/2016
Luiz Freitas
Peluchi,
Como os outros usuários sugeriram, existem outras formas de fazer isso de dentro do Delphi mesmo, utilizando CachedUpdate por exemplo, mas eu não me lembro como faz, então vou sugerir uma solução que já utilizei e funcionou perfeitamente:
> Crie uma tabela para controle dos ID's, você pode controlar os ID's de todas as tabelas nas quais operações parecidas com essa (venda + item) precise ocorrer;
> No formulário de venda, ao iniciar uma nova venda você consulta a tabela de controle de ID's, pega o valor gravado nela, adiciona mais um (e já realiza o update na tabela de controle para que ele fique atualizada) e reserva esse valor;
> Os dados do cabeçalho da Venda, juntamente com o ID gerado, ficam gravados temporariamente em um ClientDataSet (CDS) ou em um FDMemTable (FMT), assim eles não são gravados diretamente no banco, ficam em memória até o processo ser concluído;
> Assim como no caso da Venda, insira os itens, utilizando como ID da Venda o valaor reservado anteriormente, também em um CDS ou em um FMT (para que eles fiquem em memória até o momento da gravação no banco);
> Caso a venda seja confirmada, transfira os dados para as tabelas de Vendas e de Itens no o banco de dados;
> Caso a venda seja interrompida por qualquer motivo simplesmente limpe o CDS ou FMT e estará tudo cancelado.
Em qualquer uma das situações, seja usando CachedUpdates, com um campo auto-incremento na própria tabela, ou usando a solução que sugeri, criando uma tabela para controlar os ID's, o ID que foi reservado para ser utilizado na venda iniciada (que pode se confirmar ou não) é perdido caso a operação não seja confirmada/concluída com sucesso.
Espero que você encontre uma solução que te atenda adequadamente.
Se quiser utilizar minha sugestão e tiver alguma dúvida é só perguntar.
Boa sorte!
Att,
Luiz
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)