Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Daniel_cbx

Sequence

Recommended Posts

Se alguém, puder me ajudar... estou com um problemas e estou quase desistindo,tenho uma tabela Cliente, no postgreSQL 8.0 com um campo Serial, o que estou usando somente Tquery, e o que acontece é o seguinte, toda vez que dou insert e é encontrado chave primaria repedida o sistema me avisa corretamente e encerra a transação, dando rollback ele não atualiza os dados, so que tem um probleminha a função nextval do Sequence acumula o valor sequinte, e ao gravar o proximo registro, ele pula um numero. se der varios inserts com rollback(alguma falha), o banco não atualiza nada, como deve ser so que o Sequence acumala os numero como se estives gravados, ai fica a sequencia da numeração toda zuada, tem como resolver isso ?se alguem puder me ajudar eu agradeço..Daniel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se alguém, puder me ajudar... estou com um problemas e estou quase desistindo,

 

tenho uma tabela Cliente, no postgreSQL 8.0 com um campo Serial, o que estou usando somente Tquery, e o que acontece é o seguinte, toda vez que dou insert e é encontrado chave primaria repedida o sistema me avisa corretamente e encerra a transação, dando rollback ele não atualiza os dados, so que tem um probleminha a função nextval do Sequence acumula o valor sequinte, e ao gravar o proximo registro, ele pula um numero. se der varios inserts com rollback(alguma falha), o banco não atualiza nada, como deve ser so que o Sequence acumala os numero como se estives gravados, ai fica a sequencia da numeração toda zuada, tem como resolver isso ?

 

se alguem puder me ajudar eu agradeço..

 

Daniel

Sou o Daniel_cbx, como não estou conseguindo entrar com esse login tive de criar outro.

 

Eu mesmo vou dar a conclusão que descobri (sozinho), se alguém souber uma melhor me avise, senão tai a dica:

 

OBS: As linhas em vermelhos são responsaveis pelo autoincremento

 

segue um modelo:

 

TextoSQL := ' insert into cliente ('

+ 'codigo_cliente, nome_cliente, tipo_pessoa, cnpj_cpf, ie_rg, telefone_com, contato, email, site)'

+ 'values (nextval(''cliente_seq'')' {aqui o sequence incrementa 1}

+ ',' + quotedstr(EditCliente.Text)

+ ',' + quotedstr(Tipo_pessoa)

+ ',' + quotedstr(EditCnpj.Text)

+ ',' + quotedstr(EditIncricao.Text)

+ ',' + quotedstr(EditTelefone.Text)

+ ',' + quotedstr(EditContato.Text)

+ ',' + quotedstr(EditEmail.Text)

+ ',' + quotedstr(EditSite.Text)

+ ')';

 

 

if not DMDados.Con_db.InTransaction then

begin

DMDados.Con_db.StartTransaction;

DMDados.Con_db.TransIsolation := tiReadCommitted;

end;

 

try

with DMDados.QryCliente do begin

SQL.clear;

SQL.Add( TextoSQL );

ExecSQL;

Close;

end;

if DMDados.Con_db.InTransaction then DMDados.Con_db.Commit;

DMDados.QryCliente.Close;

ShowMessage('Inclusão Efetuada !');

limpa_campos;

except

 

on E:EDBEngineError do

begin

if E.Errors[0].ErrorCode = DBIERR_KEYVIOL then

ShowMessage('Já existe um cliente com este nome!');

DMDados.QryCliente.SQL.Clear;

DMDados.QryCliente.SQL.Add('select setval(''cliente_seq'',currval(''cliente_seq'')-1)')

{aqui toda vez q tratar um erro, o sequence subtrai 1, uma vez que o sequence não é capaz de fazer isso sozinho}

DMDados.QryCliente.ExecSQL;

if DMDados.Con_db.InTransaction then

DMDados.Con_db.Rollback;

end;

end;

 

é isso ai, espero poder ajudar alguém.

 

Daniel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas nesse caso, se duas ou mais pessoas incluirem registros quase que simultaneos ou dar erro na inclusão... sei lá... acho que pode dar problema nesse cálculo.

 

Imagine que EU estou tentando incluir um registro e foi gerado o código 10, e Você tb está incluindo e foi gerado o código 11. Supondo que EU não consegui, mas Você sim. O seu código foi gravado como 11 e por causa do meu ter dado erro ele subtraiu e setou para 9. Desta forma vai haver problema se o 9 já existir ou quando chegar no 11.

 

Alguém me corrija e convença se falei besteira.

 

Se você travar as tabelas enquando faz isso, acho que funciona. Mas o melhor seria usar Trigger.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.