Работа с DBF файлами с помощью библиотеки gsdbquery.dll
Работа с DBF-файлами в Гедымине
By Alexandra
Для работы с DBF в Гедымине используется класс gsdb_rpQueryList, создаваемый средствами VBScript (обязательно должен быть установлен BDE):
set gsql = CreateObject("gsdbquery.gsdb_rpQueryList")
Дальше все очень похоже на IgsQueryList (к которому принадлежит BaseQueryList).
Методы
1)Add(QueryName: String; MemQuery: Integer): Integer
Добавляет объект IgsDBQuery с именем QueryName в список запросов, возвращает его индекс в списке (начиная с 0). MemQuery может иметь значения 0 и 1. Если MemQuery = 0, то данные хранятся в объекте класса TQuery. Значит, добавленный IgsDBQuery может выполнять SQL-запросы. Если же MemQuery = 1, данные хранятся в объекте класса TClientDataSet. В него можно добавлять поля и вставлять записи (см BaseQueryList). (И вряд ли кому-нибудь на практике это понадобится).
2)Clear
Очищает список IgsDBQuery’в
3)Delete(Index: Integer)
Удаляет IgsDBQuery с индексом Index. Индексы всех следующих за ним в списке запросов уменьшаются на 1 (см пример в BaseQueryList).
4)DeleteByName(AName: String)
Удаляет запрос с именем AName из списка
Свойства
5)Count: Integer
Количество IgsDBQuery’в в списке
6)Query (Index: Integer): IgsDBQuery
Возвращает IgsDBQuery по индексу в списке
7)QueryByName(Name: String): IgsDBQuery
Возвращает IgsDBQuery по имени в списке.
После добавления нового IgsDBQuery с параметром MemQuery = 0 его можно использовать для создания файла DBF:
set gsql = CreateObject("gsdbquery.gsdb_rpQueryList")
set qryDoc = gsql.Query(gsql.Add("qryDoc", 0))
qryDoc.SQL = "CREATE TABLE '" + _
FileName + "'" + _
"(" +_
" FIELD1 CHAR(5), " + _
" FIELD2 DATE, " + _
" FIELD3 NUMERIC(5)," + _
" FIELD4 NUMERIC(5, 3), " + _
" FIELD5 BOOLEAN " + _
" )"
qryDoc.ExecSQL
qryDoc.Close
Здесь FileName – полный путь к файлу. Если такой файл существует – получим ошибку. Поэтому предварительно нужно проверить, существует ли файл с таким именем, и, например, удалить его. Тип NUMERIC(5, 3) означает, что размер поля – 5, из них 3 знака после запятой.
Можно вставлять записи в DBF. Пусть поля записи, которые нужно вставить в DBF, найдены с помощью q (TIBSQL):
qryDoc.SQL = _ "INSERT INTO '" + FileName + "'" + _ "(FIELD1, FIELD2, FIELD3, FIELD4, FIELD5) " + _ "VALUES" + _ "(:FIELD1, :FIELD2, :FIELD3, :FIELD4, :FIELD5) "
qryDoc.ParamByName("FIELD1").AsString = _
q.FieldByName("FIELD1").AsString
qryDoc.ParamByName("FIELD2").AsVariant = _
q.FieldByName("FIELD2").AsDateTime
qryDoc.ParamByName("FIELD3").AsFloat = _
q.FieldByName("FIELD3").AsDouble
qryDoc.ParamByName("FIELD4").AsFloat = _
q.FieldByName("FIELD4").AsDouble
qryDoc.ParamByName("FIELD5").AsInteger = _
q.FieldByName("FIELD5").AsInteger
qryDoc.ExecSQL
Параметры могут иметь тип AsInteger, AsFloat, AsString, AsVariant. Для булевых полей можно использовать AsInteger, для даты – AsVariant.
Делать выборку из DBF можно тоже через IgsDBQuery. qryDoc.SQL = _
“SELECT * FROM ‘” + _
FileName + “’” + _
“WHERE FIELD3 = :fld3”
qryDoc.ParamByName(“fld3”).As Float = 3
qryDoc.Open ‘ а не ExecSQL
Также можно удалять записи из DBF.
Экспорт даты
Если производить экспорт в DBF SQL-запросом (IgsDBQuery с параметром MemQuery = 0), может возникнуть проблема с экспортом даты, если она НУЛЛ. Если дата - параметр в запросе INSERT,
qryDoc.ParamByName("FIELD2").AsVariant = _
q.FieldByName("FIELD2").AsDateTime,
и при этом q.FieldByName("FIELD2").AsDateTime = НУЛЛ, в DBF запишется загадочный день 1899 года. А хотелось бы, чтоб ничего не записалось. При всевозможных попытках это обойти с помощью приведений типа, подстановки 0, нулл и т.д. получаем или ошибку, или тот же 1899 г (если кто знает способ, предлагаю указать его здесь!).
Проблема решается следующим образом: нужно работать с DBF не через запрос, а через датасет:
set F = FSO.GetFile(FileName)
set qryDoc = gsql.Query(gsql.Add("qryDocTable", 3))
qryDoc.Database = F.ParentFolder
qryDoc.TableName = F.Name
(FileName - это полный путь к нашему DBF). Обратите внимание на второй параметр метода Add! Теперь все просто:
qryDoc.Open
qryDoc.Insert
qryDoc.FieldByName("FIELD1").AsString = _
q.FieldByName("FIELD1").AsString
if not q.FieldByName("FIELD2").IsNull then
qryDoc.FieldByName("FIELD2").AsVariant = _
q.FieldByName("FIELD2").AsDateTime
end if
qryDoc.FieldByName("FIELD3").AsFloat = _
q.FieldByName("FIELD3").AsDouble
qryDoc.FieldByName("FIELD4").AsFloat = _
q.FieldByName("FIELD4").AsDouble
qryDoc.FieldByName("FIELD5").AsInteger = _
q.FieldByName("FIELD5").AsInteger
qryDoc.Post
Теперь, если FIELD2 - нулл, в DBF окажется просто пустое поле. Возможность создавать такие датасеты (IgsDBQuery с параметром MemQuery = 3)доступна только в последних версиях gsdbquery.dll