Problemas com campo autoincrement(Firebird)

Delphi

17/07/2006

Prezados Colegas,

Tenho um banco com 2 tabelas e em cada uma delas criei um campo autoincrement, mas estou tendo problemas, pois quando tento salvar um registro recebo a seguinte mensagem de erro: Field value required.
Já fui no ClientDataSet e na Query e desliguei a propriedade Required dos campos, as opções pfInKey da propriedade ProviderFlags também estão desligadas, mas o erro persiste. Alguma outra dica??
Desde já agradeço.
Abçs.


Fabiano_aprendiz

Fabiano_aprendiz

Curtidas 0

Respostas

Aersoftware

Aersoftware

17/07/2006

Fabiano, pro campo auto-incremento funcionar, tem que criar na base de dados um gerador e uma trigger para cada tabela.

Eu uso isso, e como eu gosto de ter o código gerado logo que insiro um nome registro, ainda coloco um código no evento OnNewRecord do ClientDataSet. Posso te passar ele quando chegar em casa.


GOSTEI 0
Fabiano_aprendiz

Fabiano_aprendiz

17/07/2006

Olá AerSoftware,

Os generators e as triggers foram criados, e o problema ocorre mesmo assim. Ficarei grato se puder me passar o código.
abçs


GOSTEI 0
Jlimajr

Jlimajr

17/07/2006

Uso um generator assim:

Usando um generator assim:

procedure
TForm1.Button1Click(Sender: TObject);
begin
with dm.qrygeracodigo do
  begin
    close;
    sql.clear;
    sql.add(´SELECT CAST(GEN_ID(gen_empresas_id,1) AS INTEGER) AS COD FROM
RDB$DATABASE´);
    open;

dm.ibtb1.append;
dm.ibtb1.FieldByName(´CODEMPR´).AsInteger:=
DM.qrygeracodigo.fieldbyname(´COD´).asinteger;
end;


Mais tambem naum sei se está correto.

Gostaria de tambem sanar esta duvida.

Gradecido.


GOSTEI 0
Fabiano_aprendiz

Fabiano_aprendiz

17/07/2006

Fiz um macete seguindo uma dica q achei na rede e segundo depoimentos essa dica funciona, agora na hora q estou tentando gravar, está ocorrendo outro erro, e o erro é o seguinte: violation of Foreign Key constraint ´Integ_20´ on table ´Visita´.
Alguém já passou por isso?


GOSTEI 0
Aersoftware

Aersoftware

17/07/2006

Olá,

O código que uso no evento OnNewRecord do ClientDataSet é o seguinte:

var
  ResultSet : TCustomSQLDataSet;
  SQLstmt : string;

begin
  SQLstmt := ´select gen_id(GEN_TABELA_ID, 1) ´+
             ´as VALOR from RDB$DATABASE;´;
  ResultSet := nil;
  try
    ConexaoFb.Execute(SQLstmt, nil, @ResultSet);
    if Assigned(ResultSet) then
      ClientDataSetCAMPO_CODIGO.AsInteger :=
        ResultSet.FieldByName(´VALOR´).AsInteger;
    finally
      ResultSet.Free;
    end;


Onde em GEN_TABELA_ID vai o nome do gerador criado e em
ClientDataSetCAMPO_CODIGO vai o nome dado ao TClientDataSet seguido do nome dado ao campo de chave primária.


GOSTEI 0
POSTAR