SiAP y sus secretos: abriendo archivos mdb
SiAP y sus secretos: abriendo archivos mdb
El paquete de aplicativos para cuestiones impositivas, previsionales y aduaneras que provee ARCA (AFIP para muchos, todavía…), lleva con nosotros más de 25 años.
Un cuarto de siglo durante el que pasamos del FAX a la IA, de la Polaroid a las fotos con el celu, de la conversación telefónica al mensaje de Wahtsapp… y más, muchísimos cambios más. Pero no para el SiAp: inmutable, anclado carpichosamente a sus principios fundamentales como si el único principio imperante entre sus desarrolladores fuese «si funciona, no lo toques». Lo que estaría bastante bien si no fuese por un pequeñísimo detalle: no funciona. O, por lo menos no siempre y, lo que es seguro, no sin tropiezos ni mensjaes de error inexplicables que han llevado a más de un contador poco menos que a la internación siquiátrica.
Aplicativos bloqueados por tablas rotas que el ReparaBases.exe no hace otra cosa que terminar de destruir. Datos perdidos, horas de trabajo desperdiciadas e interminables seguidillas de versiones y releases que no provocan sino pánico por el sólo recuerdo de la catástrofe causada por la actualización anterior.
Vamos a ir, cada tanto, publicando por aquí algún que otro descubrimiento propio, mucho compilado de otras fuentes, soluciones y experiencias recolectadas de todos lados para ver si se pueden solucionar, con suerte, algunos de los problemas habituales de este singular paquete de herramientas.
Los archivos mdb
S.i.Ap se estructura más o menos así:
SiAp.exe: un hub principal desde el que pueden abrirse otros aplicativos. Recupera datos de las bases AFIP.mdb y Sistema.mdb.
AFIP.mdb contiene datos de los contribuyentes y Sistema.mdb tablas de sistema genéricas: códigos de impuestos, tablas de provincias, listados de actividades… en resúmen, datos necesarios para el funcionamiento general del sistema y precarga de datos de formularios.
Luego nos encontramos con las carpetas de cada aplicativo que repite más o menos la misma estructura: el [nombre del aplicativo].exe, [nombre del aplicativo].mdb y uno o más archivos Si0xxxxxx.mdb
Al igual que en el caso del SiAp principal, estos mdb de la carpeta de aplicativos tienen datos específicos del trámite impositivo que abarcan en el [nombre del aplicativo].mdb y datos para precarga de formularios en los Si0xxxx.mdb.
MDB: Bases de datos de Access
A estas alturas ya la mayoría lo saben: los archivos mdb son bases de datos de Access. Sí, el mismo Access que tenes instalado junto con tu paquete Office. Y muchos otros, en momentos más o menos desesperados, han intentado abrirlos con Access, sin éxito. Porqué?
Las cabeceras de archivos
Allá por 1980 y pico, cuando llamábamos programas a las hoy aplicaciones, programaba (hoy debo decir «diseñaba y desarrollaba»…) alguna que otra herramienta y porque no algún jueguito para Commodore 64 y, más adelante, para MTX y PC. Y la alteración de las cabeceras de archivos era una de las técnicas más usadas para proteger de algún modo el acceso o la manipulación indeseada de nuestros programas o datos.
Paso a explicar: cualquier archivo, de lo que sea, contiene al inicio una cantidad de datos (la cabecera) que, entre otras cosas, le dicen al sistema qué es lo que contienen, con que aplicación deberían trabajar, de qué versión son y otra parva de información útil. Un archivo de base de datos de Access, por lo tanto, tiene datos que le permiten a Access reconocerlo como propio, leer la estructura de tablas y la organización de datos que contiene. Si esta cabecera se altera o modifica de alguna forma, Access ya no lo reconoce y, por ende, no lo abre.
Y esto es exactamente lo que hacen S.i.Ap y sus aplicativos: los mdb vienen de fábrica con la cabecera adulterada. Al ejecutarse S.i.Ap, lo primero que hace es volver a escribir las cabeceras de archivos correctas en los mdb y así los deja listos para usar. Al cerrarlo, vuelve a modificarlas. Y cada aplicativo hace exactamente lo mismo con sus propios mdb (esos que estan dentro de la carpeta del aplicativo).
Es decir que si abrimos S.i.Ap y un aplicativo, mientras estén abiertos los archivos mdb tendrán sus cabeceras correctas hasta que los cerremos.
Y así llegamos al primer tip.
Obtener copias de los mdb con los que podamos trabajar
- Abrir S.i.Ap
- Abrir el aplicativo que nos interesa
- Sin cerrar el aplicativo ni S.i.Ap, copiar los archivos MDB a una carpeta diferente que usaremos para experimentar.
La versión de Access
Por antigua que sea tu computadora, estoy casi seguro de que si intentaras abrir ahora esos archivos, tu Access te diría que no los reconoce porque podrían ser de una versión anterior.
Y lo son.
S.i.Ap trabaja archivos Access mediante JET OELDB 4.0. JET OLEDB es el sistema que permite a las aplicaciones conectarse con bases de datos mdb y hojas Excel. La versión 4.0 corresponde a versiones de Office 2000 y hasta 2003 como mucho, pensada para usarse en Windows 95, 98, 2000 y XP. Ahora capaz estés entendiendo un poco mejor porqué a partir de Windows 7 comenzó la catarata de problemas con S.i.Ap. No era culpa de Windows sino de que S.i.Ap ya estaba senil.
Y entonces llegamos al segundo tip.
PC con Office 2000 ó 2003
Si tenes una compu vieja (muy), es lo ideal: Windows XP y una copia de Office 2000 (ó 2003). El 2007 ya no serviría porque no es compatible con JET OLEDB4.
O podes instalar en cualquier compu actual y más o menos moderna, una máquina virtual con Windows XP y el Office necesario. En internet vas a encontrar una chorrera de tutoriales al respecto. Buscá Hiper-V o Virtual Box…
Hecho lo anterior y satisfecho con lo logrado hasta aquí, vas a abrir el mdb desde Access y… Zas! te pide contraseña!!!!
Contrariamente a lo que podrías pensar, esta es la parte más sencilla. La contraseña de los mdb de AFIP es la misma desde el 99 y circula por toda la web. Yo no voy a publicarla, porque no sería ético que publique abiertamente que la contraseña que protege sistemas fiscales es …
naDdePraKciN
… pero si no fuese por eso, lo haría con gusto.
Para temerarios
Sólo para temerarios y atrevidos, o para quienes no quieran el engorro de instalar máquinas vituales o no consigan copias viejas del Office o de Windows XP, un script de PowerShell que intenta abrir el .mdb que quieras y exporta sus tablas en formato CSV (archivos de datos separados por comas) en la misma carpeta. Fijate de escribir en $dbPath y $baseDir los datos que correspondan a la ruta a tu archivo y la carpeta en que se encuentra en tu compu.
$ErrorActionPreference = 'Stop'
$dbPath = 'ruta a tu archivo\nombre-de-tu-archivo.mdb'
$baseDir = 'ruta a la carpeta en la que está el .mdb'
$password = 'naDdePraKciN'
function Export-WithConnection {
param(
[Parameter(Mandatory = $true)][string]$ConnectionString,
[Parameter(Mandatory = $true)][string]$ProviderName
)
$conn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$conn.Open()
try {
$schema = $conn.GetSchema('Tables')
$tables = $schema |
Where-Object {
$_.TABLE_TYPE -eq 'TABLE' -and
$_.TABLE_NAME -notlike 'MSys*' -and
$_.TABLE_NAME -notlike '~*'
} |
Select-Object -ExpandProperty TABLE_NAME
Write-Output "PROVIDER_OK $ProviderName TABLES=$($tables.Count)"
foreach ($table in $tables) {
try {
$safeName = $table -replace '[\\/:*?""<>|]', '_'
$csvPath = Join-Path $baseDir ("Sistema__{0}.csv" -f $safeName)
$sql = "SELECT * FROM [$table]"
$cmd = New-Object System.Data.OleDb.OleDbCommand($sql, $conn)
$adapter = New-Object System.Data.OleDb.OleDbDataAdapter($cmd)
$dt = New-Object System.Data.DataTable
[void]$adapter.Fill($dt)
$dt | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8 -Force
Write-Output "EXPORTED TABLE=$table ROWS=$($dt.Rows.Count) FILE=$csvPath"
}
catch {
Write-Output "TABLE_FAIL TABLE=$table ERROR=$($_.Exception.Message)"
}
}
}
finally {
$conn.Close()
}
}
$jetConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$dbPath;Jet OLEDB:Database Password=$password;"
try {
Export-WithConnection -ConnectionString $jetConn -ProviderName 'Microsoft.Jet.OLEDB.4.0'
}
catch {
Write-Output "PROVIDER_FAIL Microsoft.Jet.OLEDB.4.0 ERROR=$($_.Exception.Message)"
exit 1
}
Y así sucede la magia. Todo el contenido de esas viejas bases que necesitás para resolver una consulta o recontruir las tablas de un aplicativo cuyas tablas ya no estan accesibles, a la vista.
Los usos sanos de este procedimiento son muchísimos:
- Crear tus propios exportadores de datos.
- disponer de resúmenes en access, excel o cualquier otra aplicación.
- Recuperar información de bases mdb que el nuevo release de un aplicativo ya no reconoce
… lo que sea.
Espero les sirva.
Salute!