السلام عليكم و رحمة الله و بركاته
في البداية اترحم على فقيدنا الغالي ابو ليث رحمه الله رحمة واسعه و ادخله فسيح جناته
لفت انتباهي موضوع الترقيم التلقائي و نقاشه بين الاعضاء
فاغلب المبرمجين الذين يعملون مع جداول مرتبطة هم بحاجة بطريقة او باخرى الى موضوع الترقيم التلقائي لربط الجداول و سواء كان الربط عن طريق خاصية الترقيم التلقائي في الجدول الاب و توريثها للعناصر في الجدول الابن
او كانت عن طريق ارقام مولدة من طرف البرنامج للاباء و من ثم توريثها للابناء فالامر ياخذ نفس المنحى تقريباً
بكل الاحوال الامر يحتاج للكثير من النقاش للوصول الى افضل حل , كما انه يحتاج لمثال عملي مشروح (بين جداول مرتبطة) , ليتضح الموضوع على التطبيق المباشر.
ساطرح مثالاً بسيطاً وعلى ضوئه ساناقش لاحقاً كيفية الوصول لافضل حل في استحصال الرقم التلقائي (بعد الاضافة او قبل الاضافة)
المثال الذي يراودني هو جدول للطلاب (جدول اب) و جدول مالي لاشتراكات الطلاب (جدول ابن)
نحن في العادة عندما نتعامل مع جدول اب مثل جدول الطلاب مثلاً , ومع جدول ابن مثل جدول الدفعات , و عند الحاجة لادخال دفعات الى الجدول الابن فنحن سنحتاج الى معرف الطالب لنرسله مع بيانات كل دفعة لكي لا تضيع هذه الدفعة ولا يعرف من صاحبها
الفكرة الاولى و المعروفة لدى الجميع هي انني ساقوم بحفظ الطالب اولاً و من ثم استحصال رقم الطالب و بعدها ارسل هذا الرقم مع بيانات جدول الدفعات و بهذا نكون قد ربطنا كل دفعة مع طالب و تكون قد انتهت المشكلة.
الفكرة الثانية و هي ان استحصل على رقم سجل الطالب قبل الحفظ و اقوم عند الحفظ بارسال التحديثات الى الجدولين الطلاب و الدفعات مرة واحدة .
موضوع المشروع العملي هنا
اما الان و لكي لا اكون قد فتحت موضوع بلا فائدة ساقدم شرح بسيط عن الاستفادة من SQL Server في مثل هذا الامر
و تحديداً اجراء مخزن اعتمد عليه في عملية الترقيم و خصوصاً في الحالة الثانية السابق ذكرها لانها الاصعب
الاجراء المخزن
اذا دققت في الاجراء السابق ستجد بارميتر @next_id يعيد قيمة الرقم التلقائي في الجدول مهما كانت الحالة
بالاول يفحص اذا كان عدد صفوف الجدول= الصفر و كذلك قيمة الحقل =1 , وهذه الحالة وحيدة وهي عندما يكون الجدول جديد و لم يدخل به سابقأ اي سجل
اما عن بقية الحالات فانا اقوم بالاستعلام عن قيمة حقل الترقيم عبر الدالة IDENT_CURRENT و التي تاخذ وسيطة واحدة هي اسم الجدول
و اضيف اليها مقدار الزيادة المعرفة في حقل الترقيم عبر الدالة IDENT_INCR و التي تاخذ وسيطة واحدة ايضاً وهي اسم الجدول
فلو كان مقدار الزيادة 1 في كل مرة فهي ستجمع واحد لقيمة حقل الترقيم و اذا كان 10 ستجمع 10 و هكذا
و في الاخير هي ستعيد لي القيمة التالية لحقل الترقيم التلقائي
اجراء سحري وفر علي الكثير من الدوال التي قد توقعني في مشاكل لا حصر لها
اما من ناحية البرنامج يمكنني الاستفادة من هذا الاجراء عبر دالة تنادي على الاجراء عند الحاجة له مثل عملية اضافة سجل جديد
شكل الدالة
الان يمكنك استدعاء الدالة في اي مكان ترغب فيه لاضافة سجل جديد او حفظه
الى ملتقى لاحق ان شاء الله مع مثال عملي يعتمد على كل العمليات على الجداول المرتبطة , وفق طريقة منظمة تعتمد على العمل الموزع على الكلاسات .
في البداية اترحم على فقيدنا الغالي ابو ليث رحمه الله رحمة واسعه و ادخله فسيح جناته
لفت انتباهي موضوع الترقيم التلقائي و نقاشه بين الاعضاء
فاغلب المبرمجين الذين يعملون مع جداول مرتبطة هم بحاجة بطريقة او باخرى الى موضوع الترقيم التلقائي لربط الجداول و سواء كان الربط عن طريق خاصية الترقيم التلقائي في الجدول الاب و توريثها للعناصر في الجدول الابن
او كانت عن طريق ارقام مولدة من طرف البرنامج للاباء و من ثم توريثها للابناء فالامر ياخذ نفس المنحى تقريباً
بكل الاحوال الامر يحتاج للكثير من النقاش للوصول الى افضل حل , كما انه يحتاج لمثال عملي مشروح (بين جداول مرتبطة) , ليتضح الموضوع على التطبيق المباشر.
ساطرح مثالاً بسيطاً وعلى ضوئه ساناقش لاحقاً كيفية الوصول لافضل حل في استحصال الرقم التلقائي (بعد الاضافة او قبل الاضافة)
المثال الذي يراودني هو جدول للطلاب (جدول اب) و جدول مالي لاشتراكات الطلاب (جدول ابن)
نحن في العادة عندما نتعامل مع جدول اب مثل جدول الطلاب مثلاً , ومع جدول ابن مثل جدول الدفعات , و عند الحاجة لادخال دفعات الى الجدول الابن فنحن سنحتاج الى معرف الطالب لنرسله مع بيانات كل دفعة لكي لا تضيع هذه الدفعة ولا يعرف من صاحبها
الفكرة الاولى و المعروفة لدى الجميع هي انني ساقوم بحفظ الطالب اولاً و من ثم استحصال رقم الطالب و بعدها ارسل هذا الرقم مع بيانات جدول الدفعات و بهذا نكون قد ربطنا كل دفعة مع طالب و تكون قد انتهت المشكلة.
الفكرة الثانية و هي ان استحصل على رقم سجل الطالب قبل الحفظ و اقوم عند الحفظ بارسال التحديثات الى الجدولين الطلاب و الدفعات مرة واحدة .
موضوع المشروع العملي هنا
اما الان و لكي لا اكون قد فتحت موضوع بلا فائدة ساقدم شرح بسيط عن الاستفادة من SQL Server في مثل هذا الامر
و تحديداً اجراء مخزن اعتمد عليه في عملية الترقيم و خصوصاً في الحالة الثانية السابق ذكرها لانها الاصعب
الاجراء المخزن
PHP كود :
Create proc Get_Ident
@next_id int Output
As
DECLARE @RowCount int =(SELECT COUNT(1) FROM studant_tb)
DECLARE @Current_id int =IDENT_CURRENT('studant_tb')
if @RowCount=0 And @Current_id=1
Begin
Set @next_id=1
End
else
Begin
Set @next_id=@Current_id + IDENT_INCR('studant_tb')
End
اذا دققت في الاجراء السابق ستجد بارميتر @next_id يعيد قيمة الرقم التلقائي في الجدول مهما كانت الحالة
بالاول يفحص اذا كان عدد صفوف الجدول= الصفر و كذلك قيمة الحقل =1 , وهذه الحالة وحيدة وهي عندما يكون الجدول جديد و لم يدخل به سابقأ اي سجل
اما عن بقية الحالات فانا اقوم بالاستعلام عن قيمة حقل الترقيم عبر الدالة IDENT_CURRENT و التي تاخذ وسيطة واحدة هي اسم الجدول
و اضيف اليها مقدار الزيادة المعرفة في حقل الترقيم عبر الدالة IDENT_INCR و التي تاخذ وسيطة واحدة ايضاً وهي اسم الجدول
فلو كان مقدار الزيادة 1 في كل مرة فهي ستجمع واحد لقيمة حقل الترقيم و اذا كان 10 ستجمع 10 و هكذا
و في الاخير هي ستعيد لي القيمة التالية لحقل الترقيم التلقائي
اجراء سحري وفر علي الكثير من الدوال التي قد توقعني في مشاكل لا حصر لها
اما من ناحية البرنامج يمكنني الاستفادة من هذا الاجراء عبر دالة تنادي على الاجراء عند الحاجة له مثل عملية اضافة سجل جديد
شكل الدالة
PHP كود :
Public Function New_Identity() As Integer
Dim New_ID As Integer = 0
Using Cmd As New SqlClient.SqlCommand() With {.CommandType = CommandType.StoredProcedure, .CommandText = "Get_Ident", .Connection = Con}
Dim next_id As New SqlClient.SqlParameter("@next_id", SqlDbType.Int)
next_id.Direction = ParameterDirection.Output
Cmd.Parameters.Add(next_id)
'
OpenConnect()
Cmd.ExecuteScalar()
New_ID = Cmd.Parameters("@next_id").Value
CloseConnect()
End Using
Return New_ID
End Function
الان يمكنك استدعاء الدالة في اي مكان ترغب فيه لاضافة سجل جديد او حفظه
الى ملتقى لاحق ان شاء الله مع مثال عملي يعتمد على كل العمليات على الجداول المرتبطة , وفق طريقة منظمة تعتمد على العمل الموزع على الكلاسات .
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال