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

primary key المدخل من قبل المستخدم كيفية التآكد من صحته

بدأه mm1122 في 5 أغسطس 2011 · 45 رد · 1,640 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخواني انا عندي نظام كلاينت سيرفر داتابيس سيسم على الاوراكل .

طبعا وجهتة البرنامج concole application .

الكلاينت يرسل الطلب الى السيرفر.

السيرفر يستقبله وينفذه ويرجع النتيجة.

العمليات المستخدمة فقط ثلاث عمليات (insert,delete,update).

وانا عندي ثلاث جداول الجدول الاول يوجد فيه primary key وباقي الجداول يوجد فيها forighe key تاخذ قيم primary key الموجود في الجدول الاول.

اذا دخل المستخدم اي مدخل خاطىء اي كان نوع الخطا فقط في العمليتين delete ,update ناتج الاستعلام يكون صفر وبذالك يظهر له خطا ولا ينهي الاتصال والبرنامج.

سؤالي كاتالي:

مشكلتي تكمن فقط في عملية insert في الجدول الاول اذا ادخل primary key كان سابقا موجود في الجدول او في باقي الجداول اذا ادخل forighe key ليس موجودا في الجدول الاول ينهي البرنامج كاملا ويظهر خطا الا وهو ناتج الاكسبشن هل يوجد طريقه بحيث ينبه المستخدم بهذا الخطا قبل تنفيذ الاستعلام حيث يمكن المستخدم ان يتدارك الخطا ويسارع في تصحيحه وشكرا.

البرنامج المقام عليه المشروع هو netbeans طبعا بلغة الجافا .

#2

ي

اقتباس
اذا ادخل primary key كان سابقا موجود في الجدول او في باقي الجداول اذا ادخل forighe key ليس موجودا في الجدول

من ضمن مهام برنامجك هي حماية قاعدة البيانات ...

بالنسبة ل موضوع ال PK... لم أصلا تجعل المستخدم هو من يقوم بإدخاله؟؟

بالنسبه لموضوع ال FK ... كيف يحصل هذا... فمن المفترض أنك تقوم بالحصول على ال PK من الجدول الأول و من ثم تقوم بإدخاله في الجدولين الثانى و الثالث ...

#3

اهلا وسهلا باخي هويدي ...

المستخدم هنا على سبيل المثال هو مدخل البيانات في الجامعة فطلاب الجدد يآتون اليه وهو يقوم بادخال بياناتهم في النظام.

بنسبة ل PK كيف اجد طريقة بحيث ال PK يتولد بشكل اتوماتيكي ولكن يحتفظ باخر قيمة انشاها اذا اغلق النظام واذا فتح يبدا بتوليد الارقام من اخر قيمة انشئت.

اما بنسبة لل FK فهمت قصدك وجاري العمل عليه .

جزيت خيرا اخي على افادتك الرائعة.

#4

الجدول الخاص بيك

مثلا فيه الاعمدة

id , name , class , degree

تمام

المفروض انك عاوز تدخل الـ name , class , degree

والـ Id يتم صنعه بشكل اوتوماتيك

انت بتعمل كدا فى عمليه الـ insert

int id = 10; 
String name= "Mahmoud Kelany";
String className = "4th";
double degree = 1437;

String inserQuery = "insert into table_name values("+ id +" ,'"+ name + "' , '" + className +"', " +  degree +")" ;
stmt.exeuteQuery(insertQuery);

الطريقه السابقه ارغمتك انك تضيف الـ id للقاعده البيانات

طب انت عاوزه يتعمل بشكل اتوماتيك

اعملها كدا

String name= "Mahmoud Kelany";
String className = "4th";
double degree = 1437;

String inserQuery = "insert into table_name (name , class , degree )  values('" +
 name + "' , '" + className +"', " +  degree +")";
stmt.exeuteQuery(insertQuery);

بكدا انت بتطلب من قاعده البيانات انها تعمل الـ id بطريقه اتوماتيكيه

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 5 أغسطس 2011 في 21:11

Software Developer
Mahmoudkelany.com


 

#5

لن تتم طريقتك بشكل صحيح اخى محمود الا عندما يضيف خاصية الزيادة التلقائية لحقل الرقم عند بناء الجدول

AUTOINCREMENT

ملحوظة : الكلمة تختلف من قاعدة بيانات الى اخرى لذا اذا كنت لاتعرف كيف تستخدمها مع قاعدة البيانات تبعك فابحث عنها فى توثيق قاعدة البيانات database documentation


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#6

نسيت اقولها

على اعتبار انى بعملها على طول فالـ MySQL

معلش :)

شكرا ع التنبيه

Software Developer
Mahmoudkelany.com


 

#7

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

لا اظن ان جعل نافذة تسجيل الطالب تحتوى على الاسم والدرجة فقط وتخفى الرقم امر جيد :)

طبعا اخفاء الرقم ضرورة لانك كمبرمج لاتعرف ما الرقم الذى عليه الدور (التالى)

صادفت هذه المشكلة من قبل وكان حلها كتابة دالة تعود باكبر رقم فى الجدول وازيد عليه 1 واكتب القيمة فى حقل الرقم

@SuppressWarnings({"unchecked", "boxing"})
    public static int getNextOperationId() throws DaoException {
        int newid = 0;
        try {

            Session session = HibernateHelper.getSession();// connect
            Query qu = session.createQuery("select max(o.oid) from Operation o");
            List<Integer> results = qu.list();
            if (!results.isEmpty()) {
                newid = results.get(0);
            }

            return newid + 1;
        } catch (HibernateException he) {
            throw new DaoException(
                    "The DAO could not find the named OperationId", he);
        } catch (Exception e) {
            throw new DaoException(
                    "The DAO could not find the named OperationId", e);
        }

    }

وعند الحفظ اتأكد ان الرقم غير موجود فى الجدول

@SuppressWarnings("unchecked")
    public static boolean operationIdFound(int oid) throws DaoException {

        try {

            Session session = HibernateHelper.getSession();// connect
            Query qu = session.createQuery("from Operation o where :oid=o.oid");
            qu.setInteger("oid", oid);
            List<Operation> results = qu.list();
            if (!results.isEmpty()) {
                return true;
            }

        } catch (HibernateException he) {
            throw new DaoException(
                    "The DAO could not find the named OperationId", he);
        } catch (Exception e) {
            throw new DaoException(
                    "The DAO could not find the named OperationId", e);
        }
        return false;
    }

طبعا يجب الغاء الخاصية AUTOINCREMENT من على حقل الرقم فى قاعدة البيانات حتى لا تحدث مشاكل

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 6 أغسطس 2011 في 02:00


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#8

تفتكر انه هيفيده ف حاجه الرقم ؟؟

االا اذا كان هو عاوز كدا

تمام داله كويسه بس براحه شويه انت دخلت الراجل فى الهيبرنيت كدا :)

اكيد فى الحاله دى هتلغى

الـ @GeneratedValue

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 6 أغسطس 2011 في 02:28

Software Developer
Mahmoudkelany.com


 

#9
اقتباس

تفتكر انه هيفيده ف حاجه الرقم ؟؟

االا اذا كان هو عاوز كدا

الاجابة :

اقتباس

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

لا اظن ان جعل نافذة تسجيل الطالب تحتوى على الاسم والدرجة فقط وتخفى الرقم امر جيد :)

المستخدم يجب ان يعرف رقم الطالب الذى سجله لانه سيستخدمه فى البحث مستقبلا

والدوال كمثال فقط


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#10

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

#11

@محمد فتحى ..

ما تقول به هو التالى:

1- يقوم الطالب بفتح الشاشه التى يسجل فيها بياناته

2- نقوم بإحضار أكبر رقم من قاعدة البيانات و إضافه 1 عليه و من ثم إظهاره للطالب على أنه رقمه

3- يقوم الطالب بكتابة بياناته و من ثم يضغط الزر "Save"

4- نقوم بأخذ بيانات الطالب .. بما فيها ال ID الذي قمنا بحسابه في الخطوه 2 و تسجيله في قاعدة البيانات - بعد التأكد من أن الرقم مازال خاليا ..

طب ماذا لو أن الرقم من يعد خاليا ؟ ماذا لو أن هذا السيناريو حدث:

1- يقوم الطالب (أ) بفتح الشاشه التى يسجل فيها بياناته

2- نقوم بإحضار أكبر رقم من قاعدة البيانات و إضافه 1 عليه و من ثم إظهاره للطالب (أ) على أنه رقمه - وليكن الرقم 10 + 1 = 11

3- يقوم الطالب (ب) بفتح الشاشه التى يسجل فيها بياناته

4- نقوم بإحضار أكبر رقم من قاعدة البيانات و إضافه 1 عليه و من ثم إظهاره للطالب (ب) على أنه رقمه - وليكم الرقم 10 + 1 = 11 (ايضا)

5- يقوم الطالب (ب) بكتابة بياناته و من ثم يضغط الزر "Save"

6- نقوم بأخذ بيانات الطالب (ب) .. بما فيها ال ID الذي قمنا بحسابه في الخطوه 2 و تسجيله في قاعدة البيانات - بعد التأكد من أن الرقم مازال خاليا .. (سيتم تخزين الرقم 11 في هذه الحاله)

7- يقوم الطالب (أ) بكتابة بياناته و من ثم يضغط الزر "Save"

8- نقوم بأخذ بيانات الطالب (أ) .. بما فيها ال ID الذي قمنا بحسابه في الخطوه 2 و تسجيله في قاعدة البيانات - بعد التأكد من أن الرقم مازال خاليا .. (سنجد أن الرقم 11 محجوز في هذه الحاله)

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

لذا إن كان البرنامج Web أو multi-user ... يجب وضع هذه النقطه في الإعتبار ..

#12

@هويدى

اقتباس

وعند الحفظ اتأكد ان الرقم غير موجود فى الجدول

واذا كان موجودا تظهر رسالة للمستخدم بانه رقم مكرر ويمكن ان يقوم المستخدم بزيادة الرقم بنفسه (الحقل editable)

واما ان ازيده انا برمجيا +1 فقط

من لديه حل افضل فليعرضه لكن لا احد يقنعنى ان نخفى رقم الطالب من شاشة التسجيل :)


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#13
MOHAMED FATHEI كتب:

من لديه حل افضل فليعرضه لكن لا احد يقنعنى ان نخفى رقم الطالب من شاشة التسجيل :)

هو انت لم بتسجل فى منتدى مثلا

بتدخل رقمك ؟؟

اللى هو رقمك فى البروفيل

يعنى انا مثلا رقمى كدا

217802

هل انا اللى دخلته ؟

ولا انا دخلت بياناتى وبعدين هو ظهر لى البروفيل فعرفت انى اخدت الرقم الفلانى

طب ما الطالب يسجل وفى الاخر يقوله تم التسجيل ورقمك كذا

Software Developer
Mahmoudkelany.com


 

#14
اقتباس
طب ما الطالب يسجل وفى الاخر يقوله تم التسجيل ورقمك كذا

و خلصنا ياعم فتحى ...

#15
اقتباس

و خلصنا ياعم فتحى ...

ههههههههه صح كلامكم طبعا صح 100%

لكن انتم تتكلمون عن التسجيل فى منتدى وانا اتكلم عن نظام مبيعات ومشتريات مثلا

عند محاولة المستخدم اضافة فاتورة مبيعات جديدة (بعد الحفظ هنقوله كان رقمها كذا !!!!!)

فى الاوراكل تحجز الرقم للفاتورة بمجرد فتحها معتمدة على الاستعلام

select for update

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

ولا ايه رأيكم ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#16

وايه المشكله لم يعرف رقم فاتورته بعد ما يتم تسجيله

يمكن اصلا يرجع ف كلامه يقبى انا حجزت الرقم على الفاضى

وبعدين ايه المشكله هو هياخد رقم مميز يعنى هههههههههه

ما اى رقم وخلاص هو هياخده

هاطلب منه هو عاوز ايه وكل حاجه

واقوله تمام ايوه تمام حساب حضرتك كذا

واروح طابع الفاتوره باللى حصل

فالرقم هيظهر فى الفاتوره , وكل شىء انتهى

لكن بدال انت عاوز تعمل اقفال على قاعده البيانات علشان عميل هيشترى منك

وشويه يقولك متاسف مممكن تتغير لى دى

وبعدين تمسكوا فى بعض ويسيبك ويمشى

يقبى انت ضيعت وقعت على الفاضى وحجزت له رقم كان مممكن غيره ياخده ويمشى على طول

فالاحسن انه يخليه ياخد رقمه بعد ما يخلص دا يضمن انه سجل خلاص

هاقولك على حاجه انت لم بتروح المرور علشان ترخص سياره

كان زمان انت اللى بتختار الرقم

انما دلوقتى يطلب منك بياناتك يا استاذ ( دخل على الكمبيوتر تك تك )

يقولك رقم حضرتك كذا

ليه الرقم دا بالذات لانه خلاص حضرتك سجلت والكمبيوتر خصص لك الرقم دا تبع سيارتك

بعدت لك خالص عن المنتديات

عاوز امثله تانيه ROFL.gif

Software Developer
Mahmoudkelany.com


 

#17

ماشى يابتاع المرور انا معاك

افترض انك قمت لتوك بتسجيل طالب جديد مثلا

طبعا شاشة التسجيل فيها حقل فارغ للرقم وبعد عملية الحفظ مثلا الطالب تم تسجيله بالرقم 23564 مثلا

وبعدين الطالب سألك رقمى كام يابيه ؟

هتعرفه ازاى يا محمود (اعطنى مثال بال pseudo code)


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#18
MOHAMED FATHEI كتب:

ماشى يابتاع المرور انا معاك

افترض انك قمت لتوك بتسجيل طالب جديد مثلا

طبعا شاشة التسجيل فيها حقل فارغ للرقم وبعد عملية الحفظ مثلا الطالب تم تسجيله بالرقم 23564 مثلا

وبعدين الطالب سألك رقمى كام يابيه ؟

هتعرفه ازاى يا محمود (اعطنى مثال بال pseudo code)

اتفضل

Register Users.zip

احنا مش بتوع الـ pseudo code

احنا بتوع الكود ROFL.gif

Software Developer
Mahmoudkelany.com


 

#19

اذا انت تعتمد على ان اسم العميل مثلا غير مكرر

long userid = usersService.selectOne(username).getUserid();

ماشى هذه فى العملاء ماذا عن فاتورة المبيعات ؟

يمكن تسجيل اكثر من فاتورة لنفس العميل فى نفس اليوم بنفس الاصناف

اقتباس

احنا مش بتوع الـ pseudo code

احنا بتوع الكود Posted Image

ال pseudo code اسهل يابتاع الكود :)


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#20
MOHAMED FATHEI كتب:

اذا انت تعتمد على ان اسم العميل مثلا غير مكرر

long userid = usersService.selectOne(username).getUserid();

ماشى هذه فى العملاء ماذا عن فاتورة المبيعات ؟

يمكن تسجيل اكثر من فاتورة لنفس العميل فى نفس اليوم بنفس الاصناف

ال pseudo code اسهل يابتاع الكود :)

هيكون بقا عندك جدول تانى مرتبط بعلاقه one to many

هتربط الفاتوره رقم مثلا 234 بالمستخدم 1

وهيجى يسجل تانى هرتبط الفاتوره رقم 240 معاه تانى

عادى يعنى

المفروض انك هتبحث عن اسمه او لو عارف رقمه هتطلبه منه

وبعدها تدخله وتعمل اضافه للفاتوره

والفاتوره هتوضع فى جدول الفواتير وهيكون ليها id وليها FK من العميل

اعملك مثال ههههه ROFL.gif

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 6 أغسطس 2011 في 19:38

Software Developer
Mahmoudkelany.com


 

#21
اقتباس

هتربط الفاتوره رقم مثلا 234 بالمستخدم 1

ايوة انا بقى عايز اعرف انت عرفت ازاى انها 234 ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#22
MOHAMED FATHEI كتب:

ايوة انا بقى عايز اعرف انت عرفت ازاى انها 234 ؟

ما انت هتعرف رقمها فى التقرير اللى هيطلع علشان تطبعه

انا بقولك مثلا هيكون رقمها كدا يعنى دا الرقم اللى عليه الدور

وهتظهر لك فالتقرير

هتقوله يا فندم عاوز ايه هيقولك عاوز اشترى كذا كذا

هتروح واخد اسمه او رقمه

وبعدين تدخله هيظهر لك البيانات بتاعته تعمل اضافه فاتوره

هتظهر لك انت عاوز تضيف ايه

تعمل ليها اضافه

يظهر لك التقرير اللى هو شكل الفاتوره نفسها تعمل print

تديها ليه هو كدا هيعرف رقمها

او ممكن لو ليه حساب بقا ويعرف يدخل على السوبر ماركت من على الويب

يدخل يشوف الفواتير بتاعته وتظهر له رقم الفاتوره وامتى وحصل فيها ايه

Software Developer
Mahmoudkelany.com


 

#23

اخواني انا بديت اطبق في فكرة اخي هويدي بنسبة ل FK اني اعرض للمستخدم جدول الاب(pk) ولكن واجهتني مشكلة اني كيف احدد عدد الصفوف في resultset حتى يمكنني ايقاف اللوب في كلاس الكلاينت والتي بدأت مع لوب السيرفر

(اللوب لنقل البيانات من السيرفر للكلاينت ) .

جربت الفنكشن getRow() ولكن القيمة التي ترجعها هي صفر على الرغم من ان الجدول يحمل صفوف في داخله وشكرا.

#24

جرب هذه الطريقه على الـ ResultSet الخاصه بيك

ResultSet rs ;

    	int size = 0;
    	if (rs != null) {
        	rs.beforeFirst();
        	rs.last();
        	size = rs.getRow();
    	}
    	System.out.println(size);

Software Developer
Mahmoudkelany.com


 

#25

size رجعلي صفر على الرغم من ان فيه صفوف.

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