تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الترقيم التلقائي في الجداول مشاكل و حلول
#1
السلام عليكم و رحمة الله و بركاته


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

لفت انتباهي موضوع الترقيم التلقائي و نقاشه بين الاعضاء
 فاغلب المبرمجين الذين يعملون مع جداول مرتبطة هم بحاجة بطريقة او باخرى الى موضوع الترقيم التلقائي لربط الجداول و سواء كان الربط عن طريق خاصية الترقيم التلقائي في الجدول الاب و توريثها للعناصر في الجدول الابن 
او كانت عن طريق ارقام مولدة من طرف البرنامج للاباء و من ثم توريثها للابناء فالامر ياخذ نفس المنحى تقريباً

بكل الاحوال الامر يحتاج للكثير من النقاش للوصول الى افضل حل , كما انه يحتاج لمثال عملي مشروح (بين جداول مرتبطة) , ليتضح الموضوع على التطبيق المباشر.

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

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

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

الفكرة الثانية و هي ان استحصل على رقم سجل الطالب قبل الحفظ و اقوم عند الحفظ بارسال التحديثات الى الجدولين الطلاب و الدفعات مرة واحدة .

موضوع المشروع العملي هنا

اما الان و لكي لا اكون قد فتحت موضوع بلا فائدة  ساقدم شرح بسيط عن الاستفادة من SQL Server في مثل هذا الامر
و تحديداً اجراء مخزن اعتمد عليه في عملية الترقيم و خصوصاً في الحالة الثانية السابق ذكرها لانها الاصعب 

الاجراء المخزن

PHP كود :
Create proc Get_Ident
 
@next_id int Output

As

DECLARE @
RowCount int =(SELECT COUNT(1FROM studant_tb 
DECLARE @Current_id int =IDENT_CURRENT('studant_tb')


    if @
RowCount=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 

الان يمكنك استدعاء الدالة في اي مكان ترغب فيه لاضافة سجل جديد او حفظه

الى ملتقى لاحق ان شاء الله مع مثال عملي يعتمد على كل العمليات على الجداول المرتبطة , وفق طريقة منظمة تعتمد على العمل الموزع على الكلاسات .
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: sendbad100 , sendbad100 , abdualla


الردود في هذا الموضوع
الترقيم التلقائي في الجداول مشاكل و حلول - بواسطة ابو ليلى - 06-04-17, 11:49 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  رقابة قاعدة البيانات (التحديث التلقائي للبيانات ) SqlDependency قناص المدينة 0 1,150 05-10-23, 04:43 PM
آخر رد: قناص المدينة
  [مشروع] حل مشكلة الترقيم التلقائي بعد حذف سجل معين mohammed alnour 9 14,661 13-01-23, 04:16 PM
آخر رد: اسلام الكبابى
  [مقال] إضافة خاصية التحجيم التلقائي - AutoSize - إلى أداة مربع النص - TextBox sooriaty03 10 12,818 21-03-21, 09:53 PM
آخر رد: عبد الهادي بهاب
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 24 16,451 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  لفهم كيفية الربط الذي يتم بين الجداول viv 4 5,409 03-10-20, 05:34 PM
آخر رد: Arfat007
  [VB.NET] استيراد وتصدير MySetting إلى ملف خارجي بطريقة صحيحة وبدون مشاكل alfaiz678 0 1,874 03-04-20, 01:40 PM
آخر رد: alfaiz678
  الغاء الحفظ التلقائي للمشروع viv 1 2,405 04-08-19, 04:13 PM
آخر رد: عبد العزيز البسكري
  العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع ابو ليلى 12 18,139 04-04-19, 10:08 PM
آخر رد: اباذر
  الفرق بين تاريخين بدقه وبدون مشاكل (عدد الايام ممتاز) ali.alfoly 1 2,555 17-12-18, 07:39 PM
آخر رد: elgokr
  الترقيم التلقائي في برامج الداتا بيز silverlight 1 2,865 07-06-16, 12:05 AM
آخر رد: silverlight

التنقل السريع :


يقوم بقرائة الموضوع: