الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

pre-insert

مغلق
بدأه shayma'a في 22 مايو 2003 · 13 رد · 2,173 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الإخوة اعضاء المنتدى

قمت ببناء cursor في ال pre-insert ليقوم بقراءة الحقول على الشاشة ويمنع تكرار السجلات

أود السؤال عن كيفية الإستعاضة عن pre-insert في البرنامج

بمعنى آخر... ال pr-insert ينطلق عند ال commit والبرنامج لدي

يقوم المستخدم بإدخال عدد كبير من ال records وفي بعض الأوقات

ونتيجة السرعة في الإدخال يتم تكرار بعض السجلات وعند ال commit ينطلق

ال pr-insert ويقوم بمنع عملية التخوين نتيجة التكرار

وفي هذه الحالة يضطر المستخدم للبحث عن التكرار وتعديله

كيف يمكن أن أقوم بفحص كل record إذا كان مكرر أم لا بالمقارنة مع بقية السجلات

السابقة له على نفس الشاشة

أرجو أن تكون الفكرة واضحة ... والملف المرفق يمكن أن يوضح المطلوب

pre_insert.zip

#2

يا اخي الكريم حط كود الموجود في per insert في ترقر ثاني اسمة whan vaild record طبعا على مستوى block

ميزة انة يشيك على مستوى كل ادخال سطر

ولك تحياتي

#3

سلام

افضل طريقة للتأكد من عدم التكرار هي استخدام (RECORD GROUP) بس للأسف انه استخدام صعب شوي . بس هاي مثال عنه بتمنى انه يساعد

اولا ابني ال(RECORD GROUP) و الافضل عند الخول على الشاشة من خلال ال (TRIGGER) اللي اللي اسمه (WHEN-NEW-FORM-INSTANCE) :

DECLARE

RC RECORDGROUP;

COL GROUPCOLUMN;

BEGIN

RC := CREATE_GROUP('FADI');

COL := ADD_GROUP_COLUMN('FADI','A1',NUMBER_COLUMN);

COL := ADD_GROUP_COLUMN('FADI','A2',CHAR_COLUMN );

COL := ADD_GROUP_COLUMN('FADI','A3',CHAR_COLUMN );

END;

بعدين بنقارن القيم المدخلة في (RECORD) على الشاشة مع الموجود في (RECORD GROUP) اذا كان موجود ممكن نعطيه (MESSAGE) بوجود تكرار .و اذا مش موجود بضيفه على (RECORD GROUP) علشان نقاران معه في السطر الجاي .. :

--------------------------------

-- التاكد ان السطر مكرر ام لا

FOR I IN 1 .. GET_GROUP_ROW_COUNT('FADI') LOOP

IF GET_GROUP_NUMBER_CELL('FADI.A1',I) = :BLOCK_NAME.COLUMN_NAME_1

AND GET_GROUP_CHAR_CELL('FADI.A2',I) = :BLOCK_NAME.COLUMN_NAME_2

AND GET_GROUP_CHAR_CELL('FADI.A3',I) = :BLOCK_NAME.COLUMN_NAME_3

AND I <> :SYSTEM.TRIGGER_RECORD THEN

MESSAGE('هذا السجل مدخل مسبقاً');

RAISE FORM_TRIGGER_FAILURE;

END IF;

END LOOP;

----------------------------------

-- إذا لم يكن موجود يتم ادخاله لتتم عملية المقارنة معه في السطر التالي

IF GET_GROUP_ROW_COUNT('FADI') < :SYSTEM.TRIGGER_RECORD THEN

ADD_GROUP_ROW('FADI',:SYSETM.TRIGGER_RECORD);

END IF;

SET_GROUP_NUMBER_CELL('FADI.A1',:SYSTEM.TRIGGER_RECORD,:BLOCK_NAME.COLUMN_NAME_1);

SET_GROUP_CHAR_CELL ('FADI.A2',:SYSTEM.TRIGGER_RECORD,:BLOCK_NAME.COLUMN_NAME_2);

SET_GROUP_CHAR_CELL ('FADI.A3',:SYSTEM.TRIGGER_RECORD,:BLOCK_NAME.COLUMN_NAME_3);

#4

لاحظ انه الكود الخاص بالمقارنة ممكن يكون موجود في (WHEN-VALIDATE-RECORD) يعني بعد ما يخلص من الركود بتم عملية المقارنة ...

فادي

#5

شكراً جزيلاً أخي الكريم فادي

