الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

كيف اولد ارقام تسلسليه بدون Sequence?

Featured Replies

بتاريخ:

انا ابغى اعرف كيف اولد ارقام تسلسليه بدون استخدام الsequence
في موضوع في المنتدى بس ما استطعت فهم الفكره

انا اللي فاهمه اني اروح للبلك واختار pre-insert trigeer
بس المهم ايش الكود اللي احطه فيه
اسم الحقل هو P_no

بتاريخ:

السلام عليكم اخي الكريم ورحمة الله
ممكن عمل ارقام تسلسلة بدون الحاجة الى السيكونس وذلك بعمل الزناد الذي اشرت اليه وكتابة فيه دالة
max+1 وتضعها في قيمة متغير جديد تنسب قيمته الى اسم الحقل الذي يكون ابتدائيا صفر وبعدها تبدا القيمة تزداد لكن اي رقم يحذف لايتكرر لاحظ هذا جيدا اي يعمل عمل دالة السيكونس

بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

مشكووور اخي الكريم انا بجرب الحين واشوف اذا ما اشتغل والا ما عرفت سوف انتظر منك الكود

بتاريخ:
  • كاتب الموضوع

هذا الكود اللي كتبته تقدر تشوفه اخي العزيز

DECLARE 
num number;
BEGIN
select nvl(max(P_no)+1),0) into num 
from p_data 

p_no=num;

end;

بتاريخ:
  • كاتب الموضوع

وينك اخي الكريم لاني ما عرفت اشغل الكود وانا حاليا متعطل ارجوا من الاخوان الذين لديهم معرفه بحل مشكلتي

بتاريخ:

DECLARE
NUM NUMBER;
BEGIN SELECT count(NVL(P_NO,0))+1 INTO NUM FROM P_DATA;
_NO := NUM;
END;

بتاريخ:

خذ هذا الكود وان شاء الله يفيدك



create_record;

select nvl(max(record name),0)+1 into :text_item name from table;

بتاريخ:
  • كاتب الموضوع

مشكووورين وما قصرتوا جعله الله في ميزان حسناتكم

بتاريخ:
خذ هذا الكود وان شاء الله يفيدك



create_record;

select nvl(max(record name),0)+1 into :text_item name from table;



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

اما عند استخدام count فبهذه الطريقة لايتم استخدام عملية الحذف
SELECT count(NVL(P_NO,0))+1 INTO NUM FROM P_DATA;


او

SELECT MAX(NVL(P_NO,0))+1 INTO NUM FROM P_DATA;



الطريقتين صحيحتان ولكن ضمن الشرط الذي ذكرته الان من حيث عملية الحذف

تم تعديل بواسطة rose_4_pretty

بتاريخ:
  • كاتب الموضوع

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

يعني لو كان الرقم في p_no
2 لمن اسوي انشاء هو لحاله يزيد الرقم بواحد وهكذا يصير عندي تسلسل بدون ما اضيف اي رقم بشكل يدوي

بتاريخ:
معليش اخواني ما شتغل معاي الكو د جربت الاثنين بس ما نفع
انا ابغى لمن اسوي اسوي لنشاء لسجل جديد هو يحط في سجل الرقم رقم معين

يعني لو كان الرقم في p_no
2 لمن اسوي انشاء هو لحاله يزيد الرقم بواحد وهكذا يصير عندي تسلسل بدون ما اضيف اي رقم بشكل يدوي



معناها اكتب الكود داخل زر الانشاء نفسه

ولكن بالبداية اكتب التالي
create_record;

تم تعديل بواسطة rose_4_pretty

بتاريخ:

الأخوة الكرام ، أسمحوا لي بالمشاركة ،

الأخ الغالي nan740 ، هناك أسلوبين لإنشاء ترقيم تلقائي ،

الأسلوب الأول وهو بإستخدام الـ sequence ، ودة طبعاً أنت عارفة ،

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

علشان تخلي حقل مرقم ترقيم تلقائي ما عليك سوي أمر من الإثنين :

نفرض أن لدينا جدول يدعي Emp وبه حقل يدعي Emp_Serial ..

1- إنشاء تريجر مناسب علي مستوي الجدول نفسة في قاعدة البيانات كما يلي :

CREATE OR REPLACE TRIGGER TRG_BEFORE_EMP BEFORE INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW
DECLARE

BEGIN
  IF(INSERTING)THEN
   SELECT NVL(MAX(EMP_ID),0) + 1
   INTO :NEW.EMP_ID
   FROM EMP;
  END IF;
END;
/



2- في حدث Trigger علي مستوي بلوك البيانات Emp تحت إسم Pre-Insert أدرج الكود التالي :

Select NVL(Max(Emp_ID),0) + 1 Into :Emp.Emp_ID From Emp;





لكن لو مثلاً كنت عايز تخلي عملية التزايد مزدوج فيمكنك إستخدام الكود التالي :

Select NVL(Max(Emp_ID),0) + 2 Into :Emp.Emp_ID From Emp;





وهكذا




بالتوفيق

بتاريخ:
  • كاتب الموضوع

مشكوووور يا اخ mma والله ما قصرت الحين فهمت وجاري التطبيق

بتاريخ:
الأخوة الكرام ، أسمحوا لي بالمشاركة ،

الأخ الغالي nan740 ، هناك أسلوبين لإنشاء ترقيم تلقائي ،

الأسلوب الأول وهو بإستخدام الـ sequence ، ودة طبعاً أنت عارفة ،

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

علشان تخلي حقل مرقم ترقيم تلقائي ما عليك سوي أمر من الإثنين :

نفرض أن لدينا جدول يدعي Emp وبه حقل يدعي Emp_Serial ..

1- إنشاء تريجر مناسب علي مستوي الجدول نفسة في قاعدة البيانات كما يلي :

CREATE OR REPLACE TRIGGER TRG_BEFORE_EMP BEFORE INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW
DECLARE

BEGIN
  IF(INSERTING)THEN
   SELECT NVL(MAX(EMP_ID),0) + 1
   INTO :NEW.EMP_ID
   FROM EMP;
  END IF;
END;
/



2- في حدث Trigger علي مستوي بلوك البيانات Emp تحت إسم Pre-Insert أدرج الكود التالي :

Select NVL(Max(Emp_ID),0) + 1 Into :Emp.Emp_ID From Emp;





لكن لو مثلاً كنت عايز تخلي عملية التزايد مزدوج فيمكنك إستخدام الكود التالي :

Select NVL(Max(Emp_ID),0) + 2 Into :Emp.Emp_ID From Emp;





وهكذا




بالتوفيق






Thank you MMA for ur information
But in programming I think we need to use the most easy way to clarify our code at the end.
specially in this task no need to use trigger to increase the serial for a field.

Thank u again MMA

Best Regards
بتاريخ:

لدي مداخله شباب
انشي جدول SERIAL_DATA

CREATE TABLE SERIAL_DATA(SER_NO NUMBER(5),YEAR NUMBER(4),NOTE VARCHAR2(50));


ثم اذهب للفورم وروح على البلوك الذي يوجد به حقل P_NOتبعك واختار ترجر PRE_INSERTواكتب التالي فيه

BEGIN LOCK TABLE SERIAL_DATA IN share row EXCLUSIVE MODE;

 SELECT SER_NO + 1
   INTO _NO FROM SERIAL_DATA
  WHERE YEAR=1429; --هنا سوف يختار الرقم الموجود في هذا الجدول

 UPDATE SERIAL_DATA --هنا تقوم بتعديل قيمة جدول التسلسل ووضع اخر قيمة في الجدول
    SET SER_NO    = _NO
  WHERE YEAR =1429;

EXCEPTION -- هنا راح يدخل مرة واحد فقط عندما يكون الجدول فاضي 

WHEN NO_DATA_FOUND THEN
   insert into SERIAL_DATA --يعمل ادخال قيمة 0 للتسلسل وبعد ينفذ الباقي
values(0,1429,'تسلسل جدول الموظفين لعام'); 

LOCK TABLE SERIAL_DATA IN share row EXCLUSIVE MODE;

 SELECT SER_NO + 1
   INTO _NO FROM SERIAL_DATA
  WHERE YEAR=1429; 

 UPDATE SERIAL_DATA
    SET SER_NO    = _NO
  WHERE YEAR =1429;

 END;



وبكذا عملت جدول خاص للتسلسل تبعك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.