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

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

صورة
- - - - -

معرفة الارقام الغير ضمن الارقام متسلسلة واستغلالها


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

#1 محمد باسلامة

محمد باسلامة

    عضو

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

تاريخ المشاركة 21 December 2006 - 12:49 PM

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

Mohammed Basalama

تم التعديل بواسطة محمد باسلامة, 21 December 2006 - 12:55 PM.


#2 هانى سند

هانى سند

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

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 21 December 2006 - 02:19 PM

السلام عليكم
عندي فكرة لعمل ما تحتاجه ممكن أن تفيدك

و هو عمل جدول أخر به كل الاأرقام المتسلسة من الجدول الأصلي
و بالطبع عند إضافة اي رقم تسلسلس جديد يتم إضافته في هذا الجدول
ثم عند عمل أي حذف من الجدول المتسلسل
يمكنك بعدها إيجاد الارقام المفقودة بجملية SELECT بسيطة
و يمكن إذا كنت تريد إستغلال هذه الأرقام بعمل إدخال لها مرة أخري إن كنت تريد عن طريق الإختيارمنها
و هذا مثال بسيط يشرح الفكرة
SQL> CREATE TABLE  SERIAL (SERIAL_NO NUMBER);

تم تكوين جدول.

SQL> BEGIN
  2  FOR I IN  1..50 LOOP
  3  INSERT INTO SERIAL  VALUES(I);
  4  END  LOOP;
  5  COMMIT;
  6  END;
  7  /

تم بنجاح إجراء PL/SQL

SQL> SELECT *  FROM  SERIAL;

 SERIAL_NO																	  
----------																	  
		 1																	  
		 2																	  
		 3																	  
		 4																	  
		 5																	  
		 6																	  
		 7																	  
		 8																	  
		 9																	  
		10																	  
		11																	  

 SERIAL_NO																	  
----------																	  
		12																	  
		13																	  
		14																	  
		15																	  
		16																	  
		17																	  
		18																	  
		19																	  
		20																	  
		21																	  
		22																	  

 SERIAL_NO																	  
----------																	  
		23																	  
		24																	  
		25																	  
		26																	  
		27																	  
		28																	  
		29																	  
		30																	  
		31																	  
		32																	  
		33																	  

 SERIAL_NO																	  
----------																	  
		34																	  
		35																	  
		36																	  
		37																	  
		38																	  
		39																	  
		40																	  
		41																	  
		42																	  
		43																	  
		44																	  

 SERIAL_NO																	  
----------																	  
		45																	  
		46																	  
		47																	  
		48																	  
		49																	  
		50																	  

تم اختيار 50 صف

SQL> CREATE TABLE  MISSED_SERIAL  AS SELECT *  FROM  SERIAL;

تم تكوين جدول.

SQL>   DELETE SERIAL  WHERE  SERIAL_NO IN  (10,12,15,49,26,23,6,25,32);

تم حذف 9 صف

SQL> COMMIT;

تم التثبيت

SQL> select  s2.serial_no
  2	  from  serial s1, missed_serial s2
  3	  where  s1.SERIAL_NO(+)=s2.SERIAL_NO
  4	  AND  S1.SERIAL_NO  IS  NULL
  5	 ;

 SERIAL_NO																	  
----------																	  
		 6																	  
		10																	  
		12																	  
		15																	  
		23																	  
		25																	  
		26																	  
		32																	  
		49																	  

تم اختيار 9 صف

و أرجو التفاعل مع الموضوع حيث أنه من المواضيع المهمة
بالتوفيق

#3 jamal_rrkk

jamal_rrkk

    عضو نشط

  • الأعضــاء
  • 452 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 21 December 2006 - 04:23 PM

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

يمكن انشاء جدول يحتوي علي عمود للتسلسل فقط

وانشاء trigger عند كل عملية حذف يقوم بترحيل التسلسل المحذوف لهذا الجدول

وعند اي عملية ادخال مطابقة لهذا التسلسل يقوم بحذف التسلسل من الجدل


سؤال : هل من الممكن أن نعدل كود الحذف بحيث يقوم بعملية تعديل للبيانات وجعلها صفر أو null

مع الابقاء علي التسلسل عند الضغط علي زر الحذف


جزاكم الله كل خير
قال تعالى :

