Gokce,
Raporlar bir cesit komut gibidir ve o sirada aktif olan tablo/cursor ile calisirlar (Dataenvironment'ina tablo eklem hatasini yapmazsan). Yani kaynagin ne oldugu onu gercekte ilgilendirmez. Herhangi bir fieldde:
Customer.CustomerID
yaziyorsa, rapor onun gercekten Customer tablosundan, Customer aliasli bir cursorden ya da Customer adinda bir objeden gelip gelmedigini kontrol etmez, sadece degerini yazar. Yani:
? Customer.CustomerID
yazmak gibi. Eger:
scan
? CustomerID
endscan
yazarsan alacagin sonucu, raporda field expression:
CustomerID
iken de alirsin. Hatta cagirildigi yerde kullanabilecegin local degiskenler, objeler vs de rapor tarafindan erisilebilir seylerdir. Ornegin soyle bir rapor basligi olabilir:
local ldStart, ldEnd
ldStart = date()-20
ldEnd = date()
report form myReport preview
Raporda field expression:
transform(m.ldStart)+" - "+transform(m.ldEnd)+" tarihleri arasindaki ..."
Veya bunlar formundaki txtStart,txtENd alanlarindan geliyorsa:
report form myReport preview
Raporda field expression:
transform(thisform.txtStart.Value)+" - "+transform(thisform.txtEnd.Value)+" tarihleri arasindaki ..."
gecerli kullaninmlar. Hatta bu bile gecerli:
local array aDemoData[1]
select company,contact from (_samples+'data\customer') into array aDemoData
create cursor myDummyCursor (f1 i)
for ix=1 to 10
insert into myDummyCursor values (m.ix)
endfor
report form myReport preview
Raporda field expressionLAR:
aDemoData[recno(),1] aDemoData[recno(),2]
Arrayin ilk 10 satirini gosteriyor. Yani cursor aslinda raporun detail bandinin tekrar sayisinda etkili, data ondan gelmek zorunda degil.
Uzun lafin kisasi, raporunda fieldlerinde ya alias kullanma (CustomerID gibi) ya da jenerik bir cursor aliasi kullan (crsReport.CustomerID gibi). Boylece tek bir rapor kendisinde tanimli tum field expressionlari buldugu surece kaynaga aldiris etmeden calisir.
Ornegin:
select cust_id, company, contact from (_samples+"\data\customer") into cursor crsReport nofilter
report form CustomerReport preview
CustomerReport icinde:
cust_id, Company, Contact
fieldleri oldugu varsaydim.
Ayni raporu samples\Northwind\Customers datasiyla kullanabilirsin:
select customerID as cust_id, companyName as company, contactName as contact ;
from (_samples+"\Northwind\customers") ;
into cursor crsReport nofilter
report form CustomerReport preview
Ozetle: Datanin nereden gelecegi raporun isi degil. Coklu sirket vs gibi datanin yonetimi icinde kendine bir iyilik yap ve universalthread'in son 5-10 gunluk mesajlarini gozden gecir. Sadece rapor icin degil, normal uygulaman icin kullanman gereken yollar var.
Soykan lutfen:
VFP da sadece tek bir public degisken vardir o da oApp. Geri kalan tum degiskenler de, nadir bir iki durum disinda, local dir.
Digerlerine sadece VFP izin verir, dokumantasyonda yer alir. Kullananlar icin "kendi dusen aglamaz" gecerlidir:)
Kendin kullansan bile baskasina onerme.
Sevgili adasim:
Her sirkete ayri database yaratmak gereksiz ve kulfetli. Set database yontemi eger VFP degilde SQL server filan olsaydi tamam, ama VFP ile biraz da tehlikeli bir yontem. Set database yontemi (VFP9 dahil) mevcut bir bug nedeniyle senin dusundugun tablolar disindakileri acabilir.