تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مساعدة في عزل قاعدة بيانات صور الموظفين في جدول منفصل .
#11
مرحباً بك مجدداً

لدينا برنامج موظفين قديم له أكثر من 10 سنوات يحمل قاعدة البيانات AllEmployees
و الزملاء لا يرغبون في إستبداله ببرنامج أخر . البرنامج ممتاز و يفي بالغرض ، ولكن ينقصه صورة الموظف فقط ,

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

و الموظفين كما تعلم يتغيرون كل فترة البعض يتقاعد أو ينقل أو يستقيل فيتم تحديث بياناتهم في البرنامج الرئيسي (AllEmployees ) وكل فترة أذهب للبرنامج و اسحب اسمائهم من جديد و أذهب لجهازي و استورد بياناتهم من قاعدة اكسس AllEmployees إلى قاعدة برنامج أنا الموضح في الرد الأول و كما تعلم أذا اضفت الصورة في نفس الجدول فـ مع التحديث الجديد سوف تنحذف الصور التي اضفتها قبل فترة ، فأنا رأيت ان اضيف جدول خاص بالصور لا يتغير في قاعدة البيانات و يكون هناك علاقة برقم الهوية مع الجدول AllEmployees وعند البحث تخرج الصورة إذا كانت موجوده مسبقاً ، أما اذا كان الموظف جديد لا يتم اظهار صورته و أقوم أنا بإضافتها .
أعتذر على الإطالة ، وإذا كان هناك حل أفضل من هذا فأرجوا تزويدي به ولك كل الشكر و التقدير
الرد }}}
تم الشكر بواسطة:
#12
حلك ممتاز جداً ...

ولكن من وجهة نظري ينقصك كود بسيط وهو :

عند استيراد البيانات الافضل بالكود تستوردها ،، وبعد انتهاء الاستيراد تقوم بالمقارنة بين الجدولين جدول الاسماء وجدول الصور بدلالة رقم الهوية

فإذا كان الموظف غير موجود تحذف صورته من جدول الصور ...

لو ترفق Structure للداتا بيز الثنتين ممكن تحصل حل يساعدك .
الرد }}}
تم الشكر بواسطة: أبووسم
#13
بالاضافة لما ذكر الأستاذ حريف برمجة

قد يكون استخدام نفس قاعدة بيانات AllEmployees مع إضافة عمود الصورة في جدول employees ولكن محتاجة زيادة تفكير،
أحاول أفهمها وأطبقها في التعديل القادم إن شاء الله.

هذه التعديل الحالى يضيف الجديد ويعدل البيانات الموجودة، أعتقد ستجد عليه ملاحظات أنتظر أن تذكرها


الملفات المرفقة
.rar   ‏‏Photo2017.rar (الحجم : 54.85 ك ب / التحميلات : 62)
الرد }}}
تم الشكر بواسطة: أبووسم , أبووسم
#14
اخي حريف اطال الله عمرك على طاعته.

لا اعرف كيف إستيراد البيانات بالكود. ممكن شرح مبسط او برنامج يوضح الطريقة. شاكر لك مرورك
الرد }}}
تم الشكر بواسطة:
#15
إذا أمكن تضع نسخة من البرنامج القديم الذي ذكرته للإطلاع، قد ينتج منه على فكرة جديدة.
الرد }}}
تم الشكر بواسطة: أبووسم
#16
(31-03-17, 03:19 AM)أبووسم كتب : اخي حريف اطال الله عمرك على طاعته.

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

آمين وياك والأعظاء جميع ،،،

هناك مصطلحات لابد الاتفاق على تسميتها .

البرنامج القديم = البرنامج المعمول قبل عشرة سنوات على كلامك .

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

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

طيب ،،، الكود يجب ان يكون في كوماند واحد (زر واحد)

الخطوة الأولى تتصل بقاعدة البيانات القديمة ،، وتخزن بيانات جدول الموظفين في داتاسيت وهذا الكود :

    'قاعدة بيانات البرنامج القديم لنفرض اسمها db1.accdb وموجودة في القرص D
    'جدول الموظفين في البرنامج القديم لنفرض اسمه tableold

كود :
        Dim conn1 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db1.accdb")
        Dim dp As New OleDbDataAdapter("select * from tableold", conn1)
        Dim ds As New DataSet
        dp.Fill(ds)
الآن بيانات جدول الموظفين للبرنامج القديم موجودة في الداتا سيت .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الخطوة الثانية تمسح بيانات الموظفين من جدول الموظفين في البرنامج الجديد (جدول الصور لا تمسح بياناته) .

 'قاعدة بيانات البرنامج الجديد لنفرض اسمها db2.accdb وموجودة في القرص D
'جدول الموظفين في البرنامج الجديد لنفرض اسمه tablenew