{ وَمَا خَلَقْتُ الْجِنَّ وَالْإِنسَ إِلَّا لِيَعْبُدُونِ مَا أُرِيدُ مِنْهُم مِّن رِّزْقٍ

وَمَا أُرِيدُ أَن يُطْعِمُونِ إِنَّ اللَّهَ هُوَ الرَّزَّاقُ ذُو الْقُوَّةِ الْمتينُ }

[ الذاريات : 56 : 58 ]


{ وَأْمُرْ أَهْلَكَ بِالصَّلَاةِ وَاصْطَبِرْ عَلَيْهَا لَا نَسْأَلُكَ رِزْقًا

نَحْنُ نَرْزُقُكَ وَالْعَاقِبَةُ لِلتَّقْوَى }

[ طه : 131 ]




سبحان الله والحمد لله والله أكبر


http://tech.groups.y...and_Accounting/

#4 mw_wageeh

mw_wageeh

    عضو نشط

  • الأعضــاء
  • 251 مشاركة
  • البـلـد: Country Flag

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

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

انة اوقات احنا مبيبقاش مسموح لنا اننا نعمل تيبل فى الداتا بيز

فأحنا عاوزين نحلها من غير منعمل اى تيبل

الاول هنعمل كيرسور يجيب كل التسلسل

ثانيا نجيب اصغر قيمة واكبر قيمة فى التسلسل بدالة
Min and max
نفتح الكيرسور ونضع اول قيمة فى الكيرسور فى متغير

بعد كدة نعمل فورة بدايتها ال Min ونهايتها ال max
وتحتها نعمل جملة if

لو القيمة الحالية للفورة تساوى القيمة اللى جات من الكيرسور
نعملة جملة fetch اخرى

لو لاتساوى المتغير دة نطبع القيمة دى



معلشى انا عارف انى شرحى مش هتفهموة

هسهل عليكم واقرأو الكود بتاع الفانكش دى

set serveroutput on ;

create or replace procedure missing
is
v_min number(5) ;
v_max number(5) ;
v_empno number(5) ;
cursor c_empno is
select empno from emp ;
begin select min(empno),max(empno)
into v_min,v_max from emp; open c_empno ;
fetch c_empno into v_empno ;
for x in v_min..v_max loop
if x = v_empno then
fetch c_empno into v_empno ;
else
dbms_output.put_line(x) ;
end if ;
end loop ;
end ;


واى مشكلة انا ى الخدمة

تم التعديل بواسطة mw_wageeh, 21 December 2006 - 06:21 PM.


#5 هانى سند

هانى سند

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

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 22 December 2006 - 12:50 AM

السلام عليكم
الأخ محمد وجيه(mw_wageeh)

أولا شكرا لنشاطك و عطائك في المنتدي فنحن محتاجين هذا النشاط فعلا ;)

ثانيا يا سيدي أنا أسبقك انت تسبق المهم الناس تستفيد و بقي في حوار أفكار و حلول و الكل يستفيد ;)
و عموما خيرها في غيرها يا سيدي ;)

بالنسبة للمشكلة و حلها أشكرك علي كلامك
و أحب أن أوضح لك انه لست أعتقد انها مشكلة كبيرة في انك غير مسموح لك ان تقوم بانشاء جدول في الداتا بيز
فأذا كان الديفلوبر غير مسموح له بذلك فأعتقد انه اذا طلب إنشاء جدول لأهداف الديفلوبمنت فلن يرفض طلبه :o
بالنسبة للحل الذي أرسلته فقد كنت قد فكرت به و جربته و لكن به مشكلة صغيرة فاتت عليك
و هي ماذا لو كان الرقم المحذوف هو اول رقم في التسلسل او اخر رقم او كلاهما
في هذه الحالة فبعض الارقام لن تستطيع الحصول عليها او بالظبط هي اصغر رقم و اكبر رقم
بمعني لو كان لدي 50 رقم و حذف منهم مثلا رقم 1 و رقم 50 ففي هذه الحالة سيبدا الcursor من رقم 2 الي رقم 49
أليس كذلك؟
و عموما هناك طريقة أخري لعمل ذلك و هي فقط عبارة عن جملة سيليكيت واحدة بدون إنشاء أي جداول اخري او
او عمل فانكشن او كيرسور من اي نوع
و هي تشترط فقط وجود جدول به عدد سجلات اكبر من السجلات الموجودة بجدول التسلسل
و قد استخدمت فيها جدول all_objects
و لكن يمكن استخدام اي جدول اخر به عدد سجلات كاف
و هي مناسب اكثر لجداول التسلسل ذات عدد السجلات القليلة او عند التأكد من وجود جدول به عدد سجلات كاف و هي موجودة في هذا الرابط
كيفية الاستعلام عن الارقام المفقودة من التسلسل
و هذا يذكرني ان أذكر دائما بضرورة البحث قبل كتابة مواضيع جديدة
شكرا لتفاعلك و نشاطك
بالتوفيق

