الانتقال إلى المحتوى
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.

الترقيم التلقائي

Featured Replies

بتاريخ:

السلام عليكم ...،،،

اشكركم على المرور .. :rolleyes:
لدي مشكلة في بناء مشروع صغير خاص بي (( نظام مبيعات )) ... ارجوا مساعدتي بهما ،،،

** اريد ان اعمل ترقيم تلقائي للحقل رقم الوحدة unit_no في جدول الوحدات UNITS ،،، بحيث انه كلما اراد المستخدم اضافة وحدة جديدة يتم اعطائها رقم جديد و متسلسل و بشكل تلقائي ((( و لا اريد استخدام الــ SEQUENCE سيكونس )))

ما قمت به هو التالي : انشأت Trigger من النوع Pre-Insert على مستوى الـ Form بشكل التالي :

select NVL(MAX(unit_no),0)+1 into :UNIT_NO from UNITS;[sql]

و الذي سوف يأخذ اكبر قيمه في الحقل unit_no على اعتبار انها اخر قيمه و يزيد عليها واحد ثم يضع الناتج في الحقل UNIT_NO على الشاشة .....
المشكلة : ان الرقم الجديد لا يظهر على الشاشة عند عملية اضافة الحقل الجديد (( بواسطة الامر Create_record; )) ... و كأن الـ Trigger لم ينفذ ...!


**** ارجوا فعلاً المساعده حتى استطيع اكمال و انجاز المشروع ....

و السلام ،،،
بنت اليمن ...
بتاريخ:

اختي بنت اليمن ...
ضعي الكود في WHEN-CREATE-RECORD

بتاريخ:

ممكن ان تضعى القيمة فى متغير

declare
Curr_No varchar2(15);
New_No number(2);
begin select  max(unit_no)
into Curr_no from UNITS; New_No := Curr_No + 1; 
:Block_name.txt_unit_no := New_no;
               insert into units values (New_No,'Unit Name');
end ;




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

بتاريخ:

declare

            Curr_No varchar2(15);

            New_No number(2);

begin select max(unit_no)

            into Curr_no from UNITS; New_No := Curr_No + 1; 

            :Block_name.txt_unit_no := New_no;

            insert into units values (New_No,'Unit Name');

end ;

بتاريخ:

اختى بنت اليمن التريجر اللى انتى عاملاه مظبوط جدا ومشاركة الزملاء لم تضف الجديد حيث انك باستخدامك الفنكشن nvl تجنبتى ان تكون القيمة اصلا null فى الجدول فيعتبرها صفر ويبدأ العداد ب 1 ثم يزود عليه ليصبح 2 وهكذاوفعلا عند الاضافة تجدى الفاليو اتكتبت فى الحقل اللى عملتى جمله select into عليه مالمشكلة ؟؟ جربى تانى اضافة حقل واعملى save سيضاف الحقل وتظهر قيمة السيريال .
المشكلة بجد تظهر عند اضافة اكتر من حقل حيت ان الأساينمنت لن يظهر على الشاشة الا فى حالة الاضافة هل تريدى اظهار السيريال كل مادخلتى على الريكورد واذا انتقلتى ايضا الى ريكود جديد وهكذا ( خلى بالك انتى لسه مضيفتيش حاجة فعلا انتى فى مرحلة داتا انترى منين حيزود والكود بيقول هات اعلى قيمة من الداتا بيز ) هل دى مشكلتك ؟ ليها حل برضه اذا كان هذا اللى عاوزاه ارسلى ردك شكرا ارجو ان اكون افادتك

بتاريخ:

ملحوظة كود الزملاء الذى يحتوى على جملة انسرت ملهاش داعي لانك اخدت القيمة وعملتلها اساينمنت فى متغير ومن المتغير لحقل الداتا بيز على الفورمة والتريجر pre insert حيفاير عند الانسرت ايه الداعى لجملة انسرت !!!!!!
واذا ضيفتى الكود على تريجر when create recoed حيشتغل برضه بس المشكله الريكورد التانى حيبقى بقيمة الاولانى يعنى مش حيتزود !!! لاحظتيها ليه!!!! لانه جاب اعلى قيمة من الدتا بيز ومش من الفورم فمش حيزود تلقائى على الفورم يفضل نقطة صغيرة جربى واذا معرفتيش ارسلهالك