كود :
        Dim conn2 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db2.accdb")
        Dim cmd As New OleDbCommand
        cmd.Connection = conn2
        conn2.Open()
        'مسح بيانات جدول الموظفين في قاعدة بيانات البرنامج الجديد

كود :
        cmd.CommandText = "delete from tablenew"
        cmd.ExecuteNonQuery()
الآن مسحنا بيانات جدول الموظفين في قاعدة البرنامج الجديد .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الخطوة الثالثة تحفظ بيانات الداتا سيت في جدول الموظفين الجديد .
   'استيراد بيانات جدول الموظفين من قاعدة البرنامج القديم لقاعدة البرنامج الجديد


كود :
        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (a1,a2,a3,a4) values (@a1,@a2,@a3,@a4)"
            cmd.Parameters.AddWithValue("@a1", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@a2", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@a3", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@a4", ds.Tables(0).Rows(i).Item(3))

            cmd.ExecuteNonQuery()

        Next

        cmd.Dispose()
        conn2.Close()

        MsgBox("تم")

الآن حفظنا بيانات جدول الموظفين في قاعدة البرنامج الجديد ، واظهرنا رسالة تفيد بالإنتهاء .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ملاحظة
a1,a2,a3,a4 = أسماء الحقول في جدول بيانات الموظفين الجديد .
ولو حبيت تظيف اكثر من حقل ممكن تظيف ،، لنفرض سته حقول حيكون الكود كالتالي :



كود :
        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (id,name,phone,email,address,city) values (@id,@name,@phone,@email,@address,@city)"
            cmd.Parameters.AddWithValue("@id", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@name", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@phone", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@email", ds.Tables(0).Rows(i).Item(3))
            cmd.Parameters.AddWithValue("@address", ds.Tables(0).Rows(i).Item(4))
            cmd.Parameters.AddWithValue("@city", ds.Tables(0).Rows(i).Item(5))
            cmd.ExecuteNonQuery()

        Next

وهكذا ....



طيب حيكون في موظفين تقاعدو او فصلو ومازالت صورهم مخزنة في جدول الصور للبرنامج الجديد ،، هنا ممكن نعمل كود يقارن برقم الهوية بين الجدولين ورقم الهوية الموجود في جدول الصور وغير موجود في جدول الموظفين يقوم بحذف صورتة من جدول الصور للبرنامج الجديد ،،،

وحيكون ايضاً في موظفين جدد تقوم بإدراج صورهم من جديد .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الكود كامل :


كود :
        Dim conn1 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db1.accdb")
        Dim dp As New OleDbDataAdapter("select * from tableold", conn1)
        Dim ds As New DataSet
        dp.Fill(ds)

        Dim conn2 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db2.accdb")
        Dim cmd As New OleDbCommand
        cmd.Connection = conn2
        conn2.Open()
        cmd.CommandText = "delete from tablenew"
        cmd.ExecuteNonQuery()

        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (a1,a2,a3,a4) values (@a1,@a2,@a3,@a4)"
            cmd.Parameters.AddWithValue("@a1", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@a2", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@a3", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@a4", ds.Tables(0).Rows(i).Item(3))

            cmd.ExecuteNonQuery()

        Next

        cmd.Dispose()
        conn2.Close()

        MsgBox("تم")
الرد }}}
تم الشكر بواسطة: أبووسم , Adrees
#17
(31-03-17, 03:29 AM)مساعدة كتب : إذا أمكن تضع نسخة من البرنامج القديم الذي ذكرته للإطلاع، قد ينتج منه على فكرة جديدة.

البرنامج القديم قد تم تحزيمة و أعتقد على الفيجوال بيسك 6 و للأسف لا أستطيع أن اخذ منه سوى قاعدة البيانات فقط

-
و الأن بعد أن وضعت أنت البرنامج سوف اعدل عليه بما يناسبني و اسأل الله أن لا يحرمك الأجر على وقتك و جهدك

(31-03-17, 05:19 AM)حريف برمجة كتب :
(31-03-17, 03:19 AM)أبووسم كتب : اخي حريف اطال الله عمرك على طاعته.

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

آمين وياك والأعظاء جميع ،،،

هناك مصطلحات لابد الاتفاق على تسميتها .

البرنامج القديم = البرنامج المعمول قبل عشرة سنوات على كلامك .

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

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

طيب ،،، الكود يجب ان يكون في كوماند واحد (زر واحد)

الخطوة الأولى تتصل بقاعدة البيانات القديمة ،، وتخزن بيانات جدول الموظفين في داتاسيت وهذا الكود :

    'قاعدة بيانات البرنامج القديم لنفرض اسمها db1.accdb وموجودة في القرص D
    'جدول الموظفين في البرنامج القديم لنفرض اسمه tableold

كود :
        Dim conn1 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db1.accdb")
        Dim dp As New OleDbDataAdapter("select * from tableold", conn1)
        Dim ds As New DataSet
        dp.Fill(ds)
