2 tablo ile aynı anda çalışmak...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
efkan
Üye
Mesajlar: 155
Kayıt: 31 Oca 2004 07:47
Konum: Tekirdağ
İletişim:

2 tablo ile aynı anda çalışmak...

Mesaj gönderen efkan »

Merhabalar. Elimde bir form ve MySQL InnoDB tabanlı 2 tablo var.
Yaptığım her işlemi 2 tablo içinde yapmalıyım ancak Birinci tablodaki bazı alanlar İkinci tablodaki bazı alanlara yazılmalı,değiştirilmeli ve silinmeli.
Aklım çok karıştı ve çok günüm boşa geçti :(
Konu hakkında bilgi sahibi arkadaşların yardımına ihtiyacım var.
herkese çalışmalarında başarılar...
Bilgisayar Programcısı/Analyst ve Sistem Yöneticisi
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

lookup field ekleyerek işiniz çözülebilirmi acaba?
Kullanıcı avatarı
efkan
Üye
Mesajlar: 155
Kayıt: 31 Oca 2004 07:47
Konum: Tekirdağ
İletişim:

Mesaj gönderen efkan »

Afedersiniz Lookyp field dediğiniz lookupcombobox falan mı?
benim ne gibi işime yarayabilir bilmiyorum yada anlayamadım?
daha önce bu şekilde çalışma gereği duymadığımdan biraz acemiyim kusura bakmayın..
Bilgisayar Programcısı/Analyst ve Sistem Yöneticisi
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

mesela elinde bir personel tablesi var personel adı,soyadı,sicil bilgisi filan kayıtlı

birde personelin işe giriş çıkış saatlerini tuttuğun bir table var bu tabledede personelin sicilnosu tarih giriş ve çıkış kayıtlı.

Şimdi sen bu tablede personelin adını ve soyadını görmek isteyeceksin elbette . bu durumda bir lookup field eklersin personel tablesindeki isim soyisim bilgileri hareket tablesine otomatik olarak gösterilir.

Lookupfield nasıl eklenir dersen arama bu konuda yardımcı olacaktır.

Umarım anlatabilmişimdir ve işini çözmende yardımcı olur.
Kolay gelsin...
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Bunu query kullanalarak ta yapabilirsin.

Kod: Tümünü seç

  select toblo1.adi,tablo1.soyadi, tablo2.no, tablo2.dersi,tablo2.notu from tablo1 
left join tablo2 on tablo1.no=tablo2.no where tablo1.no = 123
gibi bişeyle yapabilirsin.
Kullanıcı avatarı
efkan
Üye
Mesajlar: 155
Kayıt: 31 Oca 2004 07:47
Konum: Tekirdağ
İletişim:

Mesaj gönderen efkan »

Yaptığım her işlemi 2 tablo içinde yapmak istiyorum.Yani
TABLO - 1
OgranciAdi , SOyadi , No , Not1 ,Not2,Not3

TABLO - 2
OgrenciAdi , Soyadi , No, Not1, Veli adi, Sosyal Bilgiler Dersi Kompozisyonu vs.

Yani Tablo 1 ve 2 de benze alanlar var ve bu alanları bir sefede doldurmak , Değiştirmek ve hatta Silmek istiyorum

yardımlarınız için çok teşekkürler..

Sn. BGoktas ın anlattığı Lookupfield'ı inceleyeceğim.Ancak tek satır kayıt değil yüzlerce , binlerce satır kayıtı 2 tablodaki aynı kayıtlarsan daha sonra geri çağıracağım
çalışmalarınızda başarılar.
Bilgisayar Programcısı/Analyst ve Sistem Yöneticisi
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

merhaba istediğin işlemleri insert into update gibi sql komutlarıyla yapabilirsin sanırım
DeveloperToolKit

..::|YeşilMavi|::..
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

Programci nickli arkadaşın söylediği gibi bir ilişki kurarsanız tablolara kayıt ekleyemeyeceksiniz çünkü tablolar readonly olarak açılacaktır. Lookupfiledda ise tercih ederek girmek zorunda kalacaksınız. Bunun çözümü INSERT ve UPDATE SQL kodlarını kullanarak kayıt girmenizdir. Şayet IB/FB gibi bir veritabanı kullanıyorsanız Table1 e bağlı tablo için 2 adet triger yazarak bunu veritabanı tarafında çözebilirsiniz. Şayet paradox gibi bir veritabanı kullanıyorsanız bunu Query bileşeni ile çözersiniz.

İnsert:
INSERT INTO TABLO2 SELECT * FROM TABLO1 WHERE PK=: PK gibi


Sevgiler..
Kullanıcı avatarı
efkan
Üye
Mesajlar: 155
Kayıt: 31 Oca 2004 07:47
Konum: Tekirdağ
İletişim:

Mesaj gönderen efkan »

Şair nickli arkadaşım sorunu gayet net bir biçimde açıkladı.MySQL kullanıyorum Transaction ile UpdateSQL kullanayım dedim işin Modify kısmı çok kastı çünkü tek tabloda tamam ancak ekranda dbgridle girişleri yapılan TABLE1 alanlarını Navigatorle kaydettiriyorum ancak UpdateSQL kullandığımda kodu nereye yazacağımı bulamadım.
Navigator click event ine

Kod: Tümünü seç

 if button=nbPost then begin...

diye yazsam Değiştirme İşlemini(Modify) nereye yazacam.TABLE2 ye Modify dediğimde Transactionla direkt kaydı değiştiriyor. Ancak kaydı önce değiştir modunda açmalıyım.Sonra Update set ile değişiklikleri yollamalıyım.

ilgilenen çok arkadaş oldu hepsine can-ı gönülden teşekkürler...
Bilgisayar Programcısı/Analyst ve Sistem Yöneticisi
Kullanıcı avatarı
fanibiri
Üye
Mesajlar: 21
Kayıt: 05 Nis 2005 08:55
Konum: Antalya
İletişim:

enteresan

Mesaj gönderen fanibiri »

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....
Bilenler Lütfen Bilmeyenlere Anlatsın....
menderes

Re: enteresan

Mesaj gönderen menderes »

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.....
Kullanıcı avatarı
fanibiri
Üye
Mesajlar: 21
Kayıt: 05 Nis 2005 08:55
Konum: Antalya
İletişim:

tesekkur

Mesaj gönderen fanibiri »

menderes bey çok teşekkür ederim fakat accessi iyi biliyorsunuz form alt ve üst bilgisi ekliyoruz alt forma detail formu koyduğumuz zaman olay bitiyor. bende iki tablo var musteriler ve bilgi diye musteriler deki muskod ile bilgi muskod birbirine bağlı bu sayede sadece 1 kez musteri bilgilerini girdikten sonra musterinin almış olduğu ürünleride bilgi tablosuna girebiliyorum (sonsuz ürün) istediğim tek şey musterileri dbeditlere bağlamak bilgi(yani ürünler) ise dbgrid yada önerebileceğiniz bir şey olabilir ona bağlayıp müşteri bilgilerini bir kez girdikten sonra alttaki dbgrid yada başka bir bileşenede musteriye ayit onlarca ürünü tekrar müşteri bilgilerini girmeden girebilmek...aynı fatura programlarında olduğu gibi cari formuna musteriyi giriyoruz fatura kısmındada satmış olduğumuz ürünleri birbir giriyoruz... yani bir nevi iki tabloyu birbirine bağlamak oluyor yardım ederseniz sevinirim Teşekkürler.
Bilenler Lütfen Bilmeyenlere Anlatsın....
Cevapla