Jump to content

Fastreport yazdirma


mehmet07

Recommended Posts

Merhabalar,

Aşağıdaki kodla pdf olusturuyorum. Programı aynı anda 30-120 arası kullanıcı kullanıyor. Tüm bu kullanıcıarın firmaları tek bir database de musteri kodu alanı ile ayrıstırılmıs vaziyette.

Müşterilerim bazen Cari liste alırken başka kurumların firmalarının kendilerine geldiğini soyluyorlar. (sürekli yapmıyormuş arasıra oluyormuş)

  frxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl);

Bu kod her oluşturulan raporun benzersiz oldugunu garanti eder mi acaba? Çunku aynı anda aynı raporu birçok firma alabilir. Boyle oluncada aynı isimle dosya olusturmus olursa digerleride birisinin olusturmus oldugu dosyayı gorebilir diye dusundum.

Kullandıgım unigui surum:1.0.0.1391

Teşekkürler.

   rapor.PrintOptions.ShowDialog := False;
     rapor.ShowProgress:=false;
     rapor.EngineOptions.SilentMode:=True;
     rapor.EngineOptions.EnableThreadSafe := True;
     rapor.EngineOptions.DestroyForms := False;
   rapor.EngineOptions.UseGlobalDataSetList := False;
     frxPDFExport1.Background:=True;
     frxPDFExport1.ShowProgress:=False;
     frxPDFExport1.ShowDialog:=False;
     frxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl);
     frxPDFExport1.DefaultPath := '';
     rapor.PreviewOptions.AllowEdit:=False;
     rapor.LoadFromFile(s);
     rapor.PrepareReport();
     rapor.Export( frxPDFExport1);
     frmYazdirma.UniURLFrame1.URL := AUrl;
     frmyazdirma.show;
 
Link to comment
Share on other sites

  • Administrators

 

Merhaba,

bu daha kesin çözüm sanırım :)

repeat
 rxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl);
until FileExists(rxPDFExport1.FileName );

 

Buna gerek yok. uniGUI NewCacheFileUrl ile yaratılan dosyanın benzersiz olduğunu garanti eder.

Link to comment
Share on other sites

Merhaba,

Mehmet pak ın esas sorunu

"Müşterilerim bazen Cari liste alırken başka kurumların firmalarının kendilerine geldiğini soyluyorlar. (sürekli yapmıyormuş arasıra oluyormuş)"

 

SQL i oluşturduğun yerlerdeki, kullandığın değişkenleri vs kontrol et bence. global değişkenler yerine, private değişkenler kullanmayı deneyin, hatta ben form yada class içerisinde kullanılacak değişkenleri record yapıp, bunları da new-dispose ile kullanırım ki, bir karışıklık olduğunda yanlış sonuç vereceğine hata versin, hatayı yakalabileyim.

Anlık kullandığın bir global değişken yada cookie varsa, buda db den veri alırkenki gecikmeden vs sebeplerden beklemedeyken gelen ikinci sorgu buna sebep olabilir.

örnek:

     rapor.LoadFromFile(s);
     rapor.PrepareReport();
     rapor.Export( frxPDFExport1);

"Rapor."  global tanımlı bir form üzerinde ise, yada raporu okuttuğun S değiişkeni, bu arada rapor içinde db bileşenleri kullandı isen, vs gibi

tabi aklıma gelen olasılıkları yazıyorum, bunlardır diye iddia etmek yanlış olur.

Kolay gele

 

Sonradan aklıma geldi:

....
     rapor.LoadFromFile(s);
     rapor.PrepareReport();
frxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl); // İsim sadece pdfexporta gerekli ve oda işlemnden hemen önce verilmesinde yukarıda yazdıklarımdan dolayı faydalı olabilir
     rapor.Export( frxPDFExport1);
Link to comment
Share on other sites

Merhabalar,

Öncelikle cevaplarınız için teşekkür ederim.

 

Program içersinde şubeleri bir birinden ayıraln sube no diye bir değiskenim var. kullanıcı giris yaptiginda bu degiskene ilgili subesinin degerini atiyor.

Sorgularda da bu degiskeni kullaniyorum.

yapi, main module icinde

type
  PUserRecord = ^TGenelAyar;
  TGenelAyar = record
   subeno,aktifkullanici:String;
  end;

bu sekilde tanımlı. Login formunda giriş yapılınca subeno degiskenine giristeki subeno degeri atiliyor.

 

Fastreport bilesenlerini ayri bir datamodule de tutuyorum. Bu datamodulde
 

