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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

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


5 رد (ردود) على هذا الموضوع

#1 بو عبدالعزيز

بو عبدالعزيز

    مشترك

  • الأعضــاء
  • 137 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 01 August 2008 - 03:08 AM

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

أنا عندي جدول 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_

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

#2 Amgad

Amgad

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

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 01 August 2008 - 01:00 PM

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

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

اقترح عليك تبسيط شكل مفتاح الجدول بان تجعله نوعه رقم فقط ... بدون كتابة حروف ال emp داخل قيمة المفتاح .
- يمكنك تبسيط امر استرجاع اكبر رقم ايضا ... وان تضعه مع تريجير pre_insert على مستوى البلوك
مثال
Select Max(Employee_ID)+1  INTO :New_Employee.Employee_ID from Employee;


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

مع التحية

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


....


#3 sameh bakkar

sameh bakkar

    مشرف قسم المبتدئين

  • فريق الإشراف
  • 1,019 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 01 August 2008 - 05:43 PM

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

Sameh Bakkar

Principal Oracle Apps Techno-Functional Consultant / Oracle E-Business Suite Certified Trainer

Oracle E-Business R11 Suite Applications Workflow Certified Expert

Oracle E-Business Suite R12 HCM Certified Implementation Specialist

Oracle Certified Professional

ITIL V3 Foundation certified

Microsoft Project certified




الموقع الخاص: AppsLead | Your Honest Guide | Sameh Bakkar


#4 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 01 August 2008 - 06:42 PM

الأخ الكريم ، أنا رأيي مع رأي الأخ 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 علي مستوي بلوك البيانات .


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

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#5 بو عبدالعزيز

بو عبدالعزيز

    مشترك

  • الأعضــاء
  • 137 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 01 August 2008 - 09:27 PM

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

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

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

#6 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 02 August 2008 - 05:43 AM

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

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


انا أريده حرفي لأميز الـ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   33.34كيلو   19 عدد مرات التحميل

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )