1

Konu: one2many tablo ve form yapısı hakkında

Arkadaşlar , ben fox da yeniyim, kendimi geliştirmek adına stok-cari-fatura
Modüllerini Içerecek ir program yapmaya çalışıyorum. Ama takıldığım nokta şu , bilirsinizki bir irsaliye kayda alırken hem satıcı/alıcı dosyasından hem de stok kartı ve de stok Işlemleri tablolarından veriyi çağırmam gerekiyor, Galiba bu da referential integrity ile ilgili , ya da ben öyle olduğunu sanıyorum , ben de bu kısmında takıldım.

One2many diye adlandırılan form ve table yapısını kavrayamadım bir türlü, bununla
Ilgili kaynağı nerden temin edebilirim , ya da tavsiyeleriniz nelerdir , Eğer bu konuyu anlayabileceğim bir örnek gönderir veya bulabiliceğim bir  link tavsiye ederseniz çok sevinicem,

Şimdiden teşekküler

2 Son düzenleyen, cetinbasoz (22.09.2007 21:38:13)

Re: one2many tablo ve form yapısı hakkında

Hosgeldin. Sordugun sorunun cevabi cok uzun kisaca anlatmaya calisayim.

Tablolar listeler gibi, satirlari ve sutunlari var.
Her sutundaki veri tipi tum satirlar icin ayni olmak zorunda (Excelin yaptigi gibi A1 de 123, A2 de "Izmir" seklinde birisi sayi birisi karakter olan tipleri kullanamazsin).
Listede herhangi bir kaydi bulmak icin uzerinde goz gezdirirsin ve istedigin satiri bulursun. O satirla ilgili baska bir listede de bilgi varsa ikisi arasinda birsey(ler)in ortak olmasi lazim. Ilk listen "arabalar" olsun. Ikinci listen ise servise gelis tarihleri gibi bir liste. Ilk listede:
Arac Sasi No: sasino1
Arac Plaka No: 35 VF 191
Marka,model,sahibi vs bilgiler.
Ikinci listede ilgili arabalarin sasi, plaka ya da her ikisi varsa:

Arac Sasi no, Plaka, Gelis
sasino1,35 VF 191,1 Ocak 2006
sasinoX,35 VK 200,1 Ocak 2006
sasino1,35 VF 191,5 Subat 2007
....

sasi no, plaka kullanarak o tek (one) aracin N (many) tane servis kaydini bulabilirsin. Bu iki tablo arasindaki iliski tek - N, one-to-many.

Hem sasi hem de plaka no ile iliskiyi kurabildigina gore birisi fazla gibi. Ama hangisi, once onu ayirmalisin. Plaka No kolay degisir, satisi yapilir aracin, degisir. Sasi yuzde yuz olmasa da sabit. O zaman sasino, ... arabalar dosyasinda ana anahtar olabilir. Plaka sutunu ise baska bir dosyaya, sahibi sutunuyla birlikte giderse, arabalar - arabagecmisi gibi bir baska one-to-many tablo yapisi ortaya cikar.

Sonucta bir-cok tablo yapisi icin:
-Bir kisminda, o tabloda ilgili sutun(lar)da yalniz bir kez gecen ve o satirin yerini kesin olarak tespit edebilen bir seye ihtiyacin var. Bu "ana anahtar" (primary key).

-Cok kisminda ise o anahtar alan 0...N kere bulunabilir. O tablodan 'bir' kismindaki tablonun ilgili satiri baglayan sutun(lar) uzerinden geriye dogru bulunabilir. Bu ise "yabanci anahtar" (foreign key).

Bu iki tabloda birisi ana (parent) digeri cocuk (child).

*** Ana anahtarin icin asla son kullaniciya guvenme. Bu tamamen bilgisayar tarafindan yaratilan bir anahtar olmali (siddetle tavsiye, uymak zorunda degilsin - mesela sasi no gibi kullanicinin girdigi birsey ana anahtar olabilir).
*** Ana anahtar icin baslica kullanilan iki tip var: Integer ve karakter (GUID). Simdilik kafan karismasin, VFP nin autoinc ozelligi integer veriyor sana otomatik. Uzun vadede gercek dunyada calisan uygulamalarin icin GUID tercih et (dunya tartisiyor, ikiye bolunmus sayilir GUIDmi integer mi diye, benim hangi tarafta oldugum belli. GUID konusunda genelde onyargilar var, uzun vadede asil saglam olan o:)
*** Eger sasi no, plaka no ana anahtar olmayacak ise onlarin ana tabloda tek kez gecmesini nasil saglayacaksin? Primary key bir tane olabilir (primary index). Bunlar icin candidate index kullanabilirsin.

Referential Integrity: Tablolarin anahtarlar vasitasiyla biribirlerine isaret etmelerindeki butunluk. Mesela ana tabloda "sasiX" yokken alt tabloya "sasiX" foreign key ile bir kayit acip acamaman ile ilgili. Ya da ana tablodaki silindiginde alt tablodakiler ne olacak (dokunmayabilirsin - orphan, null'a kurabilirsin, onlari da silebilirsin, ana tablodan silmey engelleyebilirsin gibi). Uygulamaya gore degisir. Sorgulama ile dogrudan ilgisi yok, butunluk saglamayla ilgili. Ref.Int. kodu hic olmayabilir, VFP'nin yarattigi olabilir, ya da senin kendi yazdigin. Baslangicta VFPnin RI kodunu kullan (otomatik yaziyor senin icin). Iyi olmasa da anlayana kadar idare eder. Ileride kendin yazar degistirirsin.

Sorgulamalar ise SQL ile ya da eski xBAse yontemleri ile. xBase ve SQL laflari ile karsilacaksin, kisa aciklama:

select ... from tabloAdi .. where ....
insert into tabloAdi ....
update tabloadi set ....
delete from ....
create table (....) ....
drop table ....
add table ...
alter table ....

gibi komutlar SQL serisi. Bir kismi datayi sekillendiriyor ve onlara DataDefinitionLanguage - DDL komutlari deniyor (create table, alter table gibi). Bir kismi ise datadan sorgulam, yeni kayi, guncelleme, silme gibi isler yapiyor ve onlara DataManipulationLanguage - DML komutlari deniyor (select/insert/update/delete from gibi - bu dordunden CRUD diye bahsedildigini de gorursun, CreateRetrieveUpdateDelete).

VFP data merkezli bir dil oldugundan onun SQL'den bagimsiz dogrudan data uzerinde calisan (DDL,DML karsiti ve belki fazlasi) komutlari var. Onlar xBase serisi komutlar, sayisi cok:

replace ...
scan ... endscan
delete ...
seek ...
append ...
list
display
use ...
...

Ne zaman hangisini kullanacagini zamanla ogrenirsin, baslangicta mumkun oldugunca SQL serisi ile git cunku o seri ayni zamanda  diger backend ile de yuzde yuz olmasa da uyumlu (backend lafini da cok duyacaksin, data motoru, depolamasi olarak kullanilan yerler - VFP,SQL serve,Oracle,DB2,VistaDB,mySQL ..., XML, Excel, Access, Text ....).

Son olarak biribiyle iliskili dosyalar arasinda sorgulama icin basit bir ornegi:

Visual Fox Pro
select musteri.musteriAdi, irsaliye.irsaliyeNo, fatura.faturaNo, fatura.faturaTarihi ;

from musteri ;
inner join irsaliye on musteri.musteriAnahtar == irsaliye.musteriAnahtar ;
inner join fatura on musteri.musteriAnahtar == fatura.musteriAnahtar ;
where fatura.faturaTarihi between date(2007,1,1) and date(2007,8,31) ;
into cursor benimSorgum ;
nofilter
 
browse