Obter o ultimo registro

Delphi

15/08/2013

Olá pessoal, preciso obter o ultimo registro de uma tabela para somar mais 1 e ter o proxximo ID.

Estou usando o Delphi 7, SQLCoonection -> SimpleDataSet.

Tentei SimpleDataSet1.DataSet.CommandText:= 'SELECT MAX(CAMPO_ID) FROM TABELA';

Mas não sei como pegar esse valor para somar + 1 e ter o proximo valor para CAMPO_ID.

Eu uso o Generator do FireBird só no momento do Post, para não ficar incrementando quando não se confirma a inserção.

Porém na momento da inserção eu queria colocar o valor no DBEdit para o usuário saber qual será o proximo registro.

Desde já o meu muito obrigado.

Julio.
Julio Junior

Julio Junior

Curtidas 0

Respostas

Maxiwel Rodrigues

Maxiwel Rodrigues

15/08/2013

Prezado colega,
Creio que isso irá ajudar com certeza mais simples que isso só mamão com açúcar...

add:pirata_pirado33@hotmail.com //Qualquer ajuda....Delphi

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBXpress, FMTBcd, DBClient, Provider, DB, SqlExpr, StdCtrls,
Buttons, Grids, DBGrids, Mask, DBCtrls;

type
TForm1 = class(TForm)
con1: TSQLConnection;
sds1: TSQLDataSet;
sds1ID_CLIENTE: TIntegerField;
sds1NOME: TStringField;
dsp1: TDataSetProvider;
cdsproprim: TClientDataSet;
cdsproprimID_CLIENTE: TIntegerField;
cdsproprimNOME: TStringField;
lbl1: TLabel;
dbedtID_CLIENTE: TDBEdit;
ds1: TDataSource;
lbl2: TLabel;
dbedtNOME: TDBEdit;
dbg1: TDBGrid;
btn1: TBitBtn;
procedure cdsproprimBeforeInsert(DataSet: TDataSet);
procedure cdsproprimNewRecord(DataSet: TDataSet);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
max:Integer; //Incremento a crianção do numero
procedure Vproprim;//procedimento a ao numero

{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cdsproprimBeforeInsert(DataSet: TDataSet);//selecione a tabela no DM e no evento BeforeInsert digite:
begin
Vproprim;
end;

procedure TForm1.cdsproprimNewRecord(DataSet: TDataSet);//novamento na tabela no DM insira o codigo no evento NewRecord
begin
cdsproprim.FieldByName('id_cliente').AsInteger :=max +1;
end;

procedure TForm1.Vproprim;//PROCEDIMENTO DE INCREMENTO...
var
marcador:TBookmark;//
begin
marcador:= cdsproprim.GetBookmark;
try
cdsproprim.DisableControls;
max:=0;
try
cdsproprim.First;
while not cdsproprim.Eof do
begin
if cdsproprim.FieldByName('id_cliente').AsInteger >max then
max:=cdsproprim.fieldbyname('id_cliente').AsInteger;
cdsproprim.Next;

end;
finally
cdsproprim.EnableControls;
end;
finally
cdsproprim.GotoBookmark(marcador);
cdsproprim.FreeBookmark(marcador);
end;
end;

procedure TForm1.btn1Click(Sender: TObject);//BOTAO DE INSERÇÃO - INSERIR
begin
cdsproprim.Insert;
;

end.


Obs.nome do meu ClientDataSet é "CDSPRODPRIM"
GOSTEI 0
Deivison Melo

Deivison Melo

15/08/2013

Usa essa função:

function GeneratorID (aName: string; Connection: TSQLConnection; Incrementa: Boolean): integer;

Código da função:

function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
else
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;
GOSTEI 0
Deivison Melo

Deivison Melo

15/08/2013

Na verdade você irá adaptar a função atual a sua realidade...

Apenas reforçando pois ela era utilizada para incrementar um campo no firebird.

Abração!

GOSTEI 0
Julio Junior

Julio Junior

15/08/2013

Valeu pessoal, achei todas as respostas interessantes, optei pela função que pega o valor no genarator.

Agora estou com um outro probleminha para seguir com a fase da cadastros:

Preciso descobrir uma forma ou função para evitar que alguns campos (DBEdits) sejam repetidos no banco de dados, preciso fazer essa verificação antes do Post.

Pensei em usar nos eventos OnExit's dos campos a verificar.

Desde já o meu muito obrigado pela ajuda.

Julio.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

15/08/2013

Basta que você crie esses campos como UNIQUE, assim o banco não permitirá a inserção de valores repetidos.
GOSTEI 0
Julio Junior

Julio Junior

15/08/2013

Ok, Joel, eu queria resolver isso ainda no Delphi antes do Post para evitar a mensagem de erro do BD.

Sds.

Julio.
GOSTEI 0
Nícolas Braz

Nícolas Braz

15/08/2013

Ok, Joel, eu queria resolver isso ainda no Delphi antes do Post para evitar a mensagem de erro do BD.

Sds.

Julio.


Você pode deixar o campo como unique e quando emitir o erro o delphi tratar o erro.
GOSTEI 0
Julio Junior

Julio Junior

15/08/2013

Certo, e como eu faria esse tratamento? com try . . . except?

Tentei usar o try mas não consigo fazer ele funcionar, acredito eu eu esteja fazendo alguma coisa errada mas ainda não descobri.

Teria um exemplo de como eu faria para tratar esse erro no Delphi. Estou usando o Delphi 7.

Sds.

Julio.

GOSTEI 0
POSTAR