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

مشكلة في أخذ الـid الـجـديـد !


بو عبدالعزيز

Recommended Posts

الـسـلاااااااااام عليكم رحمه الله

أنا عندي جدول Employee ..
والـPrimary Key هـو Employee_ID
والUser لا يدخل الID .. فقط الSysytem Generate it
ويكون على هذا الشكل (Emp_1, Emp_2, ......... Emp_10)

في الdatabase .. عندي للـEmp_10
لما أطلب منه ID جديد .. يظل يعطيني Emp_10
مع العلم أن المفروض يعطيني Emp_11
وهـذا الكود المستخدم لصنع ID أتومتيكي

Select Concat('Emp_',Substr(Employee_ID,5)+1) INTO :New_Employee.Employee_ID from Employee
where Employee_ID = (Select Max(Employee_ID) from Employee);



في كل مرة .. يعتبر Emp_9 هو الـMax
يكن لأنه أخذ أول رقم (9) ... مع أنه المفروض يأخذ الرقم كامل بعد الـEmp_

أرجــو أن يكون السـؤال واضـح ..
وأن أجــد إجــابـة عندكم ...

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

الاخ / بو عبدالعزيز

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

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

Select Max(Employee_ID)+1  INTO :New_Employee.Employee_ID from Employee;



وان كنت تحتاج لتصنيف نوع الموظف ... يمكنك اضافة عمود جديد بالجدول

مع التحية

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

الأخ الفاضل ... طرقتك شغاله تمام بعد التجربه و لكنها غير فعاله و اذا اردت ان تعمل بها فيجب عليك عمل Save بعد اضافه اى موظف حتى تشعر الشاشه بأعلى رقم دائما .. اذا يجب عليك عمل Save بعد كل Record .. و لكن نصيحتى لك استخدام ال Sequence فى حالات ال PK ... بالتوفيق

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

الأخ الكريم ، أنا رأيي مع رأي الأخ Amgad ... حيث قيمة المفتاح الرئيسي من المفضل ان تكون رقمية ... ويكون نوع البيان رقمي لهدف أنه أسرع من البيانات النصية ... أما لو كنت ترغب في إنشاء حقل نصي فيمكنك إنشاء حقل إضافي تصنع به ما تشاء حسب رغبة المستخدم


علي العموم القيمة النصية تختلف عن القيمة الرقمية ... لأن الرقم 10 أقل من الرقم 9 ... ولكن الرقم 10 أكبر من الرقم 1 ... والدليل علي ذلك إذا أدرجت 20 رقم في حقل نصي وعملت عليها Order by هتلاقي التنسيق هيكون بالشكل التالي :

FLD
----------
1
10
11
12
13
14
15
16
17
18
19

FLD
----------
2
20
3
4
5
6
7
8
9



وفي هذه الحالة سيكون أكبر قيمة هو الرقم (9 ) رغم أن هناك أرقام أخري أكبر منه مثل 89 !!!

لكن لو أحببت تجعلة مرتب ترتيب رقمي تصاعدي في هذه الحالة يجب عليك تحويل القيمة النصية الي قيمة رقمية بإستخدام الدالة TO_NUMBER !!!

علي العموم أنظر الي التعديل التالي :


SELECT 'EMP_' || TRIM(NVL(MAX(TO_NUMBER(SUBSTR(EMPLOYEE_ID,5))),0) + 1)
INTO :NEW.EMPLOYEE_ID
FROM EMPLOYEE;




ملحوظة ، يمكنك إستخدام نفس الكود من داخل النموذج ولكن في حدث PRE-INSERT علي مستوي بلوك البيانات .


شكراً ، وبالتوفيق ،

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

مـشـكورين أخواني على الـردود المشجعة فعلاً ..
انا أريده حرفي لأميز الـPrimary key في كل جدول
ولو كانوا كلهم أرقام .. راح أضيع بينهم !!

على العموم ..
راح أجرب طريقة مشرفنا MMA
وإن شاء الله راح أرجع لكم بعدهااااا

لكن ممكن طلب ..
ممكن أحد يعطيني مثال لـ Pre-Insert ؟؟
أنا ولا مرة أشتغلت عليه .. لذلك أريد مثال توضيحي
لو تكرمتم أخواني .....

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

مـشـكورين أخواني على الـردود المشجعة فعلاً ..

العفور علي أية نحن جميعاً هنا أخوة فليس هناك فرق بين أحد وربنا يدوم المحبة بيننا جميعاً ( يارب العالمين )


انا أريده حرفي لأميز الـPrimary key في كل جدول
ولو كانوا كلهم أرقام .. راح أضيع بينهم !!


أنا مش فاهم بالضبط معني هذا الكلام ... بس أعتقد أن حضرتك لديك جدول يحمل جدولين يعني مثلاً جدول الفئات أو جدول ( العملاء / الموردين ) أو جدول ( الوارد / الصادر ) ... أليس كذلك ؟؟؟

يعني أنت عندك جدولين مماثلين تماماً في أسماء بياناتهم فحبيت تدرجهم في جدول واحد ومش عارف كيف تميز بين الجدولين ( أليس كذلك ) ..

علي فكرة أنا وقعت في مثل هذه المشكلة من قبل ... ولكنني وجدت حل أفضل بكثير وهو إدراج جدول واحد وبه حقل إضافي يمثل نوع البيان المدرج TYPE ... يعني مثلاً لو فردنا أن لدينا جدولين ... الأول العميل والثاني المورد كيف أميز بينهم في جدول واحد .. مثال :

CREATE TABLE CUSTOMER
(
 CUSTOMER_ID		NUMBER(10),
 CUSTOMER_TYPE		NUMBER(1),
 CUSTOMER_CODE		VARCHAR2(20),
 CUSTOMER_NAME		VARCHAR2(50),
 CONSTRAINT PK_CUSTOMER PRIMARY KEY(CUSTOMER_ID),
 CONSTRAINT UQ_CUSTOMER_CODE UNIQUE(CUSTOMER_TYPE,CUSTOMER_CODE),
 CONSTRAINT UQ_CUSTOMER_NAME UNIQUE(CUSTOMER_TYPE,CUSTOMER_NAME)
)
/

CREATE OR REPLACE TRIGGER TRG_BEFORE_CUSTOMER BEFORE INSERT OR UPDATE OR DELETE ON CUSTOMER
FOR EACH ROW
DECLARE

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



بعد كدة لو حبيت تصنع نموذج واحد يضم الإثنين يمكنك التمييز بينهم علي أساس إدراج خيار Option Radio أو مثلاً إستدعاء النموذج مع إرسال قيمة باراميتر له وتمييز بلوك البيانات علي أساسة ( أنظر المثال المرفق ) .

لكن ممكن طلب ..
ممكن أحد يعطيني مثال لـ Pre-Insert ؟؟
أنا ولا مرة أشتغلت عليه .. لذلك أريد مثال توضيحي
لو تكرمتم أخواني .....


علي فكرة حدث الـ Pre-Insert Trigger تقريباً شبية بالحدث Insert Trigger علي مستوي الجدول !!!

حتي لا أطيل عليك ، أنظر الي المرفق ... حيث يحتوي علي مثال Pre-Insert خفيف


شكراً ، وبالتوفيق

Simbles.zip

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

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

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

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

×   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.

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

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

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