Я могу сравнить два файла доступа мс? [закрытый]

используйте этот код

$(document).ready(function() {
      $('.category>div' ).on('click', function(){
     $('.wrapper').toggle();
      })
    });

и добавьте этот CSS, чтобы скрыть div в начале

.wrapper{
display:none
}
7
задан 4 revs, 3 users 60% 12 December 2013 в 23:53
поделиться

5 ответов

Я сделал такого рода вещь в коде многие, много раз, главным образом в случаях, где локальный MDB должен был иметь обновления, относился к оттянутому из данных, ввел в веб-сайт. В одном случае веб-сайт управлялся MDB в других, это была база данных MySQL. Для MDB мы просто загрузили его для MySQL, мы запустили скрипты на веб-сайте для экспорта и текстовые файлы FTP.

Теперь, основной момент - то, что мы хотели сравнить данные в локальном MDB к данным, загруженным с веб-сайта и обновить локальный MDB для отражения изменений, внесенных на веб-сайте (не, не было возможно использовать единственный источник данных - это была первая вещь, которую я предложил, но это не было выполнимо).

Давайте назовем MDB Вашей локальной базой данных и MDB B тот, который Вы загружаете для сравнения. То, на что необходимо проверить:

  1. записи, которые существуют в MDB A, но не в MDB B. Они могут или не могут быть кандидатами на удаление (это будет зависеть от Ваших конкретных данных).

  2. записи, которые существуют в MDB B, но не в MDB A. Они Вы добавите от MDB B к MDB A.

  3. записи, которые существуют в обоих, которые должны будут быть сравненным полем полем.

Шаги № 1 и № 2 довольно легко выполняются с запросами, которые используют внешнее объединение для нахождения недостающих записей. Шаг 3 требует некоторого кода.

Принцип позади кода - то, что структура всех таблиц в обоих MDBs идентична. Так, Вы применяете ДАО, чтобы обойти набор TableDefs, открыть recordset и обойти полевой набор для выполнения 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 () для сравнения текстовых полей, но Вы использовали бы Nz (TextField'') для этого, при использовании Nz (NumericField, 0) для числовых полей или полей даты.

Мой пример кода на самом деле не использует структуру выше для определения оператора Where, потому что это ограничено полями, которые работают, очень хорошо выдерживая сравнение связанный с ZLS (текстовые поля). То, что ниже, довольно сложно для прочтения, но это - в основном расширение на вышеупомянутой структуре.

Это было записано для эффективности обновлений, так как это выполняет ОБНОВЛЕНИЕ SQL для каждого поля таблицы, которая намного более эффективна, чем выполнение ОБНОВЛЕНИЯ SQL для каждой строки. Если с другой стороны, Вы не хотите делать обновление, но хотеть список различий, Вы могли бы рассматривать все это по-другому. Но это становится довольно сложным в зависимости от вывода,

Если все, что Вы хотите знать, - то, если бы два MDBs идентичны, Вы сначала проверили бы количество записей в каждой таблице сначала, и если у Вас есть одно несоответствие, Вы выходите и говорите пользователю, что MDBs не являются тем же. Если recordcounts являются тем же, то необходимо проверить поле полем, которому я верю, лучше всего выполняется со столбцом столбцом SQL, записанный динамично - как только один из получающегося SQL ВЫБИРАЕТ возвраты 1 или более записей, Вы прерываете и говорите Вашему пользователю, что MDBs не идентичны.

Сложная часть - то, если бы Вы хотите записать различия и сообщить пользователю, но вход, который сделал бы это уже бесконечное сообщение еще дольше!

То, что следует, является просто частью кода от большей подпрограммы, которая обновляет сохраненный запрос qdfOldMembers (от MDB A) с данными из qdfNewMembers (от MDB B). Первым аргументом, strSQL, является оператор SELECT, который ограничен полями, которые Вы хотите сравнить, в то время как strTmpDB является путем/именем файла другого MDB (MDB B в нашем примере). Код предполагает, что strTmpDB имеет qdfNewMembers, и qdfOldMembers уже создал (исходный код пишет сохраненный QueryDef на лету). Это могли так же, как легко быть прямые имена таблиц (единственная причина, я использую сохраненный запрос, то, потому что имена полей не соответствуют точно между двумя MDBs, которые это было записано для).

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

Я не знаю, слишком ли это сложно, чтобы иметь смысл, но возможно он поможет кому-то.

6
ответ дан 6 December 2019 в 21:21
поделиться

Возьмите текстовые дампы таблиц базы данных и просто сравните выведенное использование текстовых файлов BeyondCompare (или любой другой текстовый инструмент сравнения). Сырая нефть, но может работать!

2
ответ дан 6 December 2019 в 21:21
поделиться

У меня есть очень хороший опыт с Компаратором перекрестной Базы данных. Это может сравнить структуру и/или данные.

2
ответ дан 6 December 2019 в 21:21
поделиться

Если Вы хотите знать, идентичны ли файлы затем

fc file1.mdb file2.mdb 

на строке команды DOS.

Если бы файлы не идентичны, но Вы подозреваете, что они содержат те же таблицы, и записывает затем самый легкий путь, была бы быстро запись маленькая утилита, которая открывает и базы данных и циклы через таблицы обоих выполнения неоднородного запроса для извлечения Разности между этими двумя файлами.

Существуют некоторые инструменты там, которые сделают это для Вас, но они все, кажется, условно-бесплатное программное обеспечение.

-4
ответ дан 6 December 2019 в 21:21
поделиться

См. Раздел «Сравнить базы данных Access» на сторонних утилитах, продуктах, инструментах, модулях и т. Д. Microsoft Access на моем сайте.

1
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: