1

Konu: Bir rapor birden fazla dbf'de...

Kullanıcıya başlarken bir şirket (table) seçtiriyorum. Tabiiki bu table'ların yapıları birbirinin aynı. Seçtiği table hangisi olusa olsun oluşturduğum aynı raporu kullanmak istiyorum. Yani rapor aynı içerik değişik. Oluşturduğum ornek.frm yi yapıları birbirinin aynı birden fazla table için ne şekilde kullanabilirim ?

Teşekkür ederim.

2

Re: Bir rapor birden fazla dbf'de...

önceki yıllarda firma icin tablelar olusturup sonuna uzantisini 001 002 gibi sekilde ayarlayip firma bazli calismalar yapma denemeleri  yapmistim . Ama bu zamanla sıkıntılı yonetim sıkıntıları yaratabiliyor
onun yerine her firma nosu icin klasor olusturmak ve kullanmak daha efektif sonuc veriyor ve su an bu yontemi kullaniyorum

data klasorü yapin mesela

data
   001
       2005
       2006
   002
       2005
       2006

seklinde olabilir

yapilacak sey uygulama basinda SET PATH ile data path ine konumlanmak

parametre ve rapor klasorunude standart olarak her firma icin kullanabilirsin

bu amac icin .ini .dbf yada .xml dosyada

data,parametre,rapor,image gibi bilgileri tutabilir acilista buradan okuyarak PUBLIC olarak hafizaya alabilir daha sonra her yerde kullanabilirsin

NOT : public degiskeni sadece bu tur amaclar icin kullanmani tavsiye ederim. daha sonra public olarak declare ettigin degiskeni baska bir yerde kullanmak yada  form icinde yanlislikla tanimlarsan istemedigin sonuclara yol acan durumlar olur sebebini bulmakta epey bas agritabilir sad

3

Re: Bir rapor birden fazla dbf'de...

select ... from ... into cursor crsReport
report form ortakReport preview

4

Re: Bir rapor birden fazla dbf'de...

Herbir Şirket için bir database oluşturabilirsin, o zaman "SET DATABASE TO SIKETADI" ile isediğin şirkete geçip o şirketin dosyalarını kullanmaya başlayabilirsin. Böylece Dosyaların hangi konumda nerede olduğu pek önemli olmuyor, bu bilgiler zaten Database içinde yer alıyor.

5

Re: Bir rapor birden fazla dbf'de...

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.

6

Re: Bir rapor birden fazla dbf'de...

cetinbasoz yazdı:

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.


Public degiskeni ben sadece start.prg de bir kac sabit bilgiyi almak icin kullaniyorum datapath,parampath,reportpath,imgpath gibi baska kullanmiyorum onermiyorum da smile

7

Re: Bir rapor birden fazla dbf'de...

Tamam adaşım
Aslında bizim programda öyle bir hata yapıldı ve şimdi ben onun düzeltmeleri ile uğraşıyorum, Muhasebe programında her yıl için bir dizin açılmıştı ancak gerçekten çok büyük bir eziyet oldu, bence bunun içinde en uygunu dosyalara şirket kodu olarak bir alan eklemek ve bu şekilde ayırt etmek, o zaman ne database ile uğraşıyorsun nede baika bişeyle.
Uyarın için teşekkürler.

8

Re: Bir rapor birden fazla dbf'de...

Her ikinizede ilginizden dolayı çok teşekkür ederim. Zaten mevcut projeyi değiştiremeyeceğim için her şirket için ayrı bir database oluşturmam çok zor olacaktı. Onun için rapor içinde "Customer.CustomerID" şeklinde kullanmak benim için daha avantajlı olacak. Henüz denemedim ama problem çıkacağını sanmıyorm. UT için tavsiyene uyacağım. Ayrıca tüm yazdıklarınız forumda bırakılamayacak kadar değerli. Ne olur ne olmaz "kopyala - bi kenara yapıştır" yapmakta fayda var.

Tekrar teşekkürler.

9

Re: Bir rapor birden fazla dbf'de...

Gokce,
Yalniz bir seyi atlama. Mumkunse sadece:

CustomerID

kullan (aliassiz). Alias sadece linkli bir tablo/cursor varsa gerekli ( customer ile birlikte orders kullaniyorsan mesela - CustomerID, orders.OrderID ) ya da o alias degil obje adiysa.

10

Re: Bir rapor birden fazla dbf'de...

Yazdıklarınızı dikkatle okudum ve dersimi çalıştım (Fenerin maçına ramen) . Sonuç aynen söylediğiniz gibi. Ve aşırı basit. Report wizard KULLANMADAN raporu manuel olarak oluşturup sadece "CustomerID" kullanmak işi çözüyor. O zaman vfp onun nereden geldiğine  bakmadan sadece yazıyor.

Maçta iyi seyirler dilerim.