LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 38. Автозагрузка файлов в базу данных

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         31.05.2002
Сайт:         http://www.leadersoft.ru
  Новости
    31.03.2002. Добавлены примеры в файлы la_files.mdb. Этот пример будет полезен для чтения имен файлов и загрузки их содержимого в таблицу, например, при обработке писем. При получении писем по email Вам достаточно их скопировать в папку в с программой. После запуска формы автоматически файлы и их содержимое будет загружаться в таблицу.

Вопрос:  2164
Тема:      Файловая система
Пример:  la_files.mdb (Номер 5)
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/2164.htm
Сообщение: Я задался идей создать базу данных моей музыкальной коллекции, размещённой на жёстком диске. Пытаюсь это сделать с помощью 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
Вопрос:  2168
Тема:      Программирование
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/2168.htm
Сообщение: А почему в ваших примерах встречается переход по ошибке On Error Goto 999, а не On Error Goto Ошибка. Так, например, будет более понятно.
Ответ.      Возможно да, но у меня есть несколько причин, например,
1. При переходе по ошибке, компилятор проводит сравнивание. Когда сравниваются несколько строк, то при их сравнении имеет значение каждая буква. При этом, если буквы еще находятся в верхней части таблицы символов, то сравнение будет чуточку быстрее. '9' выше буквы 'О'
2. 999 - это число магическое, т.е. ранее при разработке программ не рекомендуется делать программный код для 1 функции более 1000 строк. Следовательно 999 - это предел записей, т.е. число само по себе говорит об ошибке.
3. В третьих, легче и быстрее написать 999, чем 'Ошибка'.