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

حلقات تكرارية

مغلق
بدأه صاحب همة في 24 أبريل 2005 · 11 رد · 812 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي سؤالان آمل أن يجدا اجابة لديكم:

الاول: أني أريد أن أقوم بعملية ادخال لبيانات معينة بشكل متكرر ، أي أن العدد معروف مسبقاُ، هل هناك امكانية لاستخدام حلقة مثل for ,whileفي داخل اجراء في قاعدة البيانات ؟؟

سؤالي الثاني : اذا قمت بعمل اجراء في قاعدة البيانات ، هل يمكن استدعاؤه من الكود ..

مع جزيل الشكر..

من لمح فجر الأجر هان عليه ظلام التكليف

#2

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

بالنسبة للسؤال الأول فإجابته نعم ، وابحث في ملف تعليمات SQL Server عن كلمة while وقطعاً ستجد أمثلة إن شاء الله

أما السؤال الثاني فإجابته هي نعم أيضاً ، ولكن ما هي لغة البرمجة التي تستخدمها ؟

#3

جزاك الله خيرأ أخي..

بالنسبة للغة البرمجة هي VB 6.0

وأيضا هل هناك امكانية لاعطاء قيم أقوم بتكوينها داخل الاجراء بدلا من قيم ثايتة ، مثلا أقوم بتشكيل التاريخ بناء على شرط معين ثم أدخل القيمة الناتجة الى الجدول

 insert into date_table ( cast @date_str as date)

فأخذت رسالة أن الادخال غير صحيح ، ماهي الطريقة الصحيحة لذلك..

من لمح فجر الأجر هان عليه ظلام التكليف

#4

عفوا

قمت بتشكيل قيمة المتغير كالتالي:

    set @date_str=@day+'/'+@month+'/'+@Intered_Year
        insert into date_table ( cast @date_str as datetime)

وكل من المتغيرات الموجودة بعد اشارة المساواة هي أرقام لليوم والشهر والسنة

من لمح فجر الأجر هان عليه ظلام التكليف

#5

وإياكم

هذا مثال كما تريد

declare @date_str datetime

declare @day varchar(2)
declare @month varchar(2)
declare @Intered_Year varchar(4)


set @day=30
set @month=12
set @Intered_Year=2000

set @date_str = @month+'/'+@day+'/'+@Intered_Year

لاحظ أن التاريخ يكون على هذه الهيئة ، أي يبدأ بالشهر وليس باليوم (mm/dd/yyyy)

وفي هذا الكود التحويل يتم تلقائياً

بالنسبة لكيفة الاتصال بال sp عن طريق vb6 جرب البحث في المنتدى الخاص بها وأكيد ستجد أمثلة إن شاء الله

وفقك الله تعالى للخير

#6

أسأل الله أن يجعل ذلك في ميزان حسناتك ، وكرمك أطمعني أن أسالك المزيد أخي محمد فعفوا أن ألححت عليك.. :rolleyes:

أخي الكريم استخدمت ماسبق في عمل اجراء يقوم بادخال أيام سنة معطاة وكان ما كتبته كما يلي :

CREATE PROCEDURE Insert_One_Year
 @Intered_Year int
 as
   declare   @month int 
   declare @day int
   declare @date_str varchar(20)
  
  set @month=1
  set @day=1 
  while @month<12

begin
if (@month=1) or (@month=3) or  (@month=5) or (@month=7) or  (@month=8) or (@month=10) or   (@month=12) 
begin 
while @day<=31
begin
                    set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)
                    insert into date_table values( @date_str )
          set    @day=@day+1
end    
 set    @month=@month+1  
 end    

if (@month=4) or (@month=6) or  (@month=9) or (@month=11) 
begin 
while @day<=30
begin
set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)
insert into date_table values( @date_str )
set    @day=@day+1
end    
set    @month=@month+1  
end

if (@month=2)
begin 
while @day<=28
begin
          set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)
                    insert into date_table values( @date_str )
          set    @day=@day+1
end    
 set    @month=@month+1  
end        
end
GO

كانت النتيجة أن الادخال حصل فقط للشهر 1 ، منطقيا أظن أن تسلسل الفكرة صحيح..لكن هناك خطأ عجزت عن معرفته..وأكون ممتنا ان وجدت الوقت لذلك..

من لمح فجر الأجر هان عليه ظلام التكليف

#7

بسم الله الرحمن الرحيم

بارك الله فيك وتقبل منا ومنكم صالح الأعمال ، وتجاوز عن خطايانا اللهم آمين

المشكلة تكمن في المتغير @day فبعد أول دورة يكون قد امتليء بالقيمة العظمى المحددة والتي تجعل الشرط يتحقق وبذلك يتم الهروب من الدورة وينتقل لدورة الشهر ، والحل هنا هو إعادة تعبئة المتغير @day بقيمة ابتدائية وهي الرقم 1

عموماً قمت بعمل تغيرات بسيطة على الكود وأسأل الله أن ينفعك به

ولكن أحب التنويه أن هذا الكود يصلح ككود تعليمي وليس كود عملي وهذا ستعرفه مع مرور الوقت والتمرس :)

الكود :

