Ir para conteúdo

Arquivado

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

rafaeloliveira83

[Resolvido] Autoincremento sem Generator ou Trigger

Recommended Posts

Estou desenvolvendo uma aplicação onde acredito que não possa usar o Autoincremento do Firebird , pois a tabela possuí muitas chaves estrangeiras com outras tabelas.

 

Não consigo criar no Delphi ao clicar no Botão Inserir ( ClientDataSet1.Append; ) algo que incremente sozinho o campo Código.

 

Alguém saberia me ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que o campo autoincremento tem haver com não poder usar múltiplas chaves estrangeiras? Que BD está usando? Qual a estrutura das tabelas? O que precisa fazer exatamente?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde a todos.

 

Voce pode implementar códigos dentro do Delphi para fazer isto e é bem simples:

 

1º) Primeiro é necessário saber qual é o código do último registro armazenado na tabela e é claro, voce terá que fazer isto usando código SQL no qual voce o colocará dentro de um componente que lê tabela, como voce está usando DBExpress eu presumo, use um TSQLQuery, configure a sua conexão com TSQLConnection e depois na propriedade SQL, digite a seguinte instrução:

 

Select Max(Codigo) as Ultimo From NomeTabela

2º) Agora voce terá que acionar este TSQLQuery no momento em que voce acionar o Append do ClientDataSet, voce tem duas opções, uma é codificar o código abaixo dentro do botão inserir e outra que é a melhor forma, é dentro do evento OnNewRecord do ClientDataSet, isto porque este evento é disparado momentos depois de se acionar o Append, selecione o ClientDataSet, vá no Object Inspector e na aba events, dê dois clicks dentro da caixa combo do evento OnNewRecord e escreva o código abaixo:

 

// Dentro do Evento OnNewRecord do ClientDataSet
  
  procedure TForm1.ClientDataSet1NewRecord(DataSet: TDataSet);
  begin
	 SQLQuery1.Open;
	 if SQLQuery1.FieldByName('Ultimo').IsNull then
		 ClientDataSet1.FieldByName('Codigo').Value := 1
	 else
		ClientDataSet1.FieldByName('Codigo').Value := SQLQuery1.FieldByName('Ultimo').Value + 1;
	 SQLQuery1.Close;
  end;

  //  OU dentro do Evento OnClick de um botão inserir qualquer

  procedure TForm1.btnInserirClick(Sender: TObjec);
  var incremento: Integer;
  begin
	 SQLQuery1.Open;
	 if SQLQuery1.FieldByName('Ultimo').IsNull then
		Incremento := 1
	 else
		Incremento := SQLQuery1.FieldByName('Ultimo').Value + 1;
	 SQLQuery1.Close;
	 ClientDataSet1.Append;
	 ClientDataSet1.FieldByName('Codigo).Value := incremento;
  end;

Com esta codificação, voce não precisa usar os Generators e nem Triggers para autoincrementar o campo, além do que voce tem outra vantagem de quando cancelar a inserção do registro, nada é autoincrementado no banco, pois o valor fica armazenado no campo Codigo do ClientDataSet local e quando ele é descartado, nada é enviado ao banco.

 

Um abraço.

 

Jorge da Silva Abreu

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.