Codigo sequencial em cadastros
Olá pessoal, preciso de uma ajuda de vc´s.
Criei uma tabela para capturar o sequencial de cadastro de cada tabela, tenho os campos
Tabela Empresa Sequencial
Dentro da tabela eu coloco o nome da tabela q irei usar no meu ClientDataSet, então eu queria incrementar um codigo nesta tabela e retornar para o eu cadastro.
Buscar o codigo q esta na tabela eu até consigo, mas incrementar ele antes de buscar, não estou conseguindo, alguma luz ?!!!!
Abraços,
Rogério
Rogério Nascimento
Curtidas 0
Respostas
Rodrigo Mourão
04/08/2009
Olá Amigo !!!
Desculpe a demora, eu estava caçando minha rotina aqui nas milhes de linhas de código.
No MySql eu trabalho com uma tabela chamada Generator com dois campos TableName e Value,
assim coloco la os registros com o ID:
Cliente 10
Perfil 5
Produtos 6
E por ai vai....
Na hora de pegar dou um update somo mais 1 e retono.
function TDM.GenID(tablename: String): Integer;
var
Qry: TSQLQuery;
Transaction: TDBXTransaction;
begin
try
try
Transaction := DBAcesso.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
DBAcesso.ExecuteDirect('UPDATE SEQUENCE SET NEXTVALUE = NEXTVALUE+1 WHERE TABLENAME = '+QuotedStr(tablename));
Qry := TSQLQuery.Create(Self);
Qry.SQLConnection := DBAcesso;
Qry.SQL.Add('SELECT NEXTVALUE FROM SEQUENCE WHERE TABLENAME = '+QuotedStr(tablename));
Qry.Open;
Result := Qry.Fields[0].AsInteger;
DBAcesso.DBXConnection.CommitFreeAndNil(Transaction);
except
DBAcesso.DBXConnection.RollbackFreeAndNil(Transaction);
end;
finally
FreeAndNil(Qry);
end;
end;
Abs
Desculpe a demora, eu estava caçando minha rotina aqui nas milhes de linhas de código.
No MySql eu trabalho com uma tabela chamada Generator com dois campos TableName e Value,
assim coloco la os registros com o ID:
Cliente 10
Perfil 5
Produtos 6
E por ai vai....
Na hora de pegar dou um update somo mais 1 e retono.
function TDM.GenID(tablename: String): Integer;
var
Qry: TSQLQuery;
Transaction: TDBXTransaction;
begin
try
try
Transaction := DBAcesso.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
DBAcesso.ExecuteDirect('UPDATE SEQUENCE SET NEXTVALUE = NEXTVALUE+1 WHERE TABLENAME = '+QuotedStr(tablename));
Qry := TSQLQuery.Create(Self);
Qry.SQLConnection := DBAcesso;
Qry.SQL.Add('SELECT NEXTVALUE FROM SEQUENCE WHERE TABLENAME = '+QuotedStr(tablename));
Qry.Open;
Result := Qry.Fields[0].AsInteger;
DBAcesso.DBXConnection.CommitFreeAndNil(Transaction);
except
DBAcesso.DBXConnection.RollbackFreeAndNil(Transaction);
end;
finally
FreeAndNil(Qry);
end;
end;
Abs
GOSTEI 0
Rogério Nascimento
04/08/2009
Fala ai Grande Rodrigo, tudo na paz?!!!
Posso usar então a mesma lógica q vc utiliza para pegar o id no banco firebird ? (pois é ela q eu utilizo para o ID heheh)
Mas, tem como evitar saltos de sequenciais, que acontecem muito qdo o usuario cancela a operação, oque vc me sugere?
GOSTEI 0
Rogério Nascimento
04/08/2009
Ou desta forma em caso de roolback ele não incrementa o numero ? evitando salto .
Abraços,
Rogério
GOSTEI 0
Rodrigo Mourão
04/08/2009
Olá Amigo,
1) Bem pode usar em qualquer banco sim;
2) Se der Rollback nao vai incrementar não;
3) Agora quanto ao salto em caso de cancelar so tem um jeito. Vai no evento BeforeApplyUpdates e coloque lá. Assim só vai gerar quando realmente for gravar. Agora tem um porem se quiser ter o ID antes de gravar entao noa tem jeito, tem que gerar antes mesmo e se cancelar vai pular tb.
Poderia ate fazer uma rotina para Id nao usado em um tabela ai quando fosse gerar ia nesta tabela primeiro e tal mas ai daria muito trabalho e o custo beneficio nao compensaria !!
Abs !!
1) Bem pode usar em qualquer banco sim;
2) Se der Rollback nao vai incrementar não;
3) Agora quanto ao salto em caso de cancelar so tem um jeito. Vai no evento BeforeApplyUpdates e coloque lá. Assim só vai gerar quando realmente for gravar. Agora tem um porem se quiser ter o ID antes de gravar entao noa tem jeito, tem que gerar antes mesmo e se cancelar vai pular tb.
Poderia ate fazer uma rotina para Id nao usado em um tabela ai quando fosse gerar ia nesta tabela primeiro e tal mas ai daria muito trabalho e o custo beneficio nao compensaria !!
Abs !!
GOSTEI 0
Rogério Nascimento
04/08/2009
Valeu Rodrigo, vou testar hoje mesmo !!!
Abraços !
Abraços !
GOSTEI 0
Rogério Nascimento
04/08/2009
Rodrigo, ficou perfeito, eu coloquei no before post e fiz alguns testes, caso o usuário inclua mas não salve, ele não pula o codigo, se ele salva, ja mostra na tela o numero.
Valeu demais, um abraço !!!
GOSTEI 0