Я задался идей создать базу данных моей музыкальной коллекции, размещённой на жёстком диске. Пытаюсь это сделать с помощью Access. Но вот одна трудность - мне нужно, чтобы автоматически обновлялись данные в определённой таблице(цах). А данные эти - названия исполнителей и названия песен, записанные в виде ID тэгов в музыкальных файлах MP3. Т.е. при помещении в определённую папку новых MP3 файлов их названия должны автоматически пополнять базу данных.
Хотя этот вопрос впервые встречается среди многих других вопросов по Access, но можно сказать, что эта тема эта достаточно важна не только для новичков, но и для тех, кто профессионально занимается базами данных.
Например, представим что у Вас есть электронный магазин и все заказы приходят к Вам в виде писем по электронной почте. Ручная обработка писем, их сортировка, чтение и ввод данных в базу данных может занять значительное время. При этом будет трудно избежать ошибок при вводе информации, если вдобавок вы не имеете профессиональных операторов. Естественно можно придумать так, что все письма будут сохраняться в определенной папке, после того, как Вы открываете базу данных, программа автоматически будет читать имена файлов, проверять наличие их (по названию, по дате и времени их создания) и далее загружать выборочно текст в таблицу базы данных (текст может быть разбит тегами на разделы).
Попробуем автоматизировать этот процесс. Ниже дается описание алгоритма, что нужно сделать, после этого идет код на VBA.
1 этап. Создаем макрос AutoExec. Назначение этого макроса - это автоматический запуск некоторой программы, которая должна выполняться всегда при открытии базы. Название программы - funAutoReadAllFiles(). На вход программы необходимо передать данные по каталогу, где надо искать файлы и расширение файлов, которые необходимо считать.
2 этап. Создаем подпрограмму по загрузке файлов funAutoReadOneFile. Цель ее - проверка содержимого файла в базе данных и если файла нет, то загрузить его. На вход программы подается информация об имени файла и таблицы, куда необходимо загрузить данные.
Данный код взят из файла la_files.mdb
'==============================================================
' Прочитаем имена файлов и загрузим их в таблицу
'
Private Sub funAutoReadAllFiles(strDir As String, strFileExt As String)
Dim i As Long, rst As DAO.Recordset
On Error GoTo 999
With Application.FileSearch
.NewSearch
.LookIn = strDir ' *.name
.FileName = strFileExt ' *.txt
.SearchSubFolders = False
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count
If MsgBox("Загрузить файл: " & .FoundFiles(i), vbInformation + vbOKCancel, "Загрузить") = vbOK Then
funAutoReadOneFile .FoundFiles(i), "Таблица5"
Me.table5.Requery
End If
Next i
End If
End With
Exit Sub 'Выходим из программы
999:
MsgBox Err.Description
Err.Clear 'Очищаем поток от ошибок
End Sub
'==============================================================
' Загружаем файл в таблицу
'
Private Function funAutoReadOneFile(strFileName As String, strTable)
Dim fs, f, flag
Dim dbs As DAO.Database, rst As DAO.Recordset
On Error GoTo 999
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(strFileName)
' Проверка файла
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("select * from " & strTable)
If rst.RecordCount Then
rst.MoveLast
rst.MoveFirst
End If
rst.FindFirst "[FileName] = '" & strFileName & "'"
If rst.NoMatch = False Then
dbs.Close
rst.Close
Exit Function
End If
' Добавление информации о дате создания
rst.AddNew
rst!FileName = strFileName
rst!DateCreated = f.DateCreated
' Добавление информации о содержимом
rst!Memo = ""
Set f = fs.OpenTextFile(strFileName, 1, False)
Do While f.AtEndOfStream <> True
rst!Memo = rst!Memo & f.ReadLine ' Читаем построчно
Loop
f.Close
' Сохранение содержимого
rst.Update
rst.Close
dbs.Close
Exit Function
999:
MsgBox Err.Description
Err.Clear
rst.Close
End Function
Private Sub butCode1_Click()
Stop
End Sub
Ссылки по теме