En la biblioteca de mi instituto usamos todavía el viejo Abies2, pues con nuestra inestable conexión a internet no nos atrevemos a usar abies3. Uno de los problemas que nos ha surgido es que hay unos cuantos ejemplares que han sido catalogados en el pasado (prueba de ello es su código de barras de Abies) pero no aparecen en el catálogo por ninguna parte.
Analizando el problema a partir de una copia de seguridad que abrimos con Access, se manifiesta el origen del problema:
Abies guarda los autores en dos lugares diferentes. En primer lugar está el autor principal, que se almacena en el campo idAutor de la tabla [Fondos]. Por otro lado, en la tabla [Fondos_Autores] hay un registro que lista los autores secundarios y principales de cada fondo, con un campo llamado booleano "principal" que indica si estamos hablando del autor principal o no.
El problema es que al hacer el listado de ejemplares que sale en la pantalla principal de abies, los ejemplares se recuperan a partir de una consulta que solo toma aquellos ejemplares con valores definidos en la tabla [fondos_autores], es decir, que si por la razón que sea (probablemente una edición manual o una actualización mal hecha) se pierden los registros de la tabla [fondos_autores], los fondos desaparecerán de la vista de catálogo.
Podemos añadir la siguiente macro a una copia de seguridad de abies para averiguar qué ejemplares son los que se han convertido en "fantasmas". Aunque he añadido una funcionalidad de "reparación", yo no cambiaría nada a menos que me asegure de que no he vuelto a catalogar los ejemplares desaparecidos... (y teniendo en cuenta que es un proceso largo y que en medio hay que evitar prestar o catalogar ningún fondo, es complicado).
'Buscar ejemplares sin autor en la tabla fondos_autores
'(Ejemplares con autor declarado en fondos pero sin autor en fondos_autores)
' Creo que esa es la causa de que "Réquiem por un campesino español" de
' Ramón J. Sender no aparezca en Abies, a pesar de que aparece en la tabla
' "ejemplares" y en la tabla "fondos".
Sub buscaEjemplaresSinAutor()
Dim Fondos As Recordset
Dim FondosAutor As Recordset
Dim xlApp As Excel.Application
Dim Book As New Excel.Workbook
Dim MySheet As Excel.Worksheet
Dim Db As Database
Set Db = Access.CurrentDb
Set xlApp = CreateObject("Excel.Application")
Set Book = xlApp.Workbooks.Add
Set MySheet = Book.Sheets(1)
Book.Activate
With MySheet
With .Range("A:D")
.HorizontalAlignment = xlLeft
.Font.Size = 10
.VerticalAlignment = xlTop
.WrapText = True
End With
With .Range("1:2")
.Font.Size = 12
.VerticalAlignment = xlTop
.HorizontalAlignment = xlCenter
End With
.Cells(1, 1) = "Fondos sin autor en IDAutores"
.Cells(2, 1) = "IDFondo"
.Cells(2, 2) = "IDAutor"
.Cells(2, 3) = "A"
.Cells(2, 4) = "Titulo"
.Cells(2, 5) = "CodigoEjemplar"
.Cells(2, 6) = "NumRegistro"
.Cells(2, 7) = "[Signatura]"
.Cells(2, 8) = "FechaAlta"
.Cells(2, 9) = "[Arreglado?]"
'Colorear el encabezado
.Range("A1:G1").Cells.Interior.Color = RGB(&HFF, &HCC, _
&H99)
.Range("A1:G1").HorizontalAlignment = xlCenter
.Range("A1:G1").Merge
.Range("A2:G2").Cells.Interior.Color = RGB(&HC0, &HC0, _
&HC0)
.Columns(1).ColumnWidth = 8
.Columns(2).ColumnWidth = 8
.Columns(3).ColumnWidth = 20
.Columns(4).ColumnWidth = 20
.Columns(5).ColumnWidth = 8
.Columns(6).ColumnWidth = 8
.Columns(7).ColumnWidth = 8
.Columns(8).ColumnWidth = 8
FilaAct = 3
End With
consulta = "SELECT Ejemplares.CodigoEjemplar,Autores.a, "+ _
"Fondos.Titulo, Ejemplares.Sig1, Ejemplares.Sig2,"+ _
"Ejemplares.Sig3, Fondos.IdFondo,Fondos.IdAutor, " + _
"Ejemplares.FechaAlta, Ejemplares.NumRegistro " + _
"FROM (Fondos INNER JOIN Ejemplares ON " + _
"Fondos.IdFondo = Ejemplares.IdFondo)" + _
"INNER JOIN Autores ON Fondos.IdAutor = " + _
"Autores.IdAutor ORDER BY Fondos.IdFondo"
Set Fondos = Db.OpenRecordset(consulta, dbOpenDynaset)
Fondos.MoveFirst
Do Until Fondos.EOF
While Fondos.Fields("idfondo") = "": Fondos.MoveNext: Wend
idfondo = Fondos.Fields("IdFondo")
consulta2 = "SELECT * FROM [Fondos_Autores] Where "+ _
"[IdFondo]=" & idfondo & " ORDER By IdFondo"
Set FondosAutor = CurrentDb.OpenRecordset(consulta2, _
dbOpenDynaset)
cuenta = FondosAutor.RecordCount
'If idfondo = 3294 Then Stop
If cuenta = 0 Then
With MySheet
.Cells(FilaAct, 1) = Fondos.Fields("idFondo")
.Cells(FilaAct, 2) = Fondos.Fields("idAutor")
.Cells(FilaAct, 3) = Fondos.Fields("A")
.Cells(FilaAct, 4) = Fondos.Fields("Titulo")
.Cells(FilaAct, 5) = Fondos.Fields("CodigoEjemplar")
.Cells(FilaAct, 6) = Fondos.Fields("NumRegistro")
.Cells(FilaAct, 6) = Fondos.Fields("Sig1") + _
" " + Fondos.Fields("Sig2") + _
" " + Fondos.Fields("Sig3")
.Cells(FilaAct, 7) = Fondos.Fields("FechaAlta")
End With
FilaAct = FilaAct + 1
respuesta = MsgBox( _
"El libro " + vbCrLf + Chr(34) + _
Fondos.Fields("Titulo") + Chr(34) + vbCrLf + _
"(autor: " + Fondos.Fields("A") + ")" + vbCrLf + _
"no tiene entrada de autor en la tabla " + _
"Fondos_Autores." + vbCrLf + _
"¿Crear entrada?", _
vbYesNo + vbQuestion, _
"Arreglar Autor")
If respuesta = vbYes Then
'Stop
' Inserta una línea en la hoja de cálculo
' avisando del arreglo.
MySheet.Cells(FilaAct - 1, 9) = "ARREGLADO"
'Inserta un registro nuevo en Fondos_Autores
FondosAutor.AddNew
FondosAutor.Fields("idAutor") = _
Fondos.Fields("idAutor")
FondosAutor.Fields("idFondo") = _
Fondos.Fields("idFondo")
Rem FondosAutor.Fields("idFuncion")= Vacío
FondosAutor.Fields("Principal") = True
FondosAutor.Update
End If
End If
FondosAutor.Close
Fondos.MoveNext
Debug.Print ".";
Loop
Book.Application.Visible = True
End Sub