الآن بيانات جدول الموظفين للبرنامج القديم موجودة في الداتا سيت .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الخطوة الثانية تمسح بيانات الموظفين من جدول الموظفين في البرنامج الجديد (جدول الصور لا تمسح بياناته) .

 'قاعدة بيانات البرنامج الجديد لنفرض اسمها db2.accdb وموجودة في القرص D
'جدول الموظفين في البرنامج الجديد لنفرض اسمه tablenew

كود :
        Dim conn2 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db2.accdb")
        Dim cmd As New OleDbCommand
        cmd.Connection = conn2
        conn2.Open()
        'مسح بيانات جدول الموظفين في قاعدة بيانات البرنامج الجديد

كود :
        cmd.CommandText = "delete from tablenew"
        cmd.ExecuteNonQuery()
الآن مسحنا بيانات جدول الموظفين في قاعدة البرنامج الجديد .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الخطوة الثالثة تحفظ بيانات الداتا سيت في جدول الموظفين الجديد .
   'استيراد بيانات جدول الموظفين من قاعدة البرنامج القديم لقاعدة البرنامج الجديد


كود :
        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (a1,a2,a3,a4) values (@a1,@a2,@a3,@a4)"
            cmd.Parameters.AddWithValue("@a1", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@a2", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@a3", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@a4", ds.Tables(0).Rows(i).Item(3))

            cmd.ExecuteNonQuery()

        Next

        cmd.Dispose()
        conn2.Close()

        MsgBox("تم")

الآن حفظنا بيانات جدول الموظفين في قاعدة البرنامج الجديد ، واظهرنا رسالة تفيد بالإنتهاء .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ملاحظة
a1,a2,a3,a4 = أسماء الحقول في جدول بيانات الموظفين الجديد .
ولو حبيت تظيف اكثر من حقل ممكن تظيف ،، لنفرض سته حقول حيكون الكود كالتالي :



كود :
        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (id,name,phone,email,address,city) values (@id,@name,@phone,@email,@address,@city)"
            cmd.Parameters.AddWithValue("@id", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@name", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@phone", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@email", ds.Tables(0).Rows(i).Item(3))
            cmd.Parameters.AddWithValue("@address", ds.Tables(0).Rows(i).Item(4))
            cmd.Parameters.AddWithValue("@city", ds.Tables(0).Rows(i).Item(5))
            cmd.ExecuteNonQuery()

        Next

وهكذا ....



طيب حيكون في موظفين تقاعدو او فصلو ومازالت صورهم مخزنة في جدول الصور للبرنامج الجديد ،، هنا ممكن نعمل كود يقارن برقم الهوية بين الجدولين ورقم الهوية الموجود في جدول الصور وغير موجود في جدول الموظفين يقوم بحذف صورتة من جدول الصور للبرنامج الجديد ،،،

وحيكون ايضاً في موظفين جدد تقوم بإدراج صورهم من جديد .
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


الكود كامل :


كود :
        Dim conn1 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db1.accdb")
        Dim dp As New OleDbDataAdapter("select * from tableold", conn1)
        Dim ds As New DataSet
        dp.Fill(ds)

        Dim conn2 As New OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Data Source=D:\db2.accdb")
        Dim cmd As New OleDbCommand
        cmd.Connection = conn2
        conn2.Open()
        cmd.CommandText = "delete from tablenew"
        cmd.ExecuteNonQuery()

        For i = 0 To ds.Tables.Count - 1

            cmd.CommandText = "insert into tablenew (a1,a2,a3,a4) values (@a1,@a2,@a3,@a4)"
            cmd.Parameters.AddWithValue("@a1", ds.Tables(0).Rows(i).Item(0))
            cmd.Parameters.AddWithValue("@a2", ds.Tables(0).Rows(i).Item(1))
            cmd.Parameters.AddWithValue("@a3", ds.Tables(0).Rows(i).Item(2))
            cmd.Parameters.AddWithValue("@a4", ds.Tables(0).Rows(i).Item(3))

            cmd.ExecuteNonQuery()

        Next

        cmd.Dispose()
        conn2.Close()

        MsgBox("تم")

أخذ منك الرد الكثير من الجهد و الوقت ، اشكرك من كل قلبي و اسأل الله ان يزيدك علماً و أن ينفعنا بعلمك

جزاك الله خير و كثر من أمثالك أنت و الاخ مساعدة ،، نعم الرجال أنتم
الرد }}}
تم الشكر بواسطة:
#18
ما شاء الله أستاذ حريف برمجة متمكن من البرمجة بالكود وأيضاً طريقة الشرح، وهذا ما افتقده من مهاره.
الرد }}}
تم الشكر بواسطة: أبووسم
#19
السادة الافاضل برجاء وضع المثال لتعم الفائدة بسرعة
الرد }}}
تم الشكر بواسطة:



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


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