بتاريخ:

اظن الحل فى هذه الجملة يا أخ Oramaster
:Block_name.txt_unit_no := New_no;

بتاريخ:

كلام الاخ ORAMASTER صحيح

والكود صحيح

وكما افاد الاخوة فان القيمة لا تظهر الا عند حفظ السجل لان الكود اصلا موجود في
التريجر PRE-INSERT والذي ينفذ عند( قبل عملية ادراج السجل في الداتابيس) حفظ السجل
وانا ارى انه في مكانه الصحيح لان هذا التريجر ينفذ عند حفظ كل سجل
اي ان المستخدم اذا قام باضافة اكثر من سجل ثم قام بالحفظ فان الكود السابق يعمل بشكل سليم

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

السلام عليكم ...

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

الاخ John الكود الذي و ضعته لا يبتعد كثير عن الهدف ،،، و لكن جملة

select NVL(MAX(unit_no),0)+1 into :UNIT_NO from UNITS;


كفيله بعمله .... و لا اعتقد ان الخطأ منها ....

و اشكرك على الرد المفصل :rolleyes:

الاخ Oramaster والاخ developer في الحقيقة كلامكم صح .. صح .. صح و لقد عملته سابقاً بالشكل التالي :

داخل زر اضافة سجل جديد و تحت الحدث عند الضغط على الزر عملت الـ Trigger التالي :

go_block('UNITS');
create_record;
select NVL(MAX(unit_no),0)+1 into :UNIT_NO from UNITS; commit_form;



و مشي الحال ... بس في الحقيقة انا اريد حاجة افضل ... ،،، لأن عملية الحفظ قبل اضافة بيانات السجل الاخرى ليست جيده .. خصوصاً اذا لم يدخل المستخدم اي بيانات اخرى،،،


عموماً اشكركم جميعاً....

و السلام

بنت اليمن ،،:)

بتاريخ:

السلام عليكم
الصراحه تفاعل ممتاز جداً و الى الامام
انا لديه طريقه اخرى لعملية الترقيم التلقائي لان الطريقه التي التي تم النقاش حولها تعتمد على اخذ القيمة من الجدول نفسه (جدول البيانات ) وهنا مشكله وهي انه اذا تم ادخال اكثر من سجل سوف يعطينا نفس القيمه اي القيمه الاعلى + 1 مثل ما تفضل الاخ oramaster , واذا اردنا ان نتخلص من هذه المشكله تظهر لنا مشكله اخرى وهي ان نقوم بعملية commit وهذا غير مجدي لانه قد يؤثر على البيانات .
لذلك الفكره الجديده تتلخص في ان يكون الترقيم التلقائي من جدول منفصل كلياً عن جدول البيانات بحيث لا نؤثر على البيانات .
الخطوات تكون كالتالي
1- نقوم بإنشاء جدول الترقيم وليكن table_seq ويحوي الاتي
table_no
table_name
seq_no
2- نعمل قيم ابتدائية للترقيم في حقل الـseq_no مثلاً يبدا الترقيم من الرقم 1
3- نعمل function نمرر لها نو ع الجدول مثلاً unit او dept ثم ترجع لنا الرقم الحالي وتقوم بتعديل القيمه في جدول الترقيم باضافه الرقم 1
4- نعمل مناداه لهذه الـfunction من الترقر when-create-record
بهذه الطريقه تتخلص من مشكلتي اضافه اكثر من سجل وكذلك مشكله الحاجه للـ commit

اذا لم تكن الطريقه وضحه اشعروني وسف اعمل برنامج به كل التفاصيل الـ table و الـfunction والـ form

  • بعد 11 شهور...
بتاريخ:

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

جزاك الله خيرا أخي خالد ولكني يا ريت لو توضح الطريقة أكثر بمثال وأكن لك من الشاكرين

أخوك في الله / لؤي (أبو العبد)

  • بعد 2 أسابيع...
بتاريخ:

أخي الكريم / خالد ، حفظه الله

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

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

أرجو مثال عملي عبارة عن نموذج بسيط يحتوي على حقلين مثلا رقم الموظف وأسم الموظف بحيث يكون يحتوي على خاصية الترقيم التلقائي