بالفعل أنها طريقة فعالة مئة بالمئة وأفضل من استخدام ال cursor

شكراً لك مرة أخرى

#6

الأخت شيماء ....

الطرق التي ذكرت سابقاً سوف تؤدي الى نتائج صحيحة بلا شك ولكنها للأسف الشديد (عك) طبعاً الكلمة الأخيرة باليمني ....

فقط فعلي خاصية

enforce primary key

واستخدمي الاجراء

check_record_uniquness

وسوف يعطي الديفلوبر رسالة خطأ عند السجل المكرر

سواءً كان هذا التكرار بالمقارنة مع السجلات الموجودة في الdata base

أو في السجلات الثي لم تحفظ بعد (في حالة multi-records Block)

حمود الحطامي

huttami@hotmail.com

#7

سلام

شكرا اخ حطامي على المعلوملة...

و شكرا على الرد اللطيف .... :rolleyes:

#8

بس >>> لا تنسى انه هالطريقة بتيشك عند ال(COMMIT) فقط و مش على مستوى كل (RECORD) او على مستوى (ITEM)>>>

Fadi

#9

الأخ الكريم

الطريقة التي ذكرتها هي أفضل الطرق على الأطلاق ...

وليش ...

لانه مافيش كود زيادة ووقت يهدر ....

وهي تعمل عند ال commit اذا لم تستدعي أنت الاجراء

check_record_uniqueness

ممكن تستدعي هذا الاجراء عند الضعط على زر الحفظ قبل ال commit

وهو يعمل

single-record block

و

multi-record block

أتمنى لك التوفيق

حمود الحطامي

huttami@hotmail.com

#10

الاخ العزيز حمود

ارجو انك ما تكون زعلت .. اتمنى انه الموضوع ما يتعدا نطاق النقاش مش اكثر و لا اقل .. و يا ريت اتعرف عليك اكثر اذا ممكن و يا ريت انك تراسلني على ايميلي ...

مع تحياتي

اخوك فادي

تم تعديل هذه المشاركة بواسطة فيصل الحربي في 22 نوفمبر 2011 في 22:17

#11

الإخوة الأفاضل ...

من الجميل أن نتشارك الآراء والحلول للوصول الى الحل الأفضل

وعلى ما أظن أن هذا هو الهدف الأساسي للمنتدى

وفي الحقيقة ال BLOCK لدي هو عبارة عن DETAILS BLOCK وهو يحتوي على

FOREIGN KEYS فقط ولا أحتاج أن يكون فيه PRIMARY KEYS .. ولكن هنا

إحتجت في هذه الحالة أن يقوم بالفحص على مستوى ال FORM فقط

كإجراء مطلوب في العمل

وكما ذكرت سابقاً استعملت تريجر PRE-INSERT وهو لا ينطلق إلا في حالة

ال COMMIT فقط وهنا قد يكون المستخدم أدخل حوالي 100 سجل وفي هذه الحالة يضطر للتشييك على جميع السجلات على الشاشة ليتفادى التكرار

أرجو أن تكون الفكرة واضحة .. وأشكركم جزيلاً على الحلول التي قدمتموها وعلى تعاونكم في تقديم

أفضل الحلول ... شكراً مرة أخرى

#12

طبعاً مش زعل أبداً .... أبداً

بس حبيت أو ضح ...

وان شاء الله تكون معلومة مفيدة ...

وأ قول لك وللأخت شيماء

يجب أن تستخدموا

الدوال التي يوفرها الديفلوبر للحصول على أداء أفضل

حمود الحطامي

مصمم و مطور نظم

يمن سوفت المحدودة

huttami@hotmail.com

#13

سلام

شكرا اخي حمود و شكرا لإلك اخت شيماء

و ان شاء الله نبقى على تواصل دايماً .. وهاي بذكرك من جديد بايملاتي و رقم التلفون

تم تعديل هذه المشاركة بواسطة فيصل الحربي في 22 نوفمبر 2011 في 22:17

#14

الاخ الفاضل صاحب المشاركة :

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

يمكن يا اخى الفاضل ان تضع هذا الكود داخل When_validate_item

بالنسبة لعنصر المطلوب فحصه

ويجب رفع وحدة التحقق وهى خاصية بالنسبة للنموذج نفسه

يجب رفعها الى مستوى Record

ولك تحياتى

اسامه سليمان

القاهرة

(f)(f)

هذا الموضوع مغلق.

مواضيع مشابهة