Obter o ultimo registro
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.
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
Curtidas 0
Respostas
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"
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
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;
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
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!
Apenas reforçando pois ela era utilizada para incrementar um campo no firebird.
Abração!
GOSTEI 0
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.
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
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
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.
Sds.
Julio.
GOSTEI 0
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.
Sds.
Julio.
Você pode deixar o campo como unique e quando emitir o erro o delphi tratar o erro.
GOSTEI 0
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.
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