Campo IDENTY com tabelas Master / Detalhe

Delphi

12/12/2012

Ola,

Estou com roblema pra trabalhar Master/Detalhe com Campo AutoInc do SQL Server utilizando DataSetField, ja tentei
todo tipo de gambiarra tipo, definir propriedade required no false,
O Sistema funciona normalmente se defino o ID manualmente
utilizando DataSetField no relacionamento. com a funcao similar abaixo:


function NextID(Campo,Tabela:String):Integer;
begin

with qryNextID do
begin
Close;
CommandText:='SELECT MAX(' + Campo+')+1 FROM ' + Tabela;
Open;

if Fields[0].IsNull or Fields[0].AsInteger=0 then

Result:=1

else

Result:= Fields[0].AsInteger;

Close;

end;

end;

Fora do ambiente sem Master/Detalhe o AutoINC, funciona normal se nao defino o campo identy no sql.
Se incluo o Campo e nao defino valor, me retorna o Erro de Field Value Required.
Se defino valor seja -1 ou 0, retorna erro de campo identy_insert esta defino OFF


Ambiente:
Delphi XE2
Db. SQL Server 2005
Conexão: DBExpress

Tabela PAI
IDPAI Identy (1,1) PK
DES_PAI varchar(50)

Tabela FILHO
IDPAI - FK
IDFILHO Inteiro
DES_FILHO varchar(50)

Gostaria de alguma dica para trabalhar com Master/Detalhe com Campo AutoInc utilizando DataSetField.


IDPAI - FK
IDFILHO Inteiro
FILHO

qryPai -


Janio Santos

Janio Santos

Curtidas 0

Respostas

Joao Silva

Joao Silva

12/12/2012

Ja resolveu? se não tenho uma dica que resolve seu problema.
GOSTEI 0
Janio Santos

Janio Santos

12/12/2012

Ja resolveu? se não tenho uma dica que resolve seu problema.



ainda não amigo, sua dica vai ser bem vinda, estou trabalhando com o controle ID manual, como ilustrado no inicio do topico.
GOSTEI 0
Joao Silva

Joao Silva

12/12/2012

.
.
.
.
.
.

public
{ Public declarations }
SeqRegistro: integer;
end;
.
.
.


procedure TdtmNomedoDataModule.cdsNomedoDataSetNewRecord(DataSet: TDataSet);
begin
inherited;
Dec(SeqRegistro);
DataSet.FieldByName('id').AsInteger:=SeqRegistro;
end;


procedure TdtmNomedoDatamodule.prvNomedoproviderBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
inherited;
if UpdateKind = ukInsert then
begin
if SourceDS = qryNomedaQuery then
if DeltaDS.FieldByName('id').AsInteger < 0 then
DeltaDS.FieldByName('id').NewValue:=aqui vc coloca a função que busca o ultimo codigo da tabela
end;
end;
end;
end;
GOSTEI 0
POSTAR