إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

مساعدة في عمل For


5 رد (ردود) على هذا الموضوع

#1 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 03 April 2006 - 10:06 AM

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

أخواني الاعزاء

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

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

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

في البداية يستعلم عن رمز المهمة ورقمها في كل قسم ان لم تكون موجودة فيكون هناك استثناء يقوم بادخال القسم ورمز المهمة ورقمها والتاريخ الحالي لجميع الاقسام.

الكود التالي عملته لكنه غير صحيح هل من الممكن تصحيحه

declare
cursor c1 is select distinct(dept) from policy_dept;
x c1%rowtype;
g varchar2(3);
i number;
begin
    for x in c1
      loop
          begin
               select grp_id, itm_id into g, i from policy_dept
                     where itm_id  = :itm_id
                     and grp_id = :grp_id
                     and dept = x;
               exception
               when no_data_found then
                    insert into policy_dept
                    values(x,:grp_id,:itm_id,sysdate);
         end;
    end loop;
 commit;
end;

شاكرا لكم مسبقا
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


من مواضيعي:
حل جذري لمشكلة التحويل من الميلادي الى الهجري حسب التقويم

#2 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 03 April 2006 - 05:21 PM

اخي الكريم
هذا التعديل جربة وخبرنا عن النتائج
declare
cursor c1 is 
    select distinct(dept) dept from policy_dept;
cursor c2 is
       select grp_id, itm_id from policy_dept
                    where itm_id  = :itm_id
                    and grp_id = :grp_id
                    and dept = x.dept;
--x c1%rowtype;
g varchar2(3);
i number;
open c2;
begin
   for x in c1
     loop
         begin
                 fetch c2 into g,i;
        if g is null and i is null then
            begin
                   insert into policy_dept
                   values(x.dept,:grp_id,:itm_id,sysdate);
                     EXCEPTION
      WHEN OTHERS THEN
                         DECLARE
        server_err               NUMBER         := abs(DBMS_ERROR_CODE);
       server_msg               VARCHAR2(2000) := DBMS_ERROR_TEXT;
    
          BEGIN
  	rollback;
  	message('خطأ'||to_char(server_err) ||'-'||server_msg);
  	
    end;     
  end;
   end if;

        end;
   end loop;
commit;
end;

۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#3 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 04 April 2006 - 08:09 AM

شكرا لك عزيزي على التجاوب لكن

عندما عملت استعلام في الكيرسر الثاني وقلت ان

cursor c2 is
select grp_id, itm_id from policy_dept
where itm_id = :itm_id
and grp_id = :grp_id
and dept = x.dept;


الـ x غير معرفة
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


من مواضيعي:
حل جذري لمشكلة التحويل من الميلادي الى الهجري حسب التقويم

#4 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 04 April 2006 - 08:26 AM

الله يعطيك العافية وتسلم يدينك ياعزيزي

عدلت الخطأ السابق وقمت بوضع OPEN CURSOR في منطقة BEGIN ..

بصراحة شكرا لك الف مرة

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

declare
x number;
begin
     for i in :from_itm .. :to_itm
         loop
             begin
                  select itm_id into x from policy_dept
                         where dept = :dep
                           and grp_id = :grp_id
                           and itm_id = i;
                  exception
                  when no_data_found then
                       insert into policy_dept
                              values(:dep,:grp_id,i,sysdate);
                      -- message(i);
                  end;
         end loop;
commit;
end;

الثاني
declare
cursor c1 is 
   select distinct(dept) dept from policy_dept;

x c1%rowtype;

cursor c2 is
      select grp_id, itm_id from policy_dept
                   where itm_id  = :itm_id
                   and grp_id = :grp_id
                   and dept = x.dept;
g varchar2(3);
i number;
begin
open c2;
  for x in c1
    loop
        begin
                fetch c2 into g,i;
       if g is null and i is null then
           begin
                  insert into policy_dept
                  values(x.dept,:grp_id,:itm_id,sysdate);
           EXCEPTION
           WHEN OTHERS THEN
           DECLARE
             server_err     NUMBER         := abs(DBMS_ERROR_CODE);
             server_msg     VARCHAR2(2000) := DBMS_ERROR_TEXT;
 
           BEGIN
             rollback;
             message('ÎØÃ'||to_char(server_err) ||'-'||server_msg);
   
           end;     
           end;
       end if;

       end;
  end loop;
commit;
end;
الثاني هذا بعد التعديل البسيط عليه

والف شكر لك ياعزيزي Admin05
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


من مواضيعي:
حل جذري لمشكلة التحويل من الميلادي الى الهجري حسب التقويم

#5 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 04 April 2006 - 09:30 AM

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

declare
cursor c1 is 
  select distinct(dept) dept from policy_dept;

x c1%rowtype;

cursor c2(j number) is
     select grp_id, itm_id from policy_dept
                  where itm_id  = j
                  and grp_id = :grp_id
                  and dept = x.dept;
g varchar2(3);
i number;
begin


for zz in :from_itm .. :to_itm
        loop
            begin
open c2(zz);
 for x in c1
   loop
       begin
               fetch c2 into g,i;
      if g is null and i is null then
          begin
                 insert into policy_dept
                 values(x.dept,:grp_id,zz,sysdate);
          EXCEPTION
          WHEN OTHERS THEN
          DECLARE
            server_err     NUMBER         := abs(DBMS_ERROR_CODE);
            server_msg     VARCHAR2(2000) := DBMS_ERROR_TEXT;

          BEGIN
            rollback;
            message('ÎØÃ'||to_char(server_err) ||'-'||server_msg);
  
          end;     
          end;
      end if;

      end;
 end loop;
close c2;
end;
end loop;
commit;
end;

هنا تم اضافة loop اخر يقوم بالعد مثلا من 1 الى 46 وحسب رقم الايتم المهم ان البحث يتم حسب رقم العميل ويتم فتح ال cursour c2 واغلاقه بعدد الايتم ونكمل العملية بشكل طبيعي
ارجو ان يكون هذا الدمج هو الشكل الصحيح الذي تريد
۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#6 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 05 April 2006 - 12:30 PM

نأسف على الإزعاااج...
نأسف على الإزعاااج...
نأسف على الإزعاااج...
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


من مواضيعي:
حل جذري لمشكلة التحويل من الميلادي الى الهجري حسب التقويم