function TdmodulRapor.yazdir(s:String):boolean;
var AUrl:string;
begin
     rapor.PrintOptions.ShowDialog := False;
     rapor.ShowProgress:=false;
     rapor.EngineOptions.SilentMode:=True;
     rapor.EngineOptions.EnableThreadSafe := True;
     rapor.EngineOptions.DestroyForms := False;
     frxPDFExport1.Background:=True;
     frxPDFExport1.ShowProgress:=False;
     frxPDFExport1.ShowDialog:=False;
     frxPDFExport1.DefaultPath := '';
     rapor.PreviewOptions.AllowEdit:=False;
     rapor.LoadFromFile(s);
     rapor.PrepareReport();
     frxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl);
     rapor.Export( frxPDFExport1);
     frmYazdirma.UniURLFrame1.URL := AUrl;
     frmyazdirma.show;
end;

yukarıdaki function mevcut. Tüm rapor formlarından bu function a parametre gonderip yazdirma islemini gerceklestiriyorum.

Mesala dmodulRapor.yazdir('stoklistesi.fr3');

şeklinde.
 

Link to comment
Share on other sites

Farşad benden önce yazmış :)

type
  PUserRecord = ^TGenelAyar;
  TGenelAyar = record

Bunlar record tanımlaman, hangisini nerde nasıl kullandın ? "ben" karıştırmamak adına global olacak tanımlamaları Servermodule de tanımlıyorum.

 

Diğer rapor ve pdfexport için. Ben olsam, henüz rapor yapacak form bitirmedim, hala öğrenme tasarım, dizayn aşamasındayım, o rapor bloğunu module den çıkartırım, zaten bir "frmYazdirma" formun var pdfframe i de diğer rapor componentlarınıda buraya koyardım. gereksiz memory israfına gerek yok, module her session için create ediliyor.

Ayrıca objectinspector da değiştirip dfm e gömdüğün değişkenleri herseferinde tekrar setlemen son derece gereksiz. Bunlar hem exe boyutunu etkiler, hemde o property lerin eventlerini gereksiz yere tekrar tetikletir.

frmYazdirma kullanırkende,

     if not Assigned(frmYazdirma)then frmYazdirma:= TfrmYazdirma.Create(UniApplication)
     else frmYazdirma.BringToFront;
    frmYazdirma.Yazdir(xxxxxx);
.....
procedure TfrmYazdirma.UniFormDestroy(Sender: TObject);
begin
  frmYazdirma:= nil;
end;
initialization
     frmYazdirma:= nil;
 finalization
    if Assigned(frmYazdirma)then FreeAndNil(frmYazdirma);

benzeri bir şekilde kullanırdım. Yani Session her seferinde bu formu create ettirmezdim. her liste alan hezaman yazdıracak diye bir kural yok. lazım olursa form create edilir, işi bitince close destroy edilir. Bu kullanımda püf nokta, frmYazdirma değişkeninin nerede ve nasıl tanımlandığı. Atıyorum, frmstoklist im var, bu formun private kısmına tanımlanmalı, ve buradan kullanılmalı ki diğer sessionlar yada forumlarla karışmasın.

Kolay gele

Link to comment
Share on other sites

  • Administrators
     if not Assigned(frmYazdirma)then frmYazdirma:= TfrmYazdirma.Create(UniApplication)
     else frmYazdirma.BringToFront;
    frmYazdirma.Yazdir(xxxxxx);
.....
procedure TfrmYazdirma.UniFormDestroy(Sender: TObject);
begin
  frmYazdirma:= nil;
end;
initialization
     frmYazdirma:= nil;
 finalization
    if Assigned(frmYazdirma)then FreeAndNil(frmYazdirma);

Yanlış!

Link to comment
Share on other sites

Merhaba Farshad bey,

Değişkeni record tipinde mainmodule icerisinde tanımladım.

type
  PUserRecord = ^TGenelAyar;
  TGenelAyar = record
   subeno,aktifkullanici:String;
  end;

type
  TUniMainModule = class(TUniGUIMainModule)
  private
    { Private declarations }
    FUserRecord: TGenelAyar;
    function GetUserRecord: PUserRecord;
  public

  property Ayarlar: PUserRecord read GetUserRecord;
end;

kullanım şeklimde: 

 unimainmodule.Ayarlar.subeno := dModul.tblKurum.Fieldbyname('subeno').asString;
Link to comment
Share on other sites

Freeman35 , ben program icesinde formu cagirmadigim surece create edilmiyor diye biliyorum. yanlis mi biliyorum?

if not Assigned(frmYazdirma)then frmYazdirma:= TfrmYazdirma.Create(UniApplication)
Link to comment
Share on other sites

uniGUI'de hiçbir şekilde global variable kullanılmamalı. Buna ihtiyaç da olmamlı.

 

http://www.unigui.com/doc/online_help/index.html?general-design-concept.htm

Benim kastetfiğim, type, const tanımlamaları idi. Ayrıca uygulama içeriğine göre global değişken kullanılabilir. Örnek: Ben firebird ve firedac kullanıyorum, fbclient.dll uygulamada tek olacaksa, yani sadece xx versiyon firebird kullanılacaksa bu glabol değişken olmalı session a ait bir değişken gereksiz. Ben o verdiğin linkten ilk unigui ye başlamadan önce okuduğumda bunu anlamıştım.

 

 

 

     if not Assigned(frmYazdirma)then frmYazdirma:= TfrmYazdirma.Create(UniApplication)
     else frmYazdirma.BringToFront;
    frmYazdirma.Yazdir(xxxxxx);
