ADODataset ile basit bir fiş işlemi (Master/Detail) yapmak istiyorum. Firebird veya Oracle'da sorunsuz yaptığım bu işlemi ilk defa master/detail yapacağım MSSQL'de başaramadım.
Yapmak istediğim Grid'e veri ekleyip aşağı ok tuşu ile veri eklemeye devam etmek ama alt satıra geçtiğimde ilk satır bilgileri kayboluyor.
Master ve Detail datasetlerin SQL'lerini yazdım.
Detail Datasetin Datasource'una Master Source'u ekledim.
Detail Datasetin MasterFields kısmında Field Link Designer ile Detail ve Master keyleri bağladım.
Master Tablo
Kod: Tümünü seç
CREATE TABLE [dbo].[FIS](
[FISKEY] [int] IDENTITY(1,1) NOT NULL,
[TARIH] [date] NULL,
[FISNO] [smallint] NULL,
CONSTRAINT [PK_FIS] PRIMARY KEY CLUSTERED
(
[FISKEY] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Detail Tablo
Kod: Tümünü seç
CREATE TABLE [dbo].[FISDET](
[FISDETKEY] [int] IDENTITY(1,1) NOT NULL,
[FISKEY] [int] NULL,
[ADI] [varchar](50) NULL,
[NUMARASI] [varchar](50) NULL,
CONSTRAINT [PK_FISDET] PRIMARY KEY CLUSTERED
(
[FISDETKEY] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Master tablodaki KEY'in alması gereken son numarayı "SELECT IDENT_CURRENT('FIS') AS SONID" query ile buldum ve DetailDatasetin BeforePost olayına Detail datasetin MasterKey'ine atadım.
Kod: Tümünü seç
procedure TForm1.FormCreate(Sender: TObject);
begin
MasterDataset.Active := True;
DetailDataset.Active := True;
end;
Kod: Tümünü seç
procedure TForm1.DetailDatasetBeforePost(DataSet: TDataSet);
var
SonID: Integer;
begin
ADOQuery1.Active := True;
SonID := ADOQuery1SONID.AsInteger + 1;
DetailDatasetFISKEY.AsInteger := SonID;
ShowMessage(IntToStr(DetailDatasetFISKEY.AsInteger));
end;
Kod: Tümünü seç
procedure TForm1.btnYeniClick(Sender: TObject);
begin
ADOConnection1.BeginTrans;
MasterDataset.Append;
DetailDataset.Append;
end;
Teşekkür ederim.