Fórum Duvida com Chave primaria + DBEDIT #428956
17/11/2012
0
quando eu estou dentro do IBExpert dentro da Tabela na aba Data e vou preencher o campo nome somente, deixando o campo código vazio e dou um Commit o auto incremento funciona beleza.
No Delphi quando eu clico no botão novo ele executa o seguinte comando
DM1.ClientDataSet1.Insert;
e no botão Gravar ( depois de preencher somente o Nome, pois o Código é auto incremento eu deixo vazio)
o seguinte código DM1.ClientDataSet1.Post;
DM1.ClientDataSet1.ApplyUpdates(0);
quando clico em gravar ele me retorna um erro dizendo que o campo Código precisa ser inserido um valor.
se eu inserir esse valor manualmente ele grava beleza, porém gostaria de saber da maneira correta como que deixaria funcionando esse auto incremento sem precisar eu mesmo inserir o campo Código.
Caso alguém pergunte utilizo os seguintes componentes ( sqlconnection, sqlDataSet, DataSetProvider, ClientDataSet, DataModule )
Desde já agradeço.
Sublixo
Curtir tópico
+ 0Posts
17/11/2012
Claudia Nogueira
No delphi se você usa Query você tem que tirar o campo da sentença SQL do Insert e exluir o DBedit. Se usa Table tem que excluir dos fields e excluir o DBedit.
Desculpe os erros de digitação, pois estou no celular.
Gostei + 0
17/11/2012
Carlos Bernardo
Gostei + 0
18/11/2012
Sublixo
No delphi se você usa Query você tem que tirar o campo da sentença SQL do Insert e exluir o DBedit. Se usa Table tem que excluir dos fields e excluir o DBedit.
Desculpe os erros de digitação, pois estou no celular.
Claudia, deu certinho, mais uma vez me salvando rsrsrsr obrigado, porém eu gostaria de mostrar apenas o registro que estaria sendo cadastrado, tem algum jeito?
Gostei + 0
18/11/2012
Sublixo
Acabei descobrindo isso sem querer, deu certo tmb, porém ainda não consegui um método pra fazer aparecer o registro que sera inserido
ja tentei puxar o prox num do generator, mais ele faz certo da primeira vez, da segunda ele repete a da primeira, ja tentei puxar o .Last do ClientDataSet porem se eu excluir o ultimo vai dar Key Violation tmb
Gostei + 0
18/11/2012
Alisson Santos
Gostei + 0
18/11/2012
Carlos Bernardo
var
QRY :TSqlQuery;
begin
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := SuaConexao;
Qry.sql.Add('Select Gen_ID('+str_generator+',1) from RDB$DATABASE');
QRY.Open;
Result := Qry.Fields[0].AsInteger;
end;
No evento NewRecord do ClientDataSet vc usa:
CDS_Codigo.Value := Generator_ID(GEN_TABELA_ID);
Gostei + 0
19/11/2012
Sublixo
Explico, ao dar o insert eu gostaria que o campo DBEdtCodigo que esta ligado ao campo COD_TIPO dentro da tabela mostrasse o prox numero de registro.
Gostei + 0
19/11/2012
Sublixo
var
QRY :TSqlQuery;
begin
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := SuaConexao;
Qry.sql.Add('Select Gen_ID('+str_generator+',1) from RDB$DATABASE');
QRY.Open;
Result := Qry.Fields[0].AsInteger;
end;
No evento NewRecord do ClientDataSet vc usa:
CDS_Codigo.Value := Generator_ID(GEN_TABELA_ID);
me apresentou erro no Self da linha " Qry := TSQLQuery.Create(self); "
outra duvida a function eu coloco no datamodule?
Gostei + 0
19/11/2012
Claudia Nogueira
Primeiro passo é desativar o trigger.
Depois você pode fazer igual o colega sugeriu, implementar uma função e depois do comando Insert se usar IbTable, ou antes do Execute se usar IbQuery pegar o próximo generator:
function Generator_ID(str_generator: string): integer;
var
QRY :TSqlQuery;
begin
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := SuaConexao;
Qry.sql.Add('Select Gen_ID('+str_generator+',1) from RDB$DATABASE');
QRY.Open;
Result := Qry.Fields[0].AsInteger;
end;
CDS_Codigo.Value := Generator_ID(GEN_TABELA_ID);
Gostei + 0
19/11/2012
Carlos Bernardo
Gostei + 0
27/11/2012
Sublixo
Estou usando Delphi XE2 e la ainda persiste o erro do (self)
e la esta declarado assim
uses
System.SysUtils, System.Classes, Data.DBXFirebird, Data.FMTBcd,
Datasnap.DBClient, Datasnap.Provider, Data.DB, Data.SqlExpr;
Gostei + 0
27/11/2012
Carlos Bernardo
por essa Qry := TSQLQuery.Create(nil);
Gostei + 0
28/11/2012
Sublixo
por essa Qry := TSQLQuery.Create(nil);
Agora não apresentou mais o erro, porém, se eu apertar botão novo ".Insert" e depois cancelar ".Cancel", quando eu apertar o botão novo novamente ele já pula para o próximo valor, seria por causa da trigger?
Gostei + 0
28/11/2012
Deivison Melo
--> No evento NewRecord do ClientDataSet vc usa:
--> CDS_Codigo.Value := Generator_ID(GEN_TABELA_ID);
Gostei + 0
28/11/2012
Sublixo
Moderadores podem encerrar o tópico como RESOLVIDO
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)