Array
(
)

campo autoincremento com MsSql server - Só uma dica

Paulo
   - 01 jan 2006

Galera, do Forum DevMedia, um 2006 cheio de prosperidade a todos que aqui estão, em especial àqueles que, voluntariamente têm desprendido tempo e talento, até mesmo dividido o muito ou pouco conhecimento que possuem, na tentativa de ajudar e somente ajudar. A estes, que Deus derrame ricas bênçãos a vocês, e lembrem-se, quem dá, ainda que tudo o que têm, receberá em dobro e Deus não deixará nada faltar.

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 novo item, mas penso eu, que na logica, seria um erro, ou não? Pois o queria que no botão gravar, 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.


Bon Jovi
   - 01 jan 2006

Isso aí 2006 com sucessos p/ nós.

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.


Paulo
   - 02 jan 2006

Mas, bon jovi, primeiro eu teria que gravar na tabela de pedidos, para ser gerado o nr_ped(autoinc), e só depois ir inserindo os itens na tabela itens_pedidos, com o filtro nr_ped, assim:


Citação:
´select * from itens_pedidos where cod_ped = ´+pedidosnr_ped.asinteger;


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?


Paulo
   - 02 jan 2006

desculpem-me eu mandar 2 posts seguidos, mas é que me esqueci de algo importante. Se eu der assim:
Citação:

ADOConnection.BeginTrans
e depois eu vir a dar um post nas tabelas correspondentes, e depois no botão cancelar eu digitar rollbacktrans, mesmo eu tendo dado um post, o gerador volta ao valor inicial? Explicando:
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.


Okama
   - 02 jan 2006

Olá Paulo,
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.

#Código

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.

#Código

//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:

#Código
Codigo := FunçãoCodigo(´Pedido´);



Espero que ajude.


Bon Jovi
   - 02 jan 2006


Citação:
Mas, bon jovi, primeiro eu teria que gravar na tabela de pedidos, para ser gerado o nr_ped(autoinc), e só depois ir inserindo os itens na tabela itens_pedidos, com o filtro nr_ped, assim:

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.