.....
procedure TfrmYazdirma.UniFormDestroy(Sender: TObject);
begin
  frmYazdirma:= nil;
end;
initialization
     frmYazdirma:= nil;
 finalization
    if Assigned(frmYazdirma)then FreeAndNil(frmYazdirma);

Yanlış!

 

Biz Türk lerde bir söz vardır, daha önce duydun mu bilmiyorum, "lafı ağzından kerpedenle alıyoruz."  Doğrusunu söylemezsen nerden bileceğiz?  delphi nin webinar ında "bana göre" aynı hatayı yapmışsın, herkesin bildiği varsayımıyla yazıyorsun, Kaynak çok kısıtlı, destek keza ona göre çok kısıtlı. hatırlarsan ben unigui yi kullanmak için değil vereceğin destek için satın alıyorum demiştim.

Yanlış deyip, kestirip attığın şey benim kayıt edit/insert  editlerini kullandığım Ata formuma ait, trail sürümü ile yaptığım, harcadığım zamanı saymazsak, lisası aldığımdan buyana aşağı yukarı bir ay gibi bir süredir harcadığım zamanı "Yanlış!"  diye tek bir kelime ile kestirip atman tüm samimiyetimle söylüyorum, bütün şevkimi kırdı.

Link to comment
Share on other sites

  • Administrators

Doğrusunun linkini zaten yukarida vermisim. Ilgili dokumanlara bakarsaniz global variable kullanmanin kesinlikle yapilmamasi gerektigini yazmisiz.

 

Hicbir kutuphane satan yazilim gelistirmeniz konusunda size destek vermez. Cogu firmaya gore biz gene daha fazla sorunlara destek olmaya calisiyoruz.

 

Delphi konusunda Embarcadero'dan dogrudan destek alabiliyor musunuz?

 

Kaynak konusunda eksigimiz baya var ama bu baslik altinda tartisilan konu hakkinda bir eksigimiz yok cunku dokumanlarda yazilim tasarimi ile ilgili takip edilmesi gereken prensipleri detayli olarak yazmisiz.

 

Dokumanlarda Application Design Consideration basligi var. Oraya bakarsaniz bulursunuz.

 

Sent from my SM-N900 using Tapatalk

Link to comment
Share on other sites

  • Administrators

 

Biz Türk lerde bir söz vardır, daha önce duydun mu bilmiyorum, "lafı ağzından kerpedenle alıyoruz."  Doğrusunu söylemezsen nerden bileceğiz?  delphi nin webinar ında "bana göre" aynı hatayı yapmışsın, herkesin bildiği varsayımıyla yazıyorsun, Kaynak çok kısıtlı, destek keza ona göre çok kısıtlı. hatırlarsan ben unigui yi kullanmak için değil vereceğin destek için satın alıyorum demiştim.

 

uniGUI kullanmak için tabiki lisans almanız lazım. Bunun dışında başka bir opsiyonunuz yok zaten. Sizin hangi düzeyde ve hangi ölçüde destek beklediğinizi bilmiyorum. Zaten alırken hangi düzeyde destek verebileceğimizi sanırım anlatmıştım. Takdir ederseniz ki her kullanıcı için tek tek ve birebir bir destek sunmamız asla mümkün değildir. Zaten böyle bir opsyion da yok. Yapmış olduğumuz şey, bize bildirilen hataları toplamak ve zaman içerisinde düzeltmek ve bunu yaparken lisanslı kullanıcılara baya öncelik veriyoruz. Zaten lisansınız yoksa hata raporu açamıyorsunuz. Bunun dışında vermiş olduğumuz destek iyi niyet çerçevesinde verilen bir hizmettir. Bunu farklı şekilde anladıysanız demek ki ben anlatamamışım. Size taahhüt ettiğimiz tek şey 1 yıl boyunca tüm güncellemeleri alacağınızın garantisidir. 

 

 

Yanlış deyip, kestirip attığın şey benim kayıt edit/insert  editlerini kullandığım Ata formuma ait, trail sürümü ile yaptığım, harcadığım zamanı saymazsak, lisası aldığımdan buyana aşağı yukarı bir ay gibi bir süredir harcadığım zamanı "Yanlış!"  diye tek bir kelime ile kestirip atman tüm samimiyetimle söylüyorum, bütün şevkimi kırdı.

 

 

Yanlış deyip kestirdiğim yok. Bir üst giride neden yanlış olduğunun linkini vermişim. Yanlış olan harcadığınız zaman değil, kullandığınız global değişkendir. Global değişkeni alıp MainModule'a koyarsanız düzelecektir.

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...