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

لدي مشكلة في عدم القدرة على إدخال أول سجل في جدول المشتركين


ورد

Recommended Posts

بسم الله الرحمن الرحيم
أخواني الاعزاء
لدي جدول للمشتركين فيه رقم المشترك هو المفتاح الرئيس حيث يتكون من أربع أجزاء هي:-
1) رقم المحافظة يأخذ الارقام من1 الى 9 (جدول المحافظات)
2) رقم المدينة يلأخذ الارقام من 100 إلى 499 (جدول المدن)
3) رقم الحي السكني يأخذ الارقام من 500 إلى 800 (جدول الاحياء السكنية)
4) رقم المشترك
مثال :- 11005001

لدي مشكلة في عدم القدرة على إدخال أول سجل في جدول المشتركين
وكيف يمكن إعطاء أرقام لباقي المشتركين من أحياء سكنية مختلفة بحيث يبدأ الترقيم من البداية مثال
11005001
11005011
11015001
21005001
وهكذا

أرجو المساعدة
وجزاكم الله خيرا

رابط هذا التعليق
شارك

الأخ الكريم ، يمكنك إنشاء Before Trigger علي مستوي سطر للجدول في حالة إدراج سجل جديد بحيث أن يبدأ الترقيم من الرقم الذي تختارة ، ومن ثم عند إدراج سجل جديد تجلب أكبر رقم تم تضيف علية رقم واحد أو إثنين أو ثلاثة أو .... حسب الخطوة Step ، أنظر الي المثال التالي :


لدي جدول يدعي Emp ، هذا الجدول به حقل يحتوي يدعي Emp_ID ، هذا الحقل يحتوي علي ترقيم تلقائي بدأً من الرقم 11005001 :

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),11005001) Into :New.Emp_ID From Emp;
End If;
End;
/





شكراً

رابط هذا التعليق
شارك

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

مع خالص تحياتي

وشكرا

رابط هذا التعليق
شارك

الأخ الكريم ، تحية طيبة وبعد ،

أولاً أخي ، أنا آسف جداً علي التأخير ، بس والله غصب عني ، حيث لدي مجموعة من المشاكل التي تواجهني في الفورم ولم أجد لها حل حتي الآن !!!

المهم أخي ، شيء طبيعي أن يكون الحقل متغير القيم ، والصحيح أن يكون غير متكرر Unique ، لأنه مرقم ترقيم تلقائي فهذا شيء طبيعي ( أم أنك تقصد شيء آخر غير واضح !!! ) .

فالكود الذي أدرجتة لك يبحث عن أكبر رقم ويضيف إلية القيمة ( 1 ) ، ولكن في حالة عدم إرتجاع أي قيمة ، هنا يتم إستخدام NVL كي نتحقق من النتيجة المرتجعة ، ففي حالة إرتجاع القيمة Null يبدأ من الرقم ( 11005001 ) .

وبعد ذلك تتم عملية الزيادة كل مرة بالقيمة ( 1 ) .

لكن أخي لو كنت تقصد أن الحقل يأخذ الترقيم الجديد حسب الحي السكني ، في هذه الحالة يتم إدراج شرط بإيجاد أكبر قيمة ترقيمية حسب الحي السكني .




ياريت أخي توضح أكثر



شكراً

رابط هذا التعليق
شارك

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


لدي مشكلة في عدم القدرة على إدخال أول سجل في جدول المشتركين
وكيف يمكن إعطاء أرقام لباقي المشتركين من أحياء سكنية مختلفة بحيث يبدأ الترقيم من البداية مثال
11005001
11005011
11015001
21005001


هذا التريجر يمكنك من إدخال أول مشترك ويعطي له واحد حسب المحافظه والمدينه والحي، وكذلك يمكنك أن تدخل مشتركين آخرين بتسلسل تصاعدي حسب نفس المحافظه والمدينه والحي. وإذا غيرت المحافظه أو المدينه أو الحي أو الكل فإن التسلسل يبدأ من الأول ........ وهكذا

أرجو أن تكون هذه هي المسأله المراده. إذا كانت كذلك فكلام الأخ أحمد محب صحيح وكذلك رد الأخ مصطفى

لعمل ذلك يتم عمل تريجر على الداتا بيز أو يمكن عمل تريجر على الفورم بنفس المبدأ. لنفترض أن تكوين الجدول كالآتي:

create table subscribers(subscriber_id number(25) constraint con_sub_s_id primary key,
governate_id number(1) constraint con_sub_g_id check (governate_id between 1 and 9),
city_id number(3) constraint con_sub_c_id check (city_id between 100 and 499),
block_id number(3) constraint con_sub_b_id check (block_id between 500 and 800))




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

create or replace trigger trig_sub_sub_id before insert on subscribers
for each row
declare
sub_id number(10);
begin
select nvl(max(floor(substr(subscriber_id,8))),0)+1
into sub_id
from subscribers
where governate_id=:new.governate_id
and city_id =:new.city_id
and block_id=:new.block_id;
:new.subscriber_id:=:new.governate_id||:new.city_id||:new.block_id||sub_id;
end;



بعد ذلك يمكنك إختبار التريجر وذلك بإدخال قيم المحافظه والمدينه والحى بدون إدخال رقم المشترك، هكذا:

insert into subscribers(governate_id,city_id,block_id)
values (1,100,500);



ثم تقوم بإدخال نفس هذه القيم مره أخرى على إعتبار أنك تريد إدخال مشترك جديد على نفس محافظة ومدينة وحى المشترك الأول.

ولنفترض أنك تريد إدخال مشترك جديد مع تغيير المحافظه أو المدينه أو الكل. مثال:

insert into subscribers(governate_id,city_id,block_id)
values (6,352,601);



ثم تقوم بإدخال نفس هذه القيم مره أخرى على إعتبار أنك تريد إدخال مشترك جديد على نفس محافظة ومدينة وحى المشترك السابق......... وهكذا

عند عمل جملة select سوف تظهر لك القيم بهذه الطريقه:


SUBSCRIBER_ID GOVERNATE_ID	CITY_ID   BLOCK_ID
------------- ------------ ---------- ----------
 11005001			1		100		500
 11005002			1		100		500
 11005003			1		100		500
 11005004			1		100		500
 11005005			1		100		500
 11005006			1		100		500
 11005007			1		100		500
 11005008			1		100		500
 11005009			1		100		500
110050010			1		100		500
110050011			1		100		500

SUBSCRIBER_ID GOVERNATE_ID	CITY_ID   BLOCK_ID
------------- ------------ ---------- ----------
110050012			1		100		500
110050013			1		100		500
110050014			1		100		500
 11005551			1		100		555
 11005552			1		100		555
110050015			1		100		500
110050016			1		100		500
110050017			1		100		500
 11005553			1		100		555
 11005554			1		100		555
 11005555			1		100		555

SUBSCRIBER_ID GOVERNATE_ID	CITY_ID   BLOCK_ID
------------- ------------ ---------- ----------
 11005556			1		100		555
 11005557			1		100		555
 22006001			2		200		600
 22006002			2		200		600
 11005558			1		100		555
 11005559			1		100		555
110055510			1		100		555




أتمنى أن يكون هذا هو المراد.

رابط هذا التعليق
شارك

السلام عليكم زورحم الله وبعد،
أخي العزيز ،،
جزاك الله خيرا....فعلا هذا هو المطلوب ولقد قمت بتجربته وهو يعمل بشكل صحيح
أشكرك جزيل الشكر

رابط هذا التعليق
شارك

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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