CREATE PROCEDURE Insert_One_Year
@Intered_Year int
as
declare @month int
declare @day int
declare @date_str varchar(20)
set @Intered_Year = 2003
set @day=1
set @month=1

declare @maxday int

if (@month=1) or (@month=3) or  (@month=5) or (@month=7) or  (@month=8) or (@month=10) or   (@month=12)
  begin
    set @maxday = 31
  end 
if (@month=4) or (@month=6) or  (@month=9) or (@month=11)
  begin
     set @maxday = 30
  end
if (@month=2)
  begin
     set @maxday = 28
  end

while @month<=12

	begin 
  while @day<=@maxday
        begin
         	 set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)
         	 insert into date_table values( @date_str )
         	 set @day=@day+1
        end    
        set @month=@month+1 
                        set @day=1
         end
GO

وفقك الله تعالى للخير

#8

جزاك الله خير أخي جربت ماكتبت وأعطى النتيجة المطلوبة ، لكن هناك أمر أرجو أن التكرم بتوضيحه : أليس من المفروض أن يتم اعطاء قيمة الحد الاقصى من الايام للشهر داخل الدورة

، بحيث يفحص عند كل زيادة لعداد الشهر ويحدد عدد الايام بناء على ذلك ..لكن ما أراه أن الفحص تم مسبقا وحسب المنطق البرمجي أن القيمة ستسند مرة واحدة للمتغير ، وبعدها لن يمر عليه .. فما هو الشي الذي التبس علي فهمه..

من لمح فجر الأجر هان عليه ظلام التكليف

#9

جزاك الله خيراً على التنبيه

فعلا هناك خطأ ، سامحني فالكود كتبته على عجالة وأنا يومين لم أنم :wacko:

أرجو أن يكون هذا صحيحاً

CREATE PROCEDURE Insert_One_Year
@Intered_Year int
as
declare @month int
declare @day int
declare @date_str varchar(20)
set @day=1
set @month=1

declare @maxday int

while @month<=12
begin
if (@month=1) or (@month=3) or  (@month=5) or (@month=7) or  (@month=8) or (@month=10) or   (@month=12)
 begin
   set @maxday = 31
 end
if (@month=4) or (@month=6) or  (@month=9) or (@month=11)
 begin
    set @maxday = 30
 end
if (@month=2)
 begin
    set @maxday = 28
 end
 while @day<=@maxday
       begin
          set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)
          insert into date_table values( @date_str )
          set @day=@day+1
       end    
       set @month=@month+1
       set @day=1
       end
#10

جزاك الله خيراً أخي .. وبارك الله فيك وكتب أجرك ..

أمر أرجو أن يكون آخر شيء يتعلق بهذا الموضوع..وهو ادخال التاريخ: أخبرتني أن ادخال التاريخ يجب أن يكون على الصيغةmm/dd/yyyy لكن ماوجدته أن التخزين حصل بصيغةdd/mm/yyyy هل هذا أمر ثابت ان الادخال يكون دائما بهذا الشكل والتخزين يكون بالشكل الآخر أم ماذا؟؟؟

من لمح فجر الأجر هان عليه ظلام التكليف

#11

مسألة التاريخ من المسائل المتشابكة في SQL

ولم أتطرق فيما سبق للتحويل لكن انظر معي

جرب أن تستبدل السطر

set @date_str=cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar)

بالسطر :

set @date_str=CONVERT(DATETIME,cast( @month as varchar)+'/'+cast (@day as varchar)+'/'+cast (@Intered_Year as varchar),102)

ستجد انه يتعامل مع التاريخ على أنه (شهر/يوم/سنة)

أما عند تغيير الرقم 102 إلى 103 فسوف يتاعمل معها على أنها (يوم/شهر/سنة)

وعملية التحويل باستخدام convert تكون مهمة لعمل تحكم أكبر على العملية التي تقوم بها

انظر مثلاً هذا المثال (من أحد برامجي)

SELECT     NurseName, RegistryDate
FROM         dbo.Tbl_Nurse
WHERE     (RegistryDate > CONVERT(DATETIME, '1/3/1991', 103))

هذا معناه التصفية إذا كان التاريخ أكبر من (1 مارس 1991)

أما هكذا

SELECT     NurseName, RegistryDate
FROM         dbo.Tbl_Nurse
WHERE     (RegistryDate > CONVERT(DATETIME, '1/3/1991', 102))

أو هكذا بدون تحديد هيئة التاريخ

SELECT     NurseName, RegistryDate
FROM         dbo.Tbl_Nurse
WHERE     (RegistryDate > CONVERT(DATETIME, '1/3/1991'))

فسيتعامل على أن التاريخ هو ( 3 يناير 1991)

وهناك أكواد أخرى مثل كود 130 فهو يتعمل مع التاريخ على أنه هجري

أرجو من الله أن يتقبل مني ومنكم ، ووإن كان هناك توفيق فمن الله وحده ، وإن كان هناك سهو أو خطأ فمني ومن الشيطان

وفقك الله للخير

تم تعديل هذه المشاركة بواسطة محمد النحراوي في 26 أبريل 2005 في 16:09

#12

بارك الله فيك أخي ونفع بعلمك..

من لمح فجر الأجر هان عليه ظلام التكليف

هذا الموضوع مغلق.

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