الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حلقات البرنامج الى حلقات الـT-SQL

بدأه الحلفاوي في 12 فبراير 2012 · 10 رد · 657 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا هو السؤال ... ارجو مساعدتي في فهم سطور البرنامج قدر المستطاع

        Search_Departments_set.Active := False;
       Search_Departments_set.CommandText := 'Select Distinct dept_id from rank_upgrading ';
       Search_Departments_set.Active := True;
       while not(Search_Departments_Source.DataSet.Eof) do
           begin
           Upgrade_rule_set.Active := False;
           Upgrade_rule_set.CommandText := 'Select Distinct dept_id ,Job_ID,Qualify_ID from rank_upgrading where Dept_id ='''+Search_Departments_set.Fields[0].AsString+'''  ';
           Upgrade_rule_set.Active := True;
//           Upgrade_rule_set.First;
           Btn_UG_Search.Enabled := False;
//---------------------------------------------------------------------------------------------------
           while not(Upgrade_rule_Source.DataSet.Eof) do
              begin //and DateDiff(Day,Last_RankUpgrade,getDate()) between '''+SpinEdit1.Text+''' and '''+SpinEdit2.Text+'''
               Ranks_set.Active := False;
               Ranks_set.CommandText := 'select Qualify_ID ,Years,From_Rank_Id from Rank_upgrading where Dept_id ='''+Search_Departments_set.Fields[0].AsString+''' and Job_ID ='''+Upgrade_rule_set.Fields[1].AsString+''' and Qualify_ID='''+Upgrade_rule_set.Fields[2].AsString+'''  ';
               Ranks_set.Active := True;
//     Ranks_set.Next;
               while not(Ranks_Source.DataSet.Eof) do
                  begin
              Matched_record_set.Active := False;
              if RU_RadioButton1.Checked then   //and DateDiff(day,Last_RankUpgrade,getDate()) <= 31 ---and Emp_rank ='''+Ranks_set.Fields[2].AsString+'''
                 Matched_record_set.CommandText := 'Select Job,Emp_ID ,emp_rank ,Department,ABS(datePart(dd,GetDate())- datePart(dd,Last_RankUpgrade)) As "Days remained",Qualify_ID ,'''+Ranks_set.Fields[
                   1].AsString+''' As Date_Match ,Last_RankUpgrade,Emp_name from Employees_Info where Department ='''+Search_Departments_set.Fields[0].AsString+''' and Job ='''+Upgrade_rule_set.Fields[
                   1].AsString+''' and Qualify_ID ='''+Ranks_set.Fields[0].AsString+''' and Emp_rank ='''+Ranks_set.Fields[2].AsString+'''  and DateDiff(Year,Last_RankUpgrade,getDate()) = '''+Ranks_set.Fields[1].AsString+''' and datePart(dd,Last_RankUpgrade) - datePart(dd,GetDate()) between '''+IntToStr(RU_SpinEdit1.Value)+''' and '''+IntToStr(RU_SpinEdit2.Value)+''' and ABS(Cast(month(GetDate()) - month(Last_RankUpgrade)as int))=0  '
                   else

انظر الى التداخل الذي قمت به لحل المسالة وهي الآن تعمل كما يجب ولكن يعيبه البطء , لان مثل هكذا حلول للبرنامج قد تكون غير مناسبة عندما تعالج بيانات ضخمة

الذي اريده هو Creating dynamic cursor يستقبل امر البحث من البرنامج ثم تكون هنالك عدة كيرسورات متداخلة , كل واحد منهم يتم تفيذه في حلقة بعدد سجلات الكيرسور الخارجي وهكذا, ثمة شيئ آخر يجعل من حل المسألة عن طريق الـT-SQL اجدى ذلك لانه لايمكن امرار التاريخ من البرنامج عندما تستخدم الدالة DateDiff فقط يمكن ذلك عبر البراميترز الخاصة بالكيرسور او الاجراءات المخزنة

ارجو ان تكون الفكرة واضحة الطرح

..

..

بوركتم وجوزيتم خيرا

#2

السلام عليكم.

أخي يبدو أن الكود ليس كاملا, فآخر تعليمة هي else !

#3
Adel Khayata كتب:

السلام عليكم.

أخي يبدو أن الكود ليس كاملا, فآخر تعليمة هي else !

اليك بالكامل مع خالص التحة يا خياطة

        Begin
       Search_Departments_set.Active := False;
       Search_Departments_set.CommandText := 'Select Distinct dept_id from rank_upgrading ';
       Search_Departments_set.Active := True;
       while not(Search_Departments_Source.DataSet.Eof) do
           begin
           Upgrade_rule_set.Active := False;
           Upgrade_rule_set.CommandText := 'Select Distinct dept_id ,Job_ID,Qualify_ID from rank_upgrading where Dept_id ='''+Search_Departments_set.Fields[0].AsString+'''  ';
           Upgrade_rule_set.Active := True;
//           Upgrade_rule_set.First;
           Btn_UG_Search.Enabled := False;
//---------------------------------------------------------------------------------------------------
           while not(Upgrade_rule_Source.DataSet.Eof) do
              begin //and DateDiff(Day,Last_RankUpgrade,getDate()) between '''+SpinEdit1.Text+''' and '''+SpinEdit2.Text+'''
               Ranks_set.Active := False;
               Ranks_set.CommandText := 'select Qualify_ID ,Years,From_Rank_Id from Rank_upgrading where Dept_id ='''+Search_Departments_set.Fields[0].AsString+''' and Job_ID ='''+Upgrade_rule_set.Fields[1].AsString+''' and Qualify_ID='''+Upgrade_rule_set.Fields[2].AsString+'''  ';
               Ranks_set.Active := True;
//     Ranks_set.Next;
               while not(Ranks_Source.DataSet.Eof) do
                  begin
              Matched_record_set.Active := False;
              if RU_RadioButton1.Checked then   //and DateDiff(day,Last_RankUpgrade,getDate()) <= 31 ---and Emp_rank ='''+Ranks_set.Fields[2].AsString+'''
                 Matched_record_set.CommandText := 'Select Job,Emp_ID ,emp_rank ,Department,ABS(datePart(dd,GetDate())- datePart(dd,Last_RankUpgrade)) As "Days remained",Qualify_ID ,'''+Ranks_set.Fields[
                   1].AsString+''' As Date_Match ,Last_RankUpgrade,Emp_name from Employees_Info where Department ='''+Search_Departments_set.Fields[0].AsString+''' and Job ='''+Upgrade_rule_set.Fields[
                   1].AsString+''' and Qualify_ID ='''+Ranks_set.Fields[0].AsString+''' and Emp_rank ='''+Ranks_set.Fields[2].AsString+'''  and DateDiff(Year,Last_RankUpgrade,getDate()) = '''+Ranks_set.Fields[1].AsString+''' and datePart(dd,Last_RankUpgrade) - datePart(dd,GetDate()) between '''+IntToStr(RU_SpinEdit1.Value)+''' and '''+IntToStr(RU_SpinEdit2.Value)+''' and ABS(Cast(month(GetDate()) - month(Last_RankUpgrade)as int))=0  '
                   else
                        Matched_record_set.CommandText := 'Select Job,Emp_ID ,emp_rank ,Department,ABS(datePart(mm,GetDate())- datePart(mm,Last_RankUpgrade)) As "Monthes remained",Qualify_ID ,'''+Ranks_set.Fields[
                        1].AsString+''' As Date_Match ,Last_RankUpgrade,Emp_name from Employees_Info where Department ='''+Search_Departments_set.Fields[0].AsString+''' and Job ='''+Upgrade_rule_set.Fields[
                        1].AsString+''' and Qualify_ID ='''+Ranks_set.Fields[0].AsString+''' and Emp_rank ='''+IntToStr(Ranks_set.Fields[2].AsInteger)+'''  and DateDiff(Year,Last_RankUpgrade,getDate()) = '''+IntToStr(Ranks_set.Fields[1].AsInteger)+''' and datePart(mm,Last_RankUpgrade)-' +
                       ' datePart(mm,GetDate()) between '''+IntToStr(RU_SpinEdit1.Value)+''' and '''+IntToStr(RU_SpinEdit2.Value)+'''  ';

              Matched_record_set.Active := True;
//         ShowMessage('Found records : '+IntToStr(Matched_record_set.RecordCount));
                   if Matched_record_set.RecordCount <> 0 then
                      Begin
                      while not(Matched_record_Source.DataSet.Eof) do
                         begin         //Upgrade_YAalawat_LastServe_DateMatch
                         if RU_RadioButton1.Checked then
                            ADOCommand1.CommandText := 'Insert into Upgrade_YAalawat_LastServe_DateMatch values('''+Matched_record_set.Fields[0].AsString+''','''+Matched_record_set.Fields[1].AsString+''','''+Matched_record_set.Fields[2].AsString+''','''+Matched_record_set.Fields[3].AsString+''',2,'''+IntToStr(Matched_record_set.Fields[2].AsInteger-1)+''',1,'''+FormatDateTime('yyyy-mm-dd',Now)+''','''+Matched_record_set.Fields[4].AsString+''','''+Matched_record_set.Fields[5].AsString+''' ,'''+Ranks_set.Fields[1].AsString+''','''+FormatDateTime('yyyy-mm-dd',Matched_record_set.Fields[7].AsDateTime)+''',0 ) '
                            Else
                               ADOCommand1.CommandText := 'Insert into Upgrade_YAalawat_LastServe_DateMatch values('''+Matched_record_set.Fields[0].AsString+''','''+Matched_record_set.Fields[1].AsString+''','''+Matched_record_set.Fields[2].AsString+''','''+Matched_record_set.Fields[3].AsString+''',2,'''+IntToStr(Matched_record_set.Fields[2].AsInteger-1)+''',1,'''+FormatDateTime('yyyy-mm-dd',Now)+''','''+Matched_record_set.Fields[4].AsString+''','''+Matched_record_set.Fields[5].AsString+''' ,'''+IntToStr(Ranks_set.Fields[1].AsInteger)+''','''+FormatDateTime('yyyy-mm-dd',Matched_record_set.Fields[7].AsDateTime)+''',1 ) ';
                            ADOCommand1.Execute;
               //--------------------------------------------------------------
                         Upgrade_Grid_display_set.Active := False;
                         Upgrade_Grid_display_set.Active := True;
                         DBGrid_Upgrades.Refresh;
                         DBGrid_Upgrades.Repaint;
               //--------------------------------------------------------------
               //
//                          Sleep(1000);
                          Matched_record_set.Next;
                         end;
                      end;
//                  Sleep(700);
                  Ranks_set.Next;
                  end;
////---------------------------------------------------------------------------------------------------
                 Upgrade_rule_set.Next;
              End;
              Search_Departments_set.Next;
           End;
         Btn_UG_Search.Enabled := True;
       end;
   except
    Btn_UG_Search.Enabled := True;
   end;

لا تركز شديد في الكود

#4

أنا آسف أخي: يبدو أنني أسأت فهم ماتريد :S

هل تريد شرح الكود ؟ أم تريد تحويله إلى SQL Server Cursors أم تريد معلومات عامة عن ال Cursors ؟

#5
Adel Khayata كتب:

أنا آسف أخي: يبدو أنني أسأت فهم ماتريد :S

هل تريد شرح الكود ؟ أم تريد تحويله إلى SQL Server Cursors أم تريد معلومات عامة عن ال Cursors ؟

لا ليس هذا ما اقصده بالسطر الاخير والعلامة وانما استحيت من ركاكة (ربما) اوامر السيكوال فوضعت لك هذه الـتنبيه .....

اما الخيارين الاخيرين فهما بيت القصيد عندي غير ان التحويل SQL Server Cursor هو ما اريد اتقانه لتلافي مثل ما رايته من الشفرة التي احسن ما يقال فيها انها ركيكة ومفككة الاوصال

لا ابالغ لو قلت لا اجد ما اشكرك به فتقبل ثنائي المتواضع لكم .......... لك عند الله الأخير والابقى

اخوك الحلفاوي

#6

أخي: طيب ممكن تبدأ بقراءة المقالة

و هذا المثال

و إذا كان عندك أي استفسار أو ايضاح فأنا جاهز إن شاء الله.

#7
Adel Khayata كتب:

أخي: طيب ممكن تبدأ بقراءة المقالة

و هذا المثال

و إذا كان عندك أي استفسار أو ايضاح فأنا جاهز إن شاء الله.

اشكرك جداً

الفكرة وضحت وان لم استخدمها بعد فهذا المثال هو المراد بالضبط , ولكن بالعودة الى برنامجي فان الترقية تحسب بالمقارنة مع تاريخ الحاسوب فاذا اردنا تاريخ باختيار المستخدم سيعني ذلك استقبال براميتر من النوع DateTime من البرنامج فهل هنالك طريقة

للاعلان عن الاجراء باستخدام التحميل الزائد؟

هب ان شخصاً كان من المفترض ان يكتشف تاريخ ترقيته اليوم ولم يتم ذلك (وان كان هنالك خيارين في البرنامج لاكتشاف عدد الايام/الشهر حتى تاريخ الترقيه) ما الامر المناسب لاكتشاف مثل هذه الحاله مثال لهذه الحاله ان يضاف سجل الموظف بعد التاريخ الموافق لترقيته بحيث انه لو كان قد اضيف قبل ذلك لاكتشفه النظام ضمن الاسماء التي استوفت الترقية

#8

السلام عليكم ............

هذا هو الكود الذي كتبته مع سطر التنفيذ

 ALTER PROCEDURE [dbo].[Upgrade_Date_Checker_SysDate]
	-- Add the parameters for the stored procedure here
(@ByDays_Monthes_Remaind int,
@LowLimitSpin int,
@MaxLimitSpin int)
as
Begin

declare	@Dept_ID int, 
            @Job_ID int , 
            @Qualify_ID int ,
            @Years int,
            @From_Rank_Id int;
-- Create first cursor here
declare  GetDeparts cursor for
Select Distinct dept_id from rank_upgrading order by dept_id

open  GetDeparts

fetch next from GetDeparts into  @Dept_ID
while @@Fetch_Status = 0    
BEGIN
-- Create second cursor here
      DECLARE Upgrade_rule CURSOR FOR 
      Select Distinct dept_id ,Job_ID,Qualify_ID from rank_upgrading where Dept_id = @Dept_ID;  -- Variable value from the outer cursor

      OPEN Upgrade_rule;
       FETCH NEXT FROM Upgrade_rule INTO @dept_id ,@Job_ID,@Qualify_ID;
        while @@fetch_status = 0
        Begin
---------Create inner most cursor ------------------------------------------------
              Declare GetRanks cursor for
              select Qualify_ID ,Years,From_Rank_Id from Rank_upgrading where Dept_id =@dept_id and Job_ID =@Job_ID and Qualify_ID=@Qualify_ID;
              Open GetRanks;
              FETCH next from GetRanks into @Qualify_ID ,@Years,@From_Rank_Id;
              While @@fetch_status = 0
               Begin
               if (@ByDays_Monthes_Remaind = 0)       -- By day remainds code here--------------------------------------
                    Select Job,Emp_ID ,emp_rank ,Department,ABS(datePart(dd,GetDate())- datePart(dd,Last_RankUpgrade)) As "Days remained",Qualify_ID ,@Years As Date_Match ,
                    Last_RankUpgrade,Emp_name from Employees_Info where Department =@dept_id and Job =@Job_ID and Qualify_ID =@Qualify_ID and Emp_rank =@Years  and Emp_rank = @From_Rank_Id 
                    and DateDiff(Year,Last_RankUpgrade,getDate()) = @Years  and datePart(dd,Last_RankUpgrade) - datePart(dd,GetDate()) between @LowLimitSpin and @MaxLimitSpin and ABS(Cast(month(GetDate()) - month(Last_RankUpgrade)as int))=0  

               else  ------------------------------------------------- By monthes remainds code here---------------------------------
                       Select Job,Emp_ID ,emp_rank ,Department,ABS(datePart(mm,GetDate())- datePart(mm,Last_RankUpgrade)) As "Monthes remained",Qualify_ID ,@Years As Date_Match
                       ,Last_RankUpgrade,Emp_name from Employees_Info where Department =@dept_id and Job =@Job_ID and Qualify_ID =@Qualify_ID and Emp_rank =@From_Rank_Id  
                       and DateDiff(Year,Last_RankUpgrade,getDate()) = @Years and datePart(mm,Last_RankUpgrade)- datePart(mm,GetDate()) between @LowLimitSpin and @MaxLimitSpin ;         


                FETCH next from GetRanks into @Qualify_ID ,@Years,@From_Rank_Id;          
               End;
--   Deallocate cursor----------------------------------------------------------------
             close  GetRanks;
             Deallocate GetRanks; 

             FETCH NEXT FROM Upgrade_rule INTO @dept_id ,@Job_ID,@Qualify_ID;
         End;
--   Deallocate cursor----------------------------------------------------------------
      close  Upgrade_rule;
      Deallocate Upgrade_rule; 


--------------------------Fetch next outer cursor---------------------------------  
fetch next from GetDeparts into  @Dept_ID
--------------------------------------------------------------------------------------------       
END
--   Deallocate cursor----------------------------------------------------------------
close  GetDeparts;
Deallocate GetDeparts; 
--------------------------------------------------------------------------------------------         
end

Exec Upgrade_Date_Checker_SysDate 0,1,12

هاهي رسالة الـCompiling

 Command(s) completed successfully.

ولكن عند امرار المتغيرات يعطي هذه الرساله

 Msg 217, Level 16, State 1, Procedure Upgrade_Date_Checker_SysDate, Line 73
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.

فماذا افعل ؟

اخوك

تم تعديل هذه المشاركة بواسطة الحلفاوي في 13 فبراير 2012 في 18:18

#9

بالنسبة للخطأ اعتقد انك نسيت ان تضع GO قبل Exec Upgrade_Date_Checker_SysDate 0,1,12 لذا فقد احتسبت مع البروسيجر .

ولم افهم عليك بالضبط لم لم تستخدم جمل t-sql بدلا من استخدام ال Cursors فهل من الممكن توضيح الخطوات التي تقوم بها ؟

#10
اقتباس
بالنسبة للخطأ اعتقد انك نسيت ان تضع GO قبل Exec Upgrade_Date_Checker_SysDate 0,1,12 لذا فقد احتسبت مع البروسيجر .

أعتقد أن كلام الأخ طارق منطقي فعدم وضع GO جعل من تعليمة Exec Upgrade_Date_Checker_SysDate 0,1,12 جزء من الاجراء مما جعله تعاودياً بدون نهاية و سبب رسالة الخطأ.

#11

السلام عليكم

اشكر لكما التفاعل ولكنني اعدكما بفتح هذه المشاركه للتداول حولها حتى اخلص الى اتقان الكيرسور , واضح من سؤال الاخ الفاضل طارق انني بحاجة فعلاً الى بناء قاعدة اساسية للتعامل مع الاوامر بشكل جيد ومن ثم السؤال عن الامور المعقدة

وساعمل على تمكين هذه القاعدة في هذه المرحلة

شكر الله لكما واجزل

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…