تم التعديل بواسطة hanon_OCP, 22 December 2006 - 01:20 AM.


#6 walid99

walid99

    عضو

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

تاريخ المشاركة 22 December 2006 - 01:48 PM

السلام عليكم
انا عندي هالحل ان شاء الله يكون صح


create or replace function get_no return number
is
tot number;
eno number;
eno1 number;
rtn_val number;
cnt number : = 0
cursor c is select empno from emp order by empno;

begin
select count(*) into tot from emp

loop
cnt := cnt + 1;
fetch c into eno;
exit when c%notfound
fetch c into eno1;


if eno <> 1 and cnt = 1 then
rtr_val := 1;
exit;
elsif ((eno1 is not null) and (eno1-eno>1)) or eno1 is null then
rtr_val := eno + 1
exit;
end if;

end loop;

if rtr_val is null and cnt : = 1 then
rtr_val := 1;
end if;

if (rtr_val is null and cnt > 1) or (rtr_val is null and eno := 1) then
rtr_val := eno + 1
end if;

return rtr_val;
end;

تم التعديل بواسطة walid99, 22 December 2006 - 05:33 PM.


#7 محمد باسلامة

محمد باسلامة

    عضو

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

تاريخ المشاركة 23 December 2006 - 11:59 AM

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

Regrads
Basalama

#8 amsh

amsh

    عضو

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

تاريخ المشاركة 29 December 2006 - 08:41 AM

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


create or replace procedure count_gaps(p_first number,p_steep number)
as
v_prior number :=p_first;
v_steep number :=p_steep;
begin
 if v_steep is null then
  v_steep:=1;
  end if;
 if v_prior is null then
  v_prior:=0;
  end if;
 v_prior:=v_prior-v_steep;
  for i in (select empno from emp order by empno)
	loop
	v_prior:=v_prior+v_steep;
	While v_prior<>i.empno loop
	 dbms_output.put_line(v_prior);
	 v_prior:=v_prior+v_steep;
	end loop;
  end loop;
end;


ولكن ستظهر مشكلة في البفر بالرسالة التالية

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes

وتقبل الله طاعتكم

#9 Ahmed Al-Bin Shaikh

Ahmed Al-Bin Shaikh

    مشترك

  • الأعضــاء
  • 78 مشاركة
  • الاسم الأول:احمد عبد الكريم خضر
  • اسم العائلة:ال بن الشيخ
  • البـلـد: Country Flag

تاريخ المشاركة 23 March 2014 - 03:49 AM

الله يعطيك العافيه مشاركه قيمه 

 

حسب فهمي إذا فهمت قصدك

 

ان مثلا لو عندي 50 موظف ومرقمهم بالتسلسل 

 

1-2-3-4-5-6-7-8-9-10

 

وحذفت 11 و 12 و 13 و14 و15

 

راح يكون التسلسل 

 

1-2-3-4-5-6-7-8-9-10-16-17-18-19-20-...... 50

 

 

هل بطريقتك هذه تعيد تقريم التسلسل

 

1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-...... 50 

 

؟؟

 

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

 

لان في بالي اشوف فكره 

 

sequence بشوفها تضبط ولا لا 



#10 HELL-BOY

HELL-BOY

    مشترك

  • الأعضــاء
  • 187 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 23 March 2014 - 01:50 PM

جرب الجمله دي مع تغير الرقم 100 حسب اخر رقم في التسلسل عندك او ممكن تشيلها وتكتب بدلها select count(*) from your_table 


select rownum from dual connect by level<=100
minus
select number from your_table

ORACLE 10G DEVELOPER


ORACLE 11G ADMIN

 

مطلوب شريك لتسويق برنامج حسابات ومخازن

waleed.ita@gmail.com

http://hodaerp.blogspot.com/