RETORNA ID
Boa tarde
Pessoal,
Queria o auxilio de vocês em uma função para retorna ID,
EX: (tenho essa função para gerar id, eu queria trabalhar da seguinte forma, retorna maior numero da coluna do meu campo "PK". onde eu possa usar essa função para qualquer tabela. ou se alguém tiver outra sugestão onde os id não ficam furados , tipo quando vou fazer insert caso eu desista já gera novo numero.
function TDM.GenID(tablename: String): Integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(Self);
Qry.SQLConnection :=DBAcesso;
Qry.SQL.add('SELECT GEN_ID(GEN_'+tablename+'_ID,1) FROM RDB$DATABASE');
Qry.Open;
Result:= Qry.Fields[0].AsInteger;
agradeço se alguem puder ajudar,
Pessoal,
Queria o auxilio de vocês em uma função para retorna ID,
EX: (tenho essa função para gerar id, eu queria trabalhar da seguinte forma, retorna maior numero da coluna do meu campo "PK". onde eu possa usar essa função para qualquer tabela. ou se alguém tiver outra sugestão onde os id não ficam furados , tipo quando vou fazer insert caso eu desista já gera novo numero.
function TDM.GenID(tablename: String): Integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(Self);
Qry.SQLConnection :=DBAcesso;
Qry.SQL.add('SELECT GEN_ID(GEN_'+tablename+'_ID,1) FROM RDB$DATABASE');
Qry.Open;
Result:= Qry.Fields[0].AsInteger;
agradeço se alguem puder ajudar,
Joelson Reis
Curtidas 0
Respostas
Rodrigo Cordeiro
12/09/2013
Não tenho certeza se entendi o que vc quer fazer:
Evitar "perder" ID's porque é visível ao usuário ? como vc disse, iniciar uma inserção e "desistir" incrementando o ID? isso ? Mas e se um registro "do meio" for excluído ? vc vai querer utilizar esse ID "vago" ?
Para pegar o mair e incrementar + 1 vc vai usar a função MAX() do SQL... + 1 .... é bom usar uma função que converta NULL para 0 senão caso a tabela esteja vazia vai dar problema pq qualquer operação onde um dos valores seja NULL resultará em NULL tbm... ex: SELECT IFNULL( MAX(campo_id), 0) + 1 FROM tabela ( ou ISNULL() depende do banco de dados)
De qualquer maneira, eu penso que seria melhor deixar o ID incrementar sozinho independente de "perder" números... vc usaria esse campo internamente no sistema para relacionamento entre as tabelas do banco... E cria um outro campo para fazer esse lance de reaproveitamento de códigos onde o próprio usuário possa especificar um nr diferente caso queira... ou então posteriormente alterar o código...
Imagine o seguinte cenário: tabela de produtos... o usuário depois de um ano resolve tirar um produto de linha, não pode excluir porque senão perde histórico de vendas, etc; não quer que esse produto apareça mais disponível para seleção nas telas de inclusão de pedidos, requisições, etc; e de quebra ainda quer usar o mesmo código para um novo produto "similar"... se o campo "código" for sua chave primária vc está ferrado hehehe. mas se vc tem um campo ID interno onde relaciona as tabelas, um campo código que o usuário tem acesso para pesquisas, relatórios, etc e que aceite edição por não ser chave primária e mais um campo "inativo : bool" que você use para eliminá-lo das consultas está tudo resolvido.
[]'s
Rodrigo Cordeiro - qmd
qmd@usercontrol.com.br
Evitar "perder" ID's porque é visível ao usuário ? como vc disse, iniciar uma inserção e "desistir" incrementando o ID? isso ? Mas e se um registro "do meio" for excluído ? vc vai querer utilizar esse ID "vago" ?
Para pegar o mair e incrementar + 1 vc vai usar a função MAX() do SQL... + 1 .... é bom usar uma função que converta NULL para 0 senão caso a tabela esteja vazia vai dar problema pq qualquer operação onde um dos valores seja NULL resultará em NULL tbm... ex: SELECT IFNULL( MAX(campo_id), 0) + 1 FROM tabela ( ou ISNULL() depende do banco de dados)
De qualquer maneira, eu penso que seria melhor deixar o ID incrementar sozinho independente de "perder" números... vc usaria esse campo internamente no sistema para relacionamento entre as tabelas do banco... E cria um outro campo para fazer esse lance de reaproveitamento de códigos onde o próprio usuário possa especificar um nr diferente caso queira... ou então posteriormente alterar o código...
Imagine o seguinte cenário: tabela de produtos... o usuário depois de um ano resolve tirar um produto de linha, não pode excluir porque senão perde histórico de vendas, etc; não quer que esse produto apareça mais disponível para seleção nas telas de inclusão de pedidos, requisições, etc; e de quebra ainda quer usar o mesmo código para um novo produto "similar"... se o campo "código" for sua chave primária vc está ferrado hehehe. mas se vc tem um campo ID interno onde relaciona as tabelas, um campo código que o usuário tem acesso para pesquisas, relatórios, etc e que aceite edição por não ser chave primária e mais um campo "inativo : bool" que você use para eliminá-lo das consultas está tudo resolvido.
[]'s
Rodrigo Cordeiro - qmd
qmd@usercontrol.com.br
GOSTEI 0
Joao Silva
12/09/2013
function AutoInc(pTabela, pCampo: String): Integer;
begin
sqlExec.Close;
sqlExec.SQL.Clear;
sqlExec.SQL.Add('Select Max('+pCampo+') As CODIGO From '+pTabela);
Try
sqlExec.Open;
Result := sqlExec.FieldByName('CODIGO').AsInteger + 1;
Finally
sqlExec.Close;
End;
end;
begin
sqlExec.Close;
sqlExec.SQL.Clear;
sqlExec.SQL.Add('Select Max('+pCampo+') As CODIGO From '+pTabela);
Try
sqlExec.Open;
Result := sqlExec.FieldByName('CODIGO').AsInteger + 1;
Finally
sqlExec.Close;
End;
end;
GOSTEI 0