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

أردراج تسلسل تلقائي

مغلق
بدأه أبو رضوان في 23 مايو 2003 · 9 رد · 1,547 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أخواني الكرام

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

أخواني الأعزاء ما هو Trigger الذي يعطيني التسلسل التلقائي للأرقام ( 1،2،3،4، .......إلخ ) ومكانية الحذف من تلك الأرقام التي سبق أن كتبتها ( مثلاً 3 ) ويعيد ترتيبها تلقائياً ويحفظ بنفسه ذلك .

أبو رضوان ( مبتديء )

#2

سلام

اخي العزيز .... انا بصراحة ما بعرف انه في (trigger) بعطي رقم متسلسل

بس في طريقة انا بستخدمها علشان اعطي رقم متسلسل مثلا

في (when-new-record-instance) اعطي الحقل رقم ال(record) يعني

:block_name.item_name := :system.trigger_record

بس اذا بدك تعيد الترتيب اذا حذفت واحد من (records) لازم تعمل (loop) يعيد الترتيب من جديد مثلاَ

declare

rec_count number;

curr_rec number := :system.trigger_record;

begin

go_block('block_name');

last_record;

rec_count := :system.trigger_record;

first_record;

for i in 1..rec_count loop

:block_name.record_name := :system.trigger_record;

end loop;

go_record(curr_rec);

end;

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

فادي

#3

جرب هذا في Post Query

:BLOCK_2.SQNS_NUM:=GET_BLOCK_PROPERTY('BLOCK_2',CURRENT_RECORD);

وخل الفلد نو داتا بيس مشان الترتيب يكون اتوماتيكي من السيستم . اي لا تحتفظ به في الجدول .

#4

السلام عليكم

طريقة1: بإمكانك عمل sequence وربطه بـ database display item

الطريقة الثانية:

يمكنك على الـ when-new-record-instance

عمل التالي:

declare

select max (العمود المطلوب عمل ترقيم له ) + 1 into :display_item from table_name;

#5

السلام عليكم

أخي ابو رضوان جرب هذه الطريقة :

1-ضع هذا الكود في تريقر ال pre-insert

select nvl(max(empno),0)+1 into :emp.empno 

from emp;

2-لا تعطي المستخدم إمكانية ال insert مباشرة على الحقل التسلسلي .

تحياتي

#6

جميله هذي الحلول .....

هناك مشكلة في الترقيم التسلسلي التلقائي بجميع أنواعه وهي: عندما نحذف سجل معين لا يمكن أن نضيف سجل آخر في نفس المكان ,,,, مثال :

لو كان لدينا 100 سجل .... واضطر المستخدم أن يحذف السجل رقم 60-مثلاً- فعندما يضيف سجل جديد سيكون رقمه 101 وسيهمل الرقم 60 ... وبالتالي سيكون لدينا 100 سجل ، و رقم آخر سجل 101 ، والمفروض أن يكون لدينا عدد 100 سجل وآخر سجل رقمه 100 .. والسجل الجديد يأخذ مكان الرقم المحذوف أي 60 ..

#7

:( أخي الأستاذ / محمد الشنقيطي

تحية عطرة

عند عمل ترقيم تلقائي تختار أي حقل ثم f11 ثم p% لا يعطيك pre insert بل يعطيك pre popup و pre text فما هو الحل

مع جزيل الشكر والتقدير

#8

اخي zafeer

تحياتي لك لم افهم ماهو المقصود من f11 وال %p ارجوا ان توضح أكثر مع العلم ان عملية الترقيم التلقائي التي قصدت لا يتدخل فيها المستخدم بل تتم تلقائيا قبل إدراج الحقل الجديد في ال pre-insert على ال block وحياك اللــه ..:eek:

#9

أخي الكريم المحمد

صحيح أن هناك مشكلة في الترقيم التسلسلي التلقائي بأننا عندما نحذف سجل معين لا يمكن أن نضيف سجل آخر في

نفس المكان ,,,, ولكن يمكن أن تتخطى هذه الحالة بأن تضع كود إعادة

الترقيم في PROCEDURE وتستدعيه دائما بعد عملية الحذف وقبل ال COMMIT

PROCEDURE PRC_NEW_SER IS
BEGIN
  FIRST_RECORD;
LOOP
   IF :SYSTEM.LAST_RECORD='TRUE'  THEN
      EXIT;
   ELSE
     :BLOCK_NAME.SERIAL_NO:= :SYSTEM.CURSOR_RECORD;
      NEXT_RECORD;
   END IF;
END LOOP;
END;

هكذا يقوم دائما بإعادة الترقيم التسلسلي لجميع السجلات في الملف

ويعيد التخزين ( كأنك تقوم في كل مرة بعملية UPDATE على الملف كاملاً )

#10

[ALIGN=RIGHT]السلام عليكم

أخي المحمد هناك فكرة لكن لم أجربها كثيرا وارجوا من الجميع التعليق عليها لكي نحل هذا الموضوع بالنسبة لعدم تتابع السجلات كما قلت بحيث لو حذفنا الرقم 1 وأدخلنا سجل جديد فسوف يعطيه الرقم 2 مثلا الفكرة هي :

1- نقوم بإنشاء جدول لنحفظ فيه ارقام السجلات التي تم حذفها ولنسميه مثلا DEL_NOEMPP :

CREATE TABLE  DEL_NOEMPP(DNO NUMBER);

2-نعمل إجراء يقوم بحذف أرقام السجلات الموجودة في جدول ال DEL_NOEMPP والمشابهة لإرقام موجودة في جدول ال EMPP :- (يعمل قبل كل عملية إدراج لموظف جديد)

CREATE OR REPLACE PROCEDURE d IS
   cursor c is select d.dno
   from empp e,delno_empp d
   where e.empno=d.dno;
   v_dno number;
v_r   number;
begin
open c;
loop
   fetch c into v_dno;
   delete from delno_empp
   where dno=v_dno;
   exit  when c%notfound;
end loop;
close c;
commit;    
end;

3-نقوم بإنشاء FUNCTION في داخل الفورم ولنسميه مثلا SEQNO حيث سيعطينا الرقم المتاح للموظف :

FUNCTION seqno RETURN number IS

v_count number;
v_r   number;	

BEGIN   

select nvl(count(dno),0) into v_count
from delno_empp;

IF v_count <>0 THEN

		select min(dno) into v_r
		from delno_empp;			
		return(v_r);		

ELSE		

		select nvl(max(empno),0)+1 into v_r
		from empp;		
		return(v_r);		

END IF;

END;

4- نضيف التالي في التريقر KEY-CREREC على بلوك (EMPP) مثلا :

BEGIN
D;
create_record;
:empno:=seqno;	
END;

5- نضيف التالي في تريقر ال PRE-DELETE على بلوك (EMPP) مثلا (يعمل قبل بعدكل عملية حذف لموظف) :

BEGIN
insert into delno_empp
values(:empno);
END;

ملاحظاتكم ياشباب وان كان هناك فكرة اخرى فعلينا بها ....

تحياتي للجميع:)

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

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