أخوك / لؤي (أبو العبد)

بتاريخ:

الأخت بنت اليمن مشكلتك بسيطة جدا بس يمكن أنك لم تختاري التريجر المناسب بحيث أنه لا يعمل حفظ للبيانات إلا في الأخير و لكن أعملي الخطوات التالية :
1- أجعلي الtext_box غير مفعل بحيث لا يسمح الأدخال فيه .
2-أعملي تريجر من توع pre_record , أعملي فية الكود التالي :angry:لكي يظهر الرقم مباشرة عند الأضافة)
(select nvl(max(unit_no),0)+1 into :unit_no from units )

3-2-أعملي تريجر من توع pre_insert , أعملي فية الكود التالي :angry:لكي يحفظ البيانات مباشرة بعد الحفظ)
(select nvl(max(unit_no),0)+1 into :unit_no from units )

و أن شاء الله تنحل المشكلة .
جميل -جامعة العلوم و التكنولوجيا - اليمن

  • بعد 2 سنة...
بتاريخ:

عفوًا اعزائي على اعادة ورفع الموضوع’’

وبدلاً من كتابة موضوع آخر ’’ وجدت هذا الموضوع وأردت الرد عليه’’

بالنسبة لي كانت عندي نفس المشكله’’

ولكن والحمد لله اشتغلت معي مضبوط

فعندما افتح الفورم تظهر لي الرقم التسلسلي

ولكن في حال تم حفظ السجل

والذهاب للسجل الآخر

يختفي الرقم تلقائيًا’’!

فكيف تكون موجوده وبشكل اساسي كلما دخلت للسجل الآخر’’!




شاكرلكم اعزائي

بتاريخ:

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



بارك الله فيكم جميعاً على هذا التفاعل

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



saudifree_5a58c.jpg


لربط المتسللة السابقة مع العمود (الرقم التسلسلي) استخدام حدث قاعدة البيانات Before insert

saudifree_7ae22.jpg

الموضوع كامل على الرابط
http://www.araboug.org/ib/index.php?showto...8680&st=105

بتاريخ:

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


أخى الكريم يمكنك إستخدام

:SYSTEM.TRIGGER_RECORD

:ID:=SYSTEM.TRIGGER_RECORD
وذلك داخل التريجر
WHEN-CREATE-RECORD
بتاريخ:

لا أدري ما سبب عدم الرغبة في استخدام العداد واللجوء إلى طريقة معرفة أكبر عدد سجل
وهذه الطريقة أعتبرها ضعيييييفة جدا في حال وجود بيانات كبيرة في الجدول لما تسببه من تأخر عند عملية الحفظ وارهاق لقاعدة البيانات بدون داع
في حال الاصرار على عدم استخدام العداد يمكن اتباع الطريقة التالية
انشاء جدول تخزن فيه اعداد السجلات وتكون هناك قيم ابتدائية كما ذكره أحد الإخوان وتكون حقول الجدول كالتالي
create table last_number
(table_name varchar2(35),
clm_name varchar2(30),
last_val number (10) not null);
المفتاح الأساس للجدول الحقلين الأولين
وتنشئ دالة تقوم بإرجاع القيمة من الجدول المذكور حسب اسم الحقل والجدول وتزيد عليها واحد
وعند تمام الحفظ قم بزيادة القيمة في هذا الجدول

  • بعد 7 سنة...
بتاريخ:

اولا الطريقة 1- (max +1 ) مينفعش علشان لو اكتر من user فتحو فى نفس الوقت هيخدو نفس القيمة...... 

               2- نعمل الترقيم فى جدول منفصل ؟  طب لو عندك 30 هتعمل 30 تانى تشيل فيهم الارقام .. !!!! <_<

الحل

اعمل (2 Sequence)

1- الاول دة الى هيشوفو user عادى جدآ وفى  PK

2- التانى ضيف column فى كل entity بال

SEQ التانى

 

SQL> SELECT  ' ALTER TABLE ' || TABLE_NAME || ' ADD COLUMN Seq_number_db number ' From user_tables

 

step) spool it

تم تعديل بواسطة amr.zen

  • بعد 2 سنة...
بتاريخ:

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

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

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

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

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

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

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.