delphi4arab منتديات دلفي للعرب

نسخة كاملة : مشكل في بناء استعلام أو اجراء متصمن
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله و بركاته


أنا مبتدئ  متشرف بانضمامي إلى المنتدى ...

أواجه مشكلة منذ أسابيع  و لم أفلح  بعد بحثي في إيجاد حل لها . باختصار هي :

لدي قاعدة بيانات بها جدول :  السنوات / الأجر :

أريد فضلا  فصل  الجدول باستعلام أو إجراء متضمن  إلى عدة جداول  - محدودة العدد -

[b]salary   /  year c
.....................  salary /  [b]year_B [/b].....................salary  /  [b]year_A[/b]
[/b]

2005     /   400     ..................... 2006     /   400    ......................2007     /   400   
2005     /   400     ..................... 2006     /   250    ......................2007     /   420 
2005     /   400     ..................... 2006     /   400    ......................2007     /   580
2005     /   400     ..................... 2006     /   400    ......................2007     /   315  
حاولت استخدام  إجراء متضمن بيد أنّى نجحت فقط في  اظهار السنوات  و حدث  خلط كبير في تقسيم  خانة الأجور إلى مكانها  الإجراء كالتالي - مبدئيا يقوم بفصل سنتين - :

كود :
SET TERM ^ ; ALTER PROCEDURE TRY (    IPIC_Y Integer ) RETURNS (    COUNTY1 Integer,    SALARY1 Integer,    COUNTY2 Integer,    SALARY2 Integer ) AS declare variable i integer; --DECLARE VARIABLE variable_name < datatype>; BEGIN --i=0 ; --while (i < 2) do for SELECT  c1.year_bry,c1.somme ,c2.year_bry,c2.somme FROM BRY c1 ,BRY c2 where c1.year_bry =:ipic_y and c2.year_bry =:ipic_y +1     --  for select YEAR_BRY,somme  --   from BRY where bry.YEAR_BRY = :ipic_y  /* write your code here */     into :county1,SALARY1,county2,SALARY2

و شكرا

عفوا  أظنني بترت جزءا من الكود    Blush    و هاهو  الكود كاملا  :

كود :
SET TERM ^ ; ALTER PROCEDURE TRY (    IPIC_Y Integer ) RETURNS (    COUNTY1 Integer,    SALARY1 Integer,    COUNTY2 Integer,    SALARY2 Integer ) AS declare variable i integer; --DECLARE VARIABLE variable_name < datatype>; BEGIN --i=0 ; --while (i < 2) do for SELECT  c1.year_bry,c1.somme ,c2.year_bry,c2.somme FROM BRY c1 ,BRY c2 where c1.year_bry =:ipic_y and c2.year_bry =:ipic_y +1     --  for select YEAR_BRY,somme  --   from BRY where bry.YEAR_BRY = :ipic_y  /* write your code here */     into :county1,SALARY1,county2,SALARY2        Do  begin  --county = :ipic_y ;  county1 = :ipic_y  ;   -- i=i+1;  SUSPEND;  end  end^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE TRY TO  SYSDBA;
يمكنني بكل سرور إعادة صياغة السؤال و البسط أكثر في حال كان الاستفسار غير مفهوم ،
هذه صورة توضيحية  لما أقصده ، و كل هذا العناء فقط من أجل بناء dataset  واحدة
أستخدمها  في التقرير في band  واحد ,

[صورة: 8584902016.png]
السلام عليكم

لماذا لا تستعمل ثلاثة إستعامات ؟ لكل واحد يحتوي شرط السنة
(01-04-2016, 11:33 PM)لؤي كتب : [ -> ]السلام عليكم

لماذا لا تستعمل ثلاثة إستعامات ؟ لكل واحد يحتوي شرط السنة

و عليكم السلام و رحمة الله و بركاته

شكرا أستاذ لؤي على الاطلاع

ثلاث استعلامات =  ثلاث داتا ست
 المشكل أنّ  شكل الجداول بعد تحيينها للطباعة  يجب أن يكون عمودي  كل جدول سنة يجانب الجدول الذي يليه ... إلى غاية 5 جداول .
و  التقرير يقبل  داتا سات واحدة في الباند الواحد ، فلو كان إظهار الجداول بشكل عمودي لزال اللبس  باستخدام الطريقة التى تفضلتم بها .

ما أحتاجه و  عجزت عن تطبيقه هو استعلام ديناميكي أو إجراء متضمّن  أو  ربما  PIVOT  Huh  و التي لا فكرة لدي عن ماهيته
يقوم  إعادة ترتيب الجدول الذي أملك فيه المعطيات و الذي هو :
  year  | salary
......................  
   120  |  2005   
......................
  140   | 2005
......................
  150   | 2006
......................
   180  | 2006
...................
 188    | 2007
......................
   150  | 2007
......................
        

 إلى الشكل :
  year1|salary |year2|salary | year3|salary
  ..................................................................
    188 |  2007| 150    | 2006|   120  |2005
  ..................................................................
     150 |  2007| 180   | 2006|   140  |2005
.....................................................................

ما قصدته بالفصل  ليس  بالمعنى أن كل جدول منفصل عن الآخر بل اعادة الترتيب بهذا الشكل الأخير .

* استعلام ديناميكي : لأنّ السنوات 05 :
   ,min(year) +4   ..   min(year)
السلام عليكم
ممكن ذلك بإستعمال Case الإستعلام التالي مجرب على Oracle :

Select (case year When 2005 Then Salary  Else null END) Year1,(case year When 2006 Then Salary  Else null END) Year2,(case year When 2007 Then Salary  Else null END) Year3 from My_table
(03-04-2016, 10:53 AM)لؤي كتب : [ -> ]السلام عليكم
ممكن ذلك بإستعمال Case الإستعلام التالي مجرب على Oracle :

Select (case year When 2005 Then Salary  Else null END) Year1,(case year When 2006 Then Salary  Else null END) Year2,(case year When 2007 Then Salary  Else null END) Year3 from My_table

و عليكم السلام و رحمة الله و بركاته

الطريقة جديدة علي و أول فرصة أغنم بها منكم .
جربتها  على الفايربيرد  و كانت النتيجة   مذهلة  ، سحقت دهاليز التعقيدات  التي كنت بصدد الغوص فيها  و التي قد لا تؤدي إلى نتيجة .
فقط لاحظت أن كل جدول يتكرر 4 مرات   حتى و إن جرّبت  السنة نفسها (ربما لأن عدد السنوات 04 ) رغم ذلك لم أكن لأطمع بأكثر من هذا.

جزاك الله كل خير و بارك الله لك في علمك  استاذ لؤي