Detail tablon kendi post işlemini yapar, o yüzden detail tablonun postu için dogrudan endişelenmen gereksiz. Sadece şu noktalara dikkat et:
1- Detail tabloya yeni kayıt girerken, master in state i insert veya edit ise post edilmelidir. Yoksa detail girişi ile master arasındaki bağ kopar. Şöyle anlatayım yeni bir master girerken, post etmeden detail girmeye başlıyorsun. Data post edilmedigi için detail baglantıya masterdan aldıgın alan null olarak geliyor. Daha sonra detail i post edip, master i post edersen. Master son girilen değer olurken, detail null da kalıyor ve detail ile master arasındaki bag ortadan kalkıyor ve detail kayboluyor. Veritabanında var, ama islemid si null olarak duruyor. Bu durumu engellemen ise basit, detail in onbeforeinsert eventinde master i kontrol edip, eger edit veya insert ise master i post etmen yeterlidir.
2- Foreign key kullanman da faydalı olur. Master ile detail i bagladıgın alan degişirse veya silinirse veritabanı otomatik olarak gerekli düzenlemeyi yapar.
ALTER TABLE DETAIL ADD CONSTRAINT HERHANGIBIRSEY FOREIGN KEY (ISLEMID) REFERENCES MASTERTABLE(ISLEMID) ON DELETE CASCADE ON UPDATE CASCADE;
Bu şekilde ekleyecegin foreign key sayesinde master table silinirse, ona ait tüm detail kayıtlar da silinecektir. ISLEMID degisirse, detaillardaki islemid de degisecektir.
Update, insert ve delete için gerekli sqlleri ibdataset in üzerini sag ile tıklayıp, dataset editorden oluşturduysan, detail tablon tüm işlemleri sorunsuz yapacaktır.
Aşagıdaki kod griddeki renk çizimi için işini görmesi lazım. Denemedim, o yüzden ufak tefek düzenleme gerekebilir.
Kod: Tümünü seç
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with Sender as TDBGrid do
begin
if Columns[DataCol].FieldName = 'FIELDADI' then
begin
Canvas.Brush.Color:= <--- istediğin renk
Canvas.FillRect(Rect);
end
else
DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;