Работа с 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.

Личные инструменты