هل يمكنني مقارنة بين ms-access الملفات ؟ [مغلقة]
سؤال
أريد مقارنة بين ms-access .mdb الملفات للتأكد من أن البيانات التي تحتوي هو نفسه في كل.
كيف يمكن أن أفعل هذا ؟
المحلول
لقد فعلت هذا الشيء في رمز مرات عديدة معظمها في الحالات التي يكون فيها المحلية MDB في حاجة إلى تطبيق التحديثات على أنها مستمدة من البيانات المدخلة على موقع على شبكة الإنترنت.في حالة واحدة الموقع كان مدفوعا MDB في الآخرين ، كانت قاعدة بيانات MySQL.بالنسبة MDB, نحن فقط تحميل, الخلية, قمنا بتشغيل البرامج النصية على موقع التصدير FTP الملفات النصية.
الآن النقطة الرئيسية هي أن أردنا المقارنة بين البيانات المحلية MDB إلى البيانات التي تم تحميلها من موقع تحديث المحلية MDB لتعكس التغييرات التي أدخلت على الموقع (لا, لم يكن من الممكن استخدام مصدر بيانات واحد -- كان أول شيء أنا اقترح ، ولكن لم يكن ذلك ممكنا).
دعونا ندعو MDB على قاعدة البيانات المحلية الخاصة بك ، MDB ب واحد كنت تحميل للمقارنة.ماذا لديك للتحقق من:
السجلات التي توجد في MDB ولكن ليس في ب. MDBهذه قد تكون أو لا تكون المرشحين الحذف (هذا سيعتمد على بيانات معينة).
السجلات التي توجد في MDB B ولكن ليس في أ. MDBهذه سوف إلحاق من MDB ب إلى أ. MDB
السجلات الموجودة في كليهما ، والتي سوف تحتاج إلى أن تكون مقارنة مجال من مجال.
خطوات #1 و #2 إلى حد ما يتحقق بسهولة مع الاستعلامات التي تستخدم الخارجي الانضمام إلى العثور على المفقودين السجلات.الخطوة 3 يتطلب بعض التعليمات البرمجية.
المبدأ الكامن وراء رمز هو أن هيكل كافة الجداول في كل من المصارف الإنمائية المتعددة الأطراف متطابقة.لذا يمكنك استخدام DAO السير على مجموعة TableDefs فتح مجموعة سجلات والسير مجموعة الحقول إلى تشغيل SQL على كل عمود من الجدول كل ذلك إما بتحديث البيانات أو النواتج قائمة من الاختلافات.
الهيكل الأساسي وراء رمز:
Set rs = db.OpenRecordset("[SQL statement with the fields you want compared]")
For Each fld In rs.Fields
' Write a SQL string to update all the records in this column
' where the data doesn't match
strSQL = "[constructed SQL here]"
db.Execute strSQL, dbFailOnError
Next fld
الآن التعقيد الرئيسية هنا هي أن جملة WHERE في كل مجال يجب أن تكون مختلفة -- حقول النص تحتاج إلى أن تعامل بشكل مختلف عن رقمية حقول البيانات.لذلك عليك ربما تريد تحديد الحالة أن يكتب جملة WHERE على أساس نوع الحقل:
Select Case fld.Type
Case dbText, dbMemo
Case Else
End Select
سوف تحتاج إلى استخدام Nz() لمقارنة حقول النص ، ولكن كنت استخدم نيوزيلندي(الحقل النصي,") من أجل ذلك ، في حين أن استخدام نيوزيلندي(NumericField,0) للحقول الرقمية أو حقول التاريخ.
بلدي رمز المثال لا تستخدم في الواقع هيكل أعلاه إلى تحديد جملة WHERE لأنها تقتصر على المجالات التي تعمل بشكل جيد جدا مقارنة متصلا مع ZLS (حقول النص).ما هو أقل معقد جدا من خلال قراءة, لكنه في الأساس التوسع على هيكل أعلاه.
كان مكتوب في الكفاءة من التحديثات منذ ينفذ SQL التحديث لكل حقل من الجدول الذي هو أكثر كفاءة بكثير من تنفيذ SQL التحديث لكل صف.إذا من ناحية أخرى كنت لا تريد أن تفعل التحديث, ولكن نريد قائمة من الاختلافات ، قد تعامل كل شيء بشكل مختلف.ولكن الذي يحصل معقدة جدا اعتمادا على الإخراج ،
إذا كنت تريد أن تعرف إذا كان اثنين من المصارف الإنمائية المتعددة الأطراف متطابقة ، سوف تحقق أول عدد السجلات في كل الجدول الأول و إذا كان لديك واحدة غير مطابقة تستقيل و تخبر المستخدم أن المصارف ليست هي نفسها.إذا كان recordcounts هي نفسها ، ثم عليك أن تحقق هذا المجال من خلال المجال الذي أعتقد أنه هو أفضل إنجاز مع عمود قبل العمود كتب SQL بشكل حيوي -- في أقرب وقت واحد من الناتج SQL يختار عوائد 1 أو أكثر من السجلات ، إحباط ولا تخبر المستخدم أن المصارف ليست متطابقة.
الجزء معقدة إذا كنت ترغب في تسجيل الاختلافات و إعلام المستخدم ، ولكن الخوض في هذا سيجعل هذا بالفعل-لا تنتهي بعد حتى لفترة أطول!
ما يلي هو مجرد جزء من التعليمات البرمجية من أكبر روتين التحديثات التي تم حفظها الاستعلام qdfOldMembers (من MDB أ) مع البيانات من qdfNewMembers (من MDB ب).الحجة الأولى ، strSQL, هو عبارة SELECT التي تقتصر على الحقول التي تريد المقارنة ، في حين strTmpDB هو المسار/اسم الملف الآخر MDB (MDB ب في مثالنا).التعليمات البرمجية يفترض أن strTmpDB وقد qdfNewMembers و qdfOldMembers تم إنشاؤها مسبقا (رمز الأصلي يكتب المحفوظة QueryDef على الطاير).فإنه يمكن بسهولة مثلما يتم المباشرة الجدول أسماء (السبب الوحيد الذي يمكنني استخدام حفظ الاستعلام لأن fieldnames لا تتطابق تماما بين اثنين من المصارف الإنمائية المتعددة الأطراف كان مكتوب).
Public Sub ImportMembers(strSQL As String, strTmpDB As String)
Const STR_QUOTE = """"
Dim db As Database
Dim rsSource As Recordset '
Dim fld As Field
Dim strUpdateField As String
Dim strZLS As String
Dim strSet As String
Dim strWhere As String
' EXTENSIVE CODE LEFT OUT HERE
Set db = Application.DBEngine(0).OpenDatabase(strTmpDB)
' UPDATE EXISTING RECORDS
Set rsSource = db.OpenRecordset(strSQL)
strSQL = "UPDATE qdfNewMembers INNER JOIN qdfOldMembers ON "
strSQL = strSQL & "qdfNewMembers.EntityID = qdfOldMembers.EntityID IN '" _
& strTmpDB & "'"
If rsSource.RecordCount <> 0 Then
For Each fld In rsSource.Fields
strUpdateField = fld.Name
'Debug.Print strUpdateField
If InStr(strUpdateField, "ID") = 0 Then
If fld.Type = dbText Then
strZLS = " & ''"
Else
strZLS = vbNullString
End If
strSet = " SET qdfOldMembers." & strUpdateField _
& " = varZLStoNull(qdfNewMembers." & strUpdateField & ")"
strWhere = " WHERE " & "qdfOldMembers." & strUpdateField & strZLS _
& "<>" & "qdfNewMembers." & strUpdateField & strZLS _
& " OR (IsNull(qdfOldMembers." & strUpdateField _
& ")<>IsNull(varZLStoNull(qdfNewMembers." _
& strUpdateField & ")));"
db.Execute strSQL & strSet & strWhere, dbFailOnError
'Debug.Print strSQL & strSet & strWhere
End If
Next fld
End If
End Sub
رمز الوظيفة varZLSToNull():
Public Function varZLStoNull(varInput As Variant) As Variant
If Len(varInput) = 0 Then
varZLStoNull = Null
Else
varZLStoNull = varInput
End If
End Function
أنا لا أعرف إذا كان هذا هو أكثر تعقيدا من أن معنى له ، ولكن ربما أنها سوف تساعد شخص ما.
نصائح أخرى
ويمكنك محاولة AccessDiff (المنتج المدفوعة). فمن لديه القدرة على المقارنة بين المخطط، والبيانات، وكذلك الوصول إلى الكائنات. أنه يحتوي على واجهة المستخدم الرسومية، وكذلك واجهة سطر الأوامر.
والإفصاح: أنا خالق هذه الأداة
وخذ مقالب نص جداول قاعدة البيانات وببساطة مقارنة ملفات نصية ملقاة باستخدام BeyondCompare (أو أي أداة مقارنة النص أخرى). النفط الخام ولكن يمكن أن تعمل!
ولدي خبرة جيدة جدا مع قاعدة البيانات المشتركة المقارنة . وهو قادر على مقارنة هيكل و / أو البيانات.
وانظر قارن الوصول القسم على مايكروسوفت المرافق وصول طرف ثالث، والمنتجات، أدوات قواعد البيانات ، وحدات، الخ صفحة في موقع الويب الخاص بي.
ولقد أضاف "الجدول فرق" ميزة لبلدي accdbmerge فائدة لا وقت طويل منذ. وأعتقد أن هذه الإجابة لن تساعد على حل السؤال الأصلي، ولكن قد يكون من المفيد لشخص ما واجهت نفس المشكلة في المستقبل.
إذا كنت تريد أن تعرف إذا كانت الملفات متطابقة ثم
fc file1.mdb file2.mdb
وعلى سطر الأوامر DOS.
إذا كانت الملفات ليست متطابقة ولكن كنت تشك في أنها تحتوي على نفس الجداول والسجلات ثم أسهل طريقة سيتم بسرعة إرسال الأداة الصغيرة التي تفتح قواعد البيانات ودورات سواء من خلال جداول كلا تنفيذ استعلام غير المتجانسة لاستخراج الفرق بين الملفين.
وهناك بعض الأدوات هناك والتي سوف نفعل ذلك لك، ولكنها جميعا يبدو أن برنامج كومبيوتري.