fanibiri yazdı:Accessde Ado ile bu SQL deyimler olmuyor arkadaşlar 2 adet tabloyu bir bdgrid ve dbedit lerle ilişkilendiremiyorum Access de ne kadar kolay 2 form yapıyorsun alt forma detaili koydunmu olay tamam oluyor ama delphide bu beni kilitledi malesef... ado datasette sql komutunu girince iki tablodada ortak olan müşteri kodu yani muskod için Adodataset1 field muskod not found diyor çok enteresan....
Bu sözünüze maalesef katılamıyorum...
Şimdi isterseniz bir uygulama yapalım;
Önce Accees de iki adet arkadaşın dediği alanlardan tanımlayalım;
Tablo1
id -- o/s otomatik artan
ogradi (metin) //sayısını siz verin
soyadi (metin)
no (metin) // siz sayısal da yapabilirsiniz
not1 (metin) // siz sayısal da yapabilirsiniz
tablo2_id (sayısal) // bu ikinci tablede ilişki için
Tablo2
id --o/s otomatik artan
ogradi - metin
soyadi - metin
no - metin
veli - metin
-------------------------
Şimdide Delphi ye gelelim
Bir Adet Fana adında form oluşturup içerisine bir adet buton (üzerine yeni yazalım) bir de dbgrid1 koyalım.
Bir Adet DataModule açalım, içerisine
ADOConnection1 - oluşturduğumuz veritabanını bağlayalım
ADOTable1 ve DataSource1 - Database yi bağlayıp veritabanındanda Tablo1 i table name den seçelim.
ADOTable2 ve DataSource2 aynı şekilde bunu da Tablo2 ye bağlayalım
ADOQuery1 ve DataSource3 sadece database yi bağlayalım ADOConnection a.
Fana içerisindeki dbgrid1 in datasourcesini (tabi unit tanımlayın useste DataModule1 olsun) Datamodul1 deki ADOTable2 yi bağlayalım.
Yine DBGrid1 i readonly ve options tan rowselect=true yapalım ki form da iken kayıt girilmesin....
Gelelim kayıt yapacağımız forma, bir adet form açıp adını Form1 koyalım, delphi menüsünde project / optionsa tıklayalım ve orada Form1 i Available Form olarak ayarlayalım ki açılışta yüklenmesin. Biz istediğimiz zaman creat edelim. Tamamsa Form1 in onclose olayına
action:=caFree; // yapalım ki formdan çıkışta form yok olsun.
Şimdi;
bu Form1 üzerine ;
Kod: Tümünü seç
Öğrenci Adı : Edit1.Text;
Soyadı : Edit2.Text;
No : Edit3.Text;
Not : Edit4.Text;
Veli : Edit5.Text;
//Bir adet te visiblesi false olan Edit6.Text koyalım id alan için kullanacağız.
//Bir Adet te kaydet butonu koyalım.
private kısmına procedure tanımlayalım ki kaydet butonuna kod yazarken fazla kalabalık olmasın.
Kod: Tümünü seç
private
{ Private declarations }
public
{ Public declarations }
procedure atemiz();
end;
var
Form1: TForm1;
implementation
uses UnitDataModule1;
{$R *.dfm}
Procedure TForm1.atemiz();
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
Edit6.Text:='';
end;
Form Fana mıza geri dönelim, buradan yeni kayıt diyeceğiz Form1 e geleceğiz...
Kod: Tümünü seç
procedure TFana.FormShow(Sender: TObject);
begin
DataModule1.ADOTable2.Open;// form açılışta kayıt varsa listelensin
end;
procedure TFana.yeniClick(Sender: TObject);
begin
Application.CreateForm(TForm1, Form1); // formumuzu creat ediyoruz.
Form1.atemiz; // form1 deki procedure devreye giriyor alanları temizliyor
Form1.ShowModal;
end;
Form1 karşımıza geldi diyelim....
Şimdi hem Tablo1 i hemde Tablo2 ye kayıt yapacağız...
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (Trim(Edit1.Text)<>'') and (Trim(Edit2.Text)<>'') and (Trim(Edit3.Text)<>'') then
begin
DataModule1.ADOTable2.Open;
DataModule1.ADOTable2.Insert;
DataModule1.ADOTable2.FieldByName('ogradi').AsString:=Edit1.Text;
DataModule1.ADOTable2.FieldByName('soyadi').AsString:=Edit2.Text;
DataModule1.ADOTable2.FieldByName('no').AsString:=Edit3.Text;
DataModule1.ADOTable2.FieldByName('not1').AsString:=Edit4.Text;
DataModule1.ADOTable2.FieldByName('veli').AsString:=Edit5.Text;
DataModule1.ADOTable2.Post;
Edit6.Text:=DataModule1.ADOTable2.FieldValues['id'];
if Edit6.Text<>'' then// Kayıt işlemi olmuş ve boş geçmemişse
begin
DataModule1.ADOTable1.Open;
DataModule1.ADOTable1.Insert;
DataModule1.ADOTable1.FieldByName('ogradi').AsString:=Edit1.Text;
DataModule1.ADOTable1.FieldByName('soyadi').AsString:=Edit2.Text;
DataModule1.ADOTable1.FieldByName('no').AsString:=Edit3.Text;
DataModule1.ADOTable1.FieldByName('Tablo2_id').AsInteger:=StrToInt(Edit6.Text);
DataModule1.ADOTable1.Post;
end;
atemiz;
end
else
begin
ShowMessage('Eksik Bilgi Girişi');
Edit1.SetFocus;
Abort;
end;
end;
Kayıt işlemimiz bu şekilde gerçekleşti her iki tablo için
isterseniz başka tablolar varsa id fieldini bu tablolara tablo2_id olarak sayısal alan açıp istediğiniz kadar detail tablo oluşturabilirsiniz.
Çünkü master tablo dediğimiz tablenin id sini Edit6.Text içerisine koyduk,
Buradan alıp istediğimiz gibi kullanabiliriz.
Kayıt işleminden sonra formumuz tertemiz yeni bir kayıt için duruyor.
İsterseniz burada yukarıda atemiz(); yazan kısmın altına close;
yazabilir ve kayıttan sonra formun kapanmasını sağlayabiliriz.
not: Konu kayıt işlemi olduğu için daha önce bu kayıt varmı diye yazmadım, zaten forumda da bu konu (kayıt varmı) anlatılmış.
Şimdide gelelim master detail sorguya;
Bir adet Form2 adında bir form oluşturalım. Onuda Available Forms yapalım. onclose olayına da action:=caFree; yazalım.
Form içerisine,
Bir Adet,
Öğrenci Adı :Edit1.Text
koyalım siz diğer alanlar için koyabilirsiniz. Table2 nin alanlarını getireceğiz buraya.
Birde DBGrid1 koyalım DataSource sini (DataModule1 usese unutmayın) ADOQuery1 e bağladığımız DataSource3 e bağlayalım.
DBGrid in üzerinde görünecek olan isimleri siz ayarlarsınız.Bu form da tamamsa dönelim Fana formumuza;
ben oradaki DBGrid1 in ondblclick olayına yazdım siz butonada yazabilirisiniz.
Kod: Tümünü seç
procedure TFana.DBGrid1DblClick(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
if DataModule1.ADOTable2.Active=True then
begin
Form2.Edit2.Text:=DataModule1.ADOTable2.FieldByName('ogradi').AsString;
DataModule1.ADOQuery1.Close;
DataModule1.ADOQuery1.SQL.Clear;
DataModule1.ADOQuery1.SQL.Add('select * from Tablo1');
DataModule1.ADOQuery1.SQL.Add('where tablo2_id= ' + IntToStr(DBGrid1.DataSource.DataSet.FieldByName('id').AsInteger));
DataModule1.ADOQuery1.Prepared:=True;
DataModule1.ADOQuery1.Open;
end;
Form2.ShowModal;
end;
Görüldüğü üzere Tablo2 den seçilen veri Edit1.Text içerisine (master), bu kişiye ait veriler ise DBGrid1 içerisine Tablo1 deki (detail) listelendi.......
Herkese saygılarımı sunarım.... kolay gelsin.....