campo autoincremento com MsSql server - Só uma dica
01/01/2006
0
A pergunta é: Quando eu dou um insert numa tabela, com um campo autoinc, o valor dele somente será validado após o post, certo? Se for isso mesmo, como posso capturar o valor deste antes do post? Deixa-me explicar melhor: Possuo uma tela de pedidos, onde trabalho com 4 tabelas: Transportadora, Pedidos, Itens_Pedido e clientes. A tabela itens_pedido tem um filtro, que é o nr_ped da tabela Pedidos. Ou seja, a tabela itens_pedido, só abre com um valor, que é o nr_ped, que é um campo autoinc. Eu poderia postar a tabela pedidos para gerar o autoinc e depois abrir minha tabela, tudo isso no botão [color=red:676a09e137]novo item[/color:676a09e137], mas penso eu, que na logica, seria um erro, ou não? Pois o queria que no botão [color=red:676a09e137]gravar[/color:676a09e137], fosse gravado tudo de uma vez, mas se não tiver outro modo, farei assim: Então, q vocês acham? Como deveria trabalhar? Primeiro gravo o pedido e depois abro itens_pedido ou tem outra forma? Desde já grato.
Paulo
Posts
01/01/2006
Bon Jovi
O lance aí é pra gravar mesmo, mas faça tudo dentro de uma transação qdo o usuário apertar pra confirmar tudo. Aí se o pedido nao precisar ser efetivamente gravado, dê rollback.
02/01/2006
Paulo
A sql acima, é só ilustrativa do que eu quero realmente. Se eu gravar na tb de pedidos e depois inserir itens, não vejo nenhum problema com isso, exceto o seguinte: Eu dou um post na tabela pedido e gera um pedido nº5. O cliente desiste, dou um delete na tb pedidos e itens_pedidos, e zero. Quando eu abrir um novo pedido, irá de 4 para 6, pois o autoinc já incrementou 1 que foi deletado, certo? É só isso, caso meu cliente resolva ter os pedidos sequenciais, dos pedidos já emitidos o q devo fazer?
02/01/2006
Paulo
A tabela está em 4. Dou um insert e depois um post, aí ele vai para 5, tudo isso dentro de uma transação. Desisto de tudo e dou um rollback. Abro outra transação, e dou um novo insert e depois post, qual o valor do autoinc: 5 ou 6? Uso Delphi 7 com MsSql Server 2000 e ADO.
02/01/2006
Okama
Tive esse problema e encontrei duas alternativas:
A primeira foi criar o pedido com o campo auto incremento e controlar o número sequencial por outro campo, assim os pedidos sempre estariam em sequencia independente da chave primária.
pk_codigo -> autoincremento ne_ped -> sequencial
A Segunda foi armazenar todo o formulário em StringGrid e Array e gravar tudo de uma única vez quando pressionado o botão ´gravar´. Porém nesta eu não usei o autoincremento e sim uma outra tabela de controle para armazenar todos os códigos das tabelas do aplicativo como era feito com Dbase.
//Aqui pego o código Select codigo from Tabela_controle where Tabela = ´Pedido"; Open; //Aqui incremento Update Tabela_controle set codigo = codigo +1 where Tabela = "Pedido"; ExeqSQL;
tudo isso dentro de uma função fica assim:
Codigo := FunçãoCodigo(´Pedido´);
Espero que ajude.
02/01/2006
Bon Jovi
Vc deve gravar tudo de uma vez só. Vc deve deixar toda a entrada de dados em memória como o Okama falou, mas de preferência usando ClientDataSet/DbGrid ao invés de Array/StringList pro código ficar mais limpo.
Clique aqui para fazer login e interagir na Comunidade :)