mehmet07 Posted July 20, 2017 Posted July 20, 2017 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; Quote
Freeman35 Posted July 20, 2017 Posted July 20, 2017 Merhaba, bu daha kesin çözüm sanırım repeat rxPDFExport1.FileName := UniServerModule.NewCacheFileUrl(False, 'pdf', '', '', AUrl); until FileExists(rxPDFExport1.FileName ); Quote
mehmet07 Posted July 20, 2017 Author Posted July 20, 2017 Teşekkür ederim Freema35 ellerine saglik. Quote
Administrators Farshad Mohajeri Posted July 20, 2017 Administrators Posted July 20, 2017 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. Quote
Freeman35 Posted July 21, 2017 Posted July 21, 2017 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); Quote
mehmet07 Posted July 21, 2017 Author Posted July 21, 2017 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. Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 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. Bu değişkeni ne şekilde tanımladınız? İlgili kodu buraya yazabilir misiniz? Quote
Freeman35 Posted July 21, 2017 Posted July 21, 2017 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 Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 "ben" karıştırmamak adına global olacak tanımlamaları Servermodule de tanımlıyorum. 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 Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 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ış! Quote
mehmet07 Posted July 21, 2017 Author Posted July 21, 2017 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; Quote
mehmet07 Posted July 21, 2017 Author Posted July 21, 2017 Freeman35 , ben program icesinde formu cagirmadigim surece create edilmiyor diye biliyorum. yanlis mi biliyorum? if not Assigned(frmYazdirma)then frmYazdirma:= TfrmYazdirma.Create(UniApplication) Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 dModul nedir? Quote
mehmet07 Posted July 21, 2017 Author Posted July 21, 2017 Her modulun database bilesenlerini ayri datamodullerde tutuyorum. Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 datamodule'ler uniGUI'nın dataModuleleri mi? Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 O zaman uygulamanızda bir sorun olmaması lazım. Rapor oluştururken doğru parametleri mi gönderiyorsunuz? Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 Lütfen bizdeki fastReport örneklerine bakın ve birebir onun gibi yapmaya çalışın. Bir de dokümanlardaki FastReport ile ilgili bölümü okuyun ve orada yazılanları uygulayın. Quote
mehmet07 Posted July 21, 2017 Author Posted July 21, 2017 Dokumanları bastan sona bir kac defa okumustum. Tekrar demoları ve dokumanları inceleyeyim.Gözden kaçırdığım birsey olabilir. İlginize tesekkurler. Quote
Freeman35 Posted July 21, 2017 Posted July 21, 2017 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ı. Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 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 Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 frmYazdirma'nin global bir variable oldugunu ve bunun yanliş oldugunu belirtmişim. Tam olarak ne yazmami bekliyordunuz? Sent from my SM-N900 using Tapatalk Quote
Administrators Farshad Mohajeri Posted July 21, 2017 Administrators Posted July 21, 2017 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. Quote
Administrators Farshad Mohajeri Posted July 23, 2017 Administrators Posted July 23, 2017 Dokumanları bastan sona bir kac defa okumustum. Tekrar demoları ve dokumanları inceleyeyim.Gözden kaçırdığım birsey olabilir. İlginize tesekkurler. Özellikle burası önemli: http://www.unigui.com/doc/online_help/index.html?important-notes-on-fastreport-.htm Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.