Saturday, February 5, 2011

انشاء تقرير في كرستال ريبورت باستخدام الاجراءات المخزنة

اذا احتجت لانشاء تقرير في كرستال ريبورت وهذا التقرير يحتوي على بيانات قليلة فغالبا لن تواجهك مشكلة في الآداء، ولكن ماذا لو كانت الشبكة بطيئة بين الخادم الذي يتم عليه انتاج التقرير وبين قاعدة البيانات؟

اذا استخدمت query في كرستال ريبورت ثم استخدمت فلتر فهذا يعنى ان البيانات سيتم نقلها كلها بين الخادمين ثم تتم الفلترة وربما يؤثر على سرعة الشبكة، الحل اما استخدام view للحصول على البيانات ثم انشاء التقرير بالاتصال به، أما الحل الافضل فهو استخدام اجراء مخزن يمكنك من تعريف عامل parameter أو اكثر مع نقل البيانات اللازمة لانتاج التقرير على الشبكة وليس كل بيانات الجدول.
أول خطوة هي انشاء حزمة package لتعريف نوع البيانات التي سيتم امرارها للاجراء المخزن كالتالي:

 Create or Replace package Report_Package as  
 type Staging_Report_Rec_Type IS RECORD  
 ( csvaction stgstagings.csvaction%TYPE,  
 stagingstatus stgstagings.stagingstatus%TYPE,  
 sourceofdata stgstagings.sourceofdata%TYPE,  
 windowsloginname stgstagings.windowsloginname%TYPE,  
 staffnumber stgstagings.staffnumber%TYPE,  
 divisioncode stgstagings.divisioncode%TYPE,  
 sectioncode stgstagings.sectioncode%TYPE,  
 requestedby stgstagings.requestedby%TYPE,  
 oim_status stgstagings.oim_status%TYPE,  
 notifyITSD stgstagings.notifyITSD%TYPE,  
 eformnumber stgstagings.eformnumber%TYPE,  
 eformfilename stgstagings.eformfilename%TYPE,  
 uploaddatetime stgstagings.uploaddatetime%TYPE,  
 lastupdatedatetime stgstagings.lastupdatedatetime%TYPE  
 );  
 TYPE Staging_Report_type is ref cursor return Staging_Report_Rec_Type;  
 end Report_Package;  

وبهذا يكون قد تم تعريف النوع Staging_Report_Type
الخطوة التالية هى انشاء الاجراء المخزن كالتالي ويتم تعريف عاملين احدهما هو الكرسر cursor الذي سيحتوي على البيانات والآخر هو عامل وقت يقوم المستخدد بادخاله عند انشاء التقرير:

 Create or Replace procedure Report_Newer  
 (Older_Rec_Cur IN OUT report_package.Staging_Report_Type,  
 CutOffDate IN stgstagings.uploaddatetime%TYPE)  
 as  
 begin  
 open Older_Rec_Cur for  
 select csvaction, stagingstatus, sourceofdata, windowsloginname, staffnumber, divisioncode, sectioncode, requestedby, oim_status, notifyITSD, eformnumber, eformfilename,uploaddatetime, lastupdatedatetime from stgstagings  
 where uploaddatetime >= CutOffDate order by windowsloginname asc, uploaddatetime desc;  
 END Report_Newer;  

No comments:

Post a Comment