online documentos comparar comparador ms-access ms-office

ms-access - comparador - comparar documentos word y pdf



¿Puedo comparar dos archivos de acceso ms? (7)

Quiero comparar dos archivos .mdb de acceso ms para verificar que los datos que contienen sean los mismos en ambos.

¿Cómo puedo hacer esto?


Si quieres saber si los archivos son idénticos, entonces

fc file1.mdb file2.mdb

en una línea de comando de DOS

Si los archivos no son idénticos pero sospecha que contienen las mismas tablas y registros, la forma más fácil sería escribir rápidamente una pequeña utilidad que abra ambas bases de datos y recorra las tablas de ambos realizando una consulta heterogénea para extraer el Diff entre los dos archivos.

Hay algunas herramientas que harán esto por usted, pero todas parecen ser shareware.



Tome los volcados de texto de las tablas de la base de datos y simplemente compare los archivos de texto objeto de dumping utilizando BeyondCompare (o cualquier otra herramienta de comparación de texto). Crudo pero puede funcionar!



He hecho este tipo de cosas en código muchas, muchas veces, sobre todo en casos en los que un MDB local necesitaba tener aplicadas actualizaciones a partir de datos ingresados ​​en un sitio web. En un caso, el sitio web fue manejado por un MDB, en otros, era una base de datos MySQL. Para el MDB, acabamos de descargarlo, para MySQL, ejecutamos scripts en el sitio web para exportar y FTP archivos de texto.

Ahora, el punto principal es que queríamos comparar los datos en el MDB local con los datos descargados del sitio web y actualizar el MDB local para reflejar los cambios realizados en el sitio web (no, no era posible usar una única fuente de datos, - fue lo primero que sugerí, pero no fue posible).

Llamemos a MDB A su base de datos local, y MDB B la que está descargando para comparar. Lo que debe verificar es:

  1. registros que existen en MDB A pero no en MDB B. Estos pueden o no ser candidatos para su eliminación (esto dependerá de sus datos particulares).

  2. registros que existen en MDB B pero no en MDB A. Estos se agregarán de MDB B a MDB A.

  3. registros que existen en ambos, que deberán compararse campo por campo.

Los pasos 1 y 2 se logran con bastante facilidad con las consultas que usan una combinación externa para encontrar los registros que faltan. El paso 3 requiere un código.

El principio detrás del código es que la estructura de todas las tablas en ambos BMD es idéntica. Por lo tanto, utiliza DAO para recorrer la colección TableDefs, abrir un conjunto de registros y recorrer la colección de campos para ejecutar una instrucción SQL en cada columna de cada tabla que actualiza los datos o genera una lista de las diferencias.

La estructura básica detrás del código es:

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

Ahora, la mayor complejidad aquí es que su cláusula WHERE para cada campo tiene que ser diferente: los campos de texto deben tratarse de manera diferente a los campos numéricos y de datos. Entonces, probablemente querrá un SELECT CASE que escriba su cláusula WHERE según el tipo de campo:

Select Case fld.Type Case dbText, dbMemo Case Else End Select

Querrá usar Nz () para comparar los campos de texto, pero usaría Nz (TextField, '''') para eso, mientras usa Nz (NumericField, 0) para campos numéricos o campos de fecha.

Mi código de ejemplo no usa la estructura anterior para definir la cláusula WHERE porque está limitado a campos que funcionan muy bien comparando concatenado con un ZLS (campos de texto). Lo que está debajo es bastante complicado de leer, pero básicamente es una expansión en la estructura anterior.

Fue escrito para la eficiencia de las actualizaciones, ya que ejecuta una ACTUALIZACIÓN SQL para cada campo de la tabla, que es mucho más eficiente que la ejecución de una ACTUALIZACIÓN SQL para cada fila. Si, por otro lado, no desea hacer una actualización, pero desea una lista de las diferencias, puede tratar todo de manera diferente. Pero eso se vuelve bastante complicado dependiendo de la salida,

Si todo lo que desea saber es si dos MDB son idénticos, primero primero debería verificar el número de registros en cada tabla, y si tiene una no coincidencia, salga e informe al usuario que los MDB no son lo mismo. Si la cantidad de registros es la misma, debe verificar el campo por campo, lo cual creo que se logra mejor con SQL columna por columna escrito dinámicamente: tan pronto como uno de los SELECTS SQL resultantes devuelva 1 o más registros, usted aborta y diga a su usuario que los MDB no son idénticos.

La parte complicada es si quieres registrar las diferencias e informar al usuario, pero entrar en eso ¡haría que esta publicación ya sea interminable sea aún más larga!

Lo que sigue es solo una parte del código de una subrutina más grande que actualiza la consulta guardada qdfOldMembers (de MDB A) con datos de qdfNewMembers (de MDB B). El primer argumento, strSQL, es una declaración SELECT que está limitada a los campos que desea comparar, mientras que strTmpDB es la ruta / nombre de archivo de la otra MDB (MDB B en nuestro ejemplo). El código asume que strTmpDB ya tiene qdfNewMembers y qdfOldMembers creados (el código original escribe QueryDef guardado sobre la marcha). Podría ser tan fácilmente como nombres de tabla directa (la única razón por la que uso una consulta guardada es porque los nombres de campo no coinciden exactamente entre los dos MDB para los que fue escrito).

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

Código para la función varZLSToNull ():

Public Function varZLStoNull(varInput As Variant) As Variant If Len(varInput) = 0 Then varZLStoNull = Null Else varZLStoNull = varInput End If End Function

No sé si eso es demasiado complejo para tener sentido, pero tal vez ayudará a alguien.


He agregado la característica "diff de tabla" a mi utilidad accdbmerge no hace tanto tiempo. Creo que esta respuesta no ayudará a resolver la pregunta original, pero puede ser útil para alguien que enfrenta el mismo problema en el futuro.


Puedes probar AccessDiff (producto pago). Tiene la capacidad de comparar el esquema, los datos y también acceder a los objetos. Tiene una GUI y también una interfaz de línea de comando.

Divulgación: soy el creador de esta herramienta.