identity
uso sqlserver 2005 express com delphi 2007 e dbexpress gostaria de saber a melhor forma de se retornar o valor gerado do identity para a gravação do registro pq toda vez que vou cadastrar ele volta sem valor e da erro como faço pra pegar o valor do identity ???
Orc
Curtidas 0
Respostas
Andreaskaquino
16/10/2008
Verifique se a propriedade readonly de algum dos campos da fieldlist do dataset ou do columnlist do dbgrid esta setada como True, neste caso o DbGrid tem o comportamento que você descreveu, ou seja, salta os campos que estão marcados como somente leitura.
Abraço.
Abraço.
GOSTEI 0
Andreaskaquino
16/10/2008
Primeiro as minhas desculpas, acabei respondendo algo de outro posto na sua dúvida.
Agora vamos a sugestão. Trabalho com Delphi e SQL SERVER 2000, tive alguns problemas com campos Identity e os resolvi da seguinte forma:
1 - Criar uma função para ler o último valor do campo para a respectiva tabela:
function RetornarValorCampoID(Tabela: String): Integer;
begin
try
with dm1.sqldAux do
begin
Close;
Commandtext := ´SELECT IDENT_CURRENT(´ + QuotedStr(Tabela) + ´)´;
Open;
Result := Fields[0].AsInteger + 1;
Close;
end;
except on E: Exception do
begin
Result := 0;
MessageDlg(E.Message+#13+10+13+10+
´Não foi possível ler o último valor do campo auto-numerador da tabela ´+Tabela+13+10+
´Favor entrar em contato com o suporte técnico!´, mtError, [mbOK], 0);
end;
end;
end;
2 - No SqlDataSet/ClientDataSet que fará a atualização dos campos deixar todos os ProviderFlags do campo IDENTITY como False;
3 - Deixar o UpdateMode do DataSetProvider como upWhereAll;
4 - Atualizar o valor do campo IDENTITY no evento OnNewRecord:
Cds.FieldByName(´CP´).AsInteger := RetornarValorCampoID(´TAB´)
Seguindo estes procedimentos creio que você conseguirá resolver o seu problema.
Atenciosamente,
Agora vamos a sugestão. Trabalho com Delphi e SQL SERVER 2000, tive alguns problemas com campos Identity e os resolvi da seguinte forma:
1 - Criar uma função para ler o último valor do campo para a respectiva tabela:
function RetornarValorCampoID(Tabela: String): Integer;
begin
try
with dm1.sqldAux do
begin
Close;
Commandtext := ´SELECT IDENT_CURRENT(´ + QuotedStr(Tabela) + ´)´;
Open;
Result := Fields[0].AsInteger + 1;
Close;
end;
except on E: Exception do
begin
Result := 0;
MessageDlg(E.Message+#13+10+13+10+
´Não foi possível ler o último valor do campo auto-numerador da tabela ´+Tabela+13+10+
´Favor entrar em contato com o suporte técnico!´, mtError, [mbOK], 0);
end;
end;
end;
2 - No SqlDataSet/ClientDataSet que fará a atualização dos campos deixar todos os ProviderFlags do campo IDENTITY como False;
3 - Deixar o UpdateMode do DataSetProvider como upWhereAll;
4 - Atualizar o valor do campo IDENTITY no evento OnNewRecord:
Cds.FieldByName(´CP´).AsInteger := RetornarValorCampoID(´TAB´)
Seguindo estes procedimentos creio que você conseguirá resolver o seu problema.
Atenciosamente,
GOSTEI 0