Работа с DBF файлами с помощью библиотеки gsdbquery.dll
Материал из GedeminWiki
Для работы с DBF в Гедымине используется класс gsdb_rpQueryList из библиотеки gsdbquery.dll, которая использует BDE. Работа с классом похожа на IgsQueryList, к которому принадлежит BaseQueryList.
dim gsql
set gsql = CreateObject("gsdbquery.gsdb_rpQueryList")
Содержание |
Методы
Add(QueryName: String; MemQuery: Integer): Integer
Добавляет объект IgsDBQuery с именем QueryName в список запросов, возвращает его индекс в списке (начиная с 0). MemQuery может иметь значения 0 и 1. Если MemQuery = 0, то данные хранятся в объекте класса TQuery. Значит, добавленный IgsDBQuery может выполнять SQL-запросы. Если MemQuery = 1, данные хранятся в объекте класса TClientDataSet. В него можно добавлять поля и вставлять записи (см BaseQueryList).
Clear
Очищает список IgsDBQuery.
Delete(Index: Integer)
Удаляет IgsDBQuery с индексом Index.
DeleteByName(AName: String)
Удаляет запрос с именем AName из списка.
Свойства
Count: Integer
Количество объектов IgsDBQuery в списке.
Query (Index: Integer): IgsDBQuery
Возвращает IgsDBQuery по индексу в списке.
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 -– полный путь к файлу. Если такой файл существует – получим ошибку. Поэтому предварительно нужно проверить, существует ли файл с таким именем, и, например, удалить его.
Вставка записей
Пусть поля записи, которые нужно вставить в 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.
Выборка данных
set gsql = CreateObject("gsdbquery.gsdb_rpQueryList") set qryDBF = gsql.Query(gsql.Add("qrydbf", 2)) qryDBF.Database = Path qryDBF.SQL = _ " SELECT " & _ " t.kod_plat, t.debet, t.kredit " & _ " FROM '" & _ Filename & "' t " & _ " ORDER BY " & _ " t.kod_plat " qryDBF.Open qryDBF.First do while not qryDBF.Eof FieldValue = qryDBF.FieldByName(“FIELDNAME”).AsString qryDBF.Next loop qryDBF.Close
Экспорт даты
Если производить экспорт в 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.
