هل يمكنني مقارنة بين ms-access الملفات ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/239450

  •  04-07-2019
  •  | 
  •  

سؤال

أريد مقارنة بين ms-access .mdb الملفات للتأكد من أن البيانات التي تحتوي هو نفسه في كل.

كيف يمكن أن أفعل هذا ؟

هل كانت مفيدة؟

المحلول

لقد فعلت هذا الشيء في رمز مرات عديدة معظمها في الحالات التي يكون فيها المحلية MDB في حاجة إلى تطبيق التحديثات على أنها مستمدة من البيانات المدخلة على موقع على شبكة الإنترنت.في حالة واحدة الموقع كان مدفوعا MDB في الآخرين ، كانت قاعدة بيانات MySQL.بالنسبة MDB, نحن فقط تحميل, الخلية, قمنا بتشغيل البرامج النصية على موقع التصدير FTP الملفات النصية.

الآن النقطة الرئيسية هي أن أردنا المقارنة بين البيانات المحلية MDB إلى البيانات التي تم تحميلها من موقع تحديث المحلية MDB لتعكس التغييرات التي أدخلت على الموقع (لا, لم يكن من الممكن استخدام مصدر بيانات واحد -- كان أول شيء أنا اقترح ، ولكن لم يكن ذلك ممكنا).

دعونا ندعو MDB على قاعدة البيانات المحلية الخاصة بك ، MDB ب واحد كنت تحميل للمقارنة.ماذا لديك للتحقق من:

  1. السجلات التي توجد في MDB ولكن ليس في ب. MDBهذه قد تكون أو لا تكون المرشحين الحذف (هذا سيعتمد على بيانات معينة).

  2. السجلات التي توجد في MDB B ولكن ليس في أ. MDBهذه سوف إلحاق من MDB ب إلى أ. MDB

  3. السجلات الموجودة في كليهما ، والتي سوف تحتاج إلى أن تكون مقارنة مجال من مجال.

خطوات #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.

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

وهناك بعض الأدوات هناك والتي سوف نفعل ذلك لك، ولكنها جميعا يبدو أن برنامج كومبيوتري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top