تقييم الموضوع :
  • 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[email protected]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
#2
تسلم الله يعطيك الف عافية

الله يرحم ابو ليث ويغفر له ويجعل مثواه الجنة
السلام عليكم  احبائي 
بسبب انشغالي  قل  عطائي  -- اعتذر منكم  --  وسال الله العلي القدير  ان لا يشغلنا الا بطاعته.
اشكر كل الاخوة في المنتدى الرائع الذين ساعدوني خاصة والذين يساعدون الجميع -- اسال الله العلي القدير ان يكتب اجرهم مضاعفا ويرزقهم الجنة.
الرد
تم الشكر بواسطة: abdualla , ابو ليلى
#3
السلام عليكم أخي العزيز ورحمة الله وبركاته
شكرا لكم أخي العزيز أبو ليلى على هذه المعلومات القيمة، ولكن أحب أن أقول أن تقنية LinQ تختصر هذا الموضوع على الشكل التالي :
PHP كود :
List<EmployeeEmp db.Employees().ToList();
            if (
Emp.Exists(=> c.ID == int.Parse(txtId.Text)))
            {
                
int maxId doctor.DefaultIfEmpty().Max(=> == null c.ID 1);
                
txtId.Text maxId.ToString();
            } 
إسرائيل إلى زوال ... وسوف تثبت الأيام ذلك ... قريباً إن شاء الله.
الرد
تم الشكر بواسطة: abdualla , ابو ليلى
#4
(08-04-17, 12:27 AM)khodor1985 كتب : السلام عليكم أخي العزيز ورحمة الله وبركاته
شكرا لكم أخي العزيز أبو ليلى على هذه المعلومات القيمة، ولكن أحب أن أقول أن تقنية LinQ تختصر هذا الموضوع على الشكل التالي :
PHP كود :
List<EmployeeEmp db.Employees().ToList();
 
           if (Emp.Exists(=> c.ID == int.Parse(txtId.Text)))
 
           {
 
               int maxId doctor.DefaultIfEmpty().Max(=> == null c.ID 1);
 
               txtId.Text maxId.ToString();
 
           

اهلا بك اخي خضر , تمام كلامك ولذلك انا اشرت في نهاية الموضوع للكلاسات بالتحديد لان تقنية Ling To Sql تقوم بتمثيل الجداول و كائنات القاعدة على شكل كلاسات في قلب البرنامج لتصبح داعمة للواجهات IBinding List  و بالتالي تصبح Ling قادرة على التعامل مع كائنات داخل البرنامج ممثلة بكلاسات حتى Stored Prouceder تتحول الى دوال و انت ادرى و اخبر بما يتم بالخلفية من امور

هدفي في المرة المقبلة ان احيانا الله ان ادخل الى قلب العملية بتاسيس كلاس خاص بهذه العمليات يحاكي عمل تقنية Ling و لكن عن طريق Ado.net و توريث العمل الى كلاسات خاصة بكل كائن وصولاً لفهم جزئي لعمليات التغليف و تقديم حل مرضي و قابل للتطوير 
حتى يسهل على الاعضاء الذين ما زالو يرون ان التقنيات الجديدة مثل Ling To Sql او Entity هي تقنيات صعبة الفهم , بل على العكس تماماً هي اختصرت عليك الكثير من الجهد عبر مكاتبها و اصبح العمل اسهل و اقوى و اصبحت تملك السيطرة على كل كائنات القاعدة و تتعامل معها كما لو انها عناصر داخل برنامجك.

الى الملتقى ان شاء الله

(07-04-17, 11:14 PM)sendbad100 كتب : تسلم الله يعطيك الف عافية

الله يرحم ابو ليث ويغفر له ويجعل مثواه الجنة

عافاك الله من كل مكروه , و رحم الله من كان اجتماعنا هنا بسببه 
رحمك الله يا ابا ليث و غفر لك
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: abdualla , khodor1985 , khodor1985 , Amir_alzubidy
#5
رحم الله ابو ليث وغفر له

تسلم ويعطيك العافية

ممكن مثال على ذلك يا ابا ليلى رحمنا ورحمك الله
Mish3l
الرد
تم الشكر بواسطة: ابو ليلى , abdualla , abdualla
#6
الله يرحمه و يطيب ترابه
و الله ثم و الله ان غيابه عاااز علي يا ابو ليلى و موجع قلبي
لكن هذا قضاء الله و لا حول و لا قوة الا بالله العلي العظيم .
الرد
تم الشكر بواسطة: ابو ليلى , abdualla , abdualla
#7
بسم الله الرحمن الرحيم
كل من عليها فان   و يبقى وجه ربك ذو الجلال و الاكرام
يعز علينا جميعاً فراقه لقد كان منارة لنا جميعاً
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: abdualla , Amir_alzubidy , Amir_alzubidy


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مشروع] حل مشكلة الترقيم التلقائي بعد حذف سجل معين mohammed alnour 7 1,277 13-11-17, 06:26 PM
آخر رد: sendbad100
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 18 1,204 22-04-17, 02:27 AM
آخر رد: ابو ليلى
  العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع ابو ليلى 10 2,825 23-06-16, 01:13 PM
آخر رد: yasser_72
  الترقيم التلقائي في برامج الداتا بيز silverlight 1 628 07-06-16, 12:05 AM
آخر رد: silverlight
  [مقال] إضافة خاصية التحجيم التلقائي - AutoSize - إلى أداة مربع النص - TextBox sooriaty03 9 3,784 11-02-16, 10:47 PM
آخر رد: العواد الصغير

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم