ИПОРТ-ЭКСПОРТ ДАННЫХ АБС В DBF


ЭКСПОРТ ДАННЫХ ИЗ АБС В DBF ФАЙЛЫ


Для создание пустого DBF-файла используется инклюд-файл dbfcreat.i.

DEF VAR dbfname    AS CHAR INIT "MYFILE.DBF" NO-UNDO.
DEF VAR fieldlist AS CHAR
INIT "ID:N8,FIO:C71,POL:L,DATAROGD:D"
NO-UNDO.
DEF VAR ok AS LOGICAL NO-UNDO.
DEF VAR stat AS INT64 NO-UNDO.
DEF VAR mes_buf AS CHAR NO-UNDO.
DEF VAR wr_str AS CHAR NO-UNDO.
DEF VAR bdate AS CHAR NO-UNDO. 

{dbfcreat.i

   &Name=dbfname
   &Fields=fieldlist
   &Ok=ok
   &Status=stat
   &Buffer=mes_buf
}

Значение переменной ok будет отражать результат создания DBF-файла. FALSE - при ошибке в процессе создания DBF файла и TRUE - в случае успешного создания DBF файла.

Код ошибки записывается в переменную stat (при положительном результате имеет значение  равное 2), а ее комментарий в mes_buf. В случае ok = FALSE выводится сообщение об ошибке, содержащее код ошибки и ее комментарий.  

Поля таблица определяются переменной fieldlist, значение которой представляет собой перечисленные через запятую имя поля:тип поля и формат.

Возможно объявление следующих типов полей:

      Cn - текстовое поле, n - длина поля;
      D - поле даты (формат YYYYMMDD);
      Nn - целочиcленное поле, n - количество знаков;
      Nn.m - дробное число, n - число знаков целой части, 
                                          m - число знаков дробной части;
      L - логическое поле (формат F/T);

В нашем примере мы создаем таблицу со следующими полями ID:N8,FIO:C71,POL:L,DATAROGD:D 

Имена полей, независимо от их указания при объявлении, переводятся в верхний регистр автоматически.

По завершению создания пустого DBF файла начнем заполнять его данными. Для примера, заполним таблицу клиентами физ. лиц, которым в этом году (2012) исполняется 18 лет. В таблицу будем вносить ID клиента, ФИО, ПОЛ (логическое поле) и дату рождения.

FOR EACH person WHERE person.birthday >= 01/01/94 
AND
person.birthday <= 12/31/94
NO-LOCK:

Для преобразования даты рождения к требуемому формату (т.е. YYYYMMDD), используется следующий include файл:

{datedbf.i
    &iDate=birthday
    &oString=bdate
}

Данные записи передаются в DBF-фаил сплошной строкой, где они разбивается по длинам полей указанным при описание полей таблицы.

wr_str = STRING(person-id, ">>>>>>>9")                    +  /* ID:N8      */
         STRING((first-names + " " + name-last),"x(71)")  + /* FIO:C71 */
         STRING(gender, "t/f")                            + /* POL:L */
         bdate.                                              /* DATAROGD:D */

В случае, если строка готовая к передачи в DBF-файл не пуста, производим ее запись.

IF LENGTH(wr_str) > 0 THEN DO:
   {dbfwrite.i
     &Name=dbfname
     &Record=wr_str
     &Ok=Ok
     &Status=stat
     &Buffer=mes_buf
   }
END.
END.

По завершению добавления данных в DBF-файл закрываем его:

{dbfclose.i
     &Name=dbfname
     &Ok=Ok
     &Status=Stat
     &Buffer=mes_buf
}


ИМПОРТ ДАННЫХ ИЗ DBF ФАЙЛОВ В АБС


Для работы данных из DBF файлов в АБС Бисквит существует процедура dbfread.p, содержащая в себе различные процедуры по работе с DBF файлами.

  • DBFOpenRead - открывает существующий DBF-файл на чтение;
  • DBFCloseRead - закрывает ранее открытый файл;
  • DBFGetCount - возвращает кол-во записей в DBF-файл;
  • DBFRead - читает очередную запись из файла;
  • DBFGetRecord - возвращает буфер записи в виде строки;
  • DBFGetField - возвращает значение поля по имени в виде строки;
  • DBFHeader - формирует заголовок DBF-файла;
  • DBFGetHead - возвращает описание заголовка в виде строки;

Объявим необходимые нам переменные:

DEFINE VAR vCount  AS INT64  NO-UNDO.
DEFINE VAR vHead AS CHAR NO-UNDO.
DEFINE VAR vRecord AS CHAR NO-UNDO.
DEFINE VAR vField AS CHAR NO-UNDO.

DEFINE VAR vError  AS INT64  NO-UNDO.
DEFINE VAR h_dbf   AS HANDLE NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.

vError код ошибки из файла dbfwork.def

Для начала осуществим персистентный вызов процедуры dbfread.p:

RUN dbfread.p persistent SET h_dbf NO-ERROR.

Откроем интересующий нас DBF файл (MYFILE.DBF) на чтение с помощью процедуры:

RUN DBFOpenRead IN h_dbf ("MYFILE.DBF",  OUTPUT vError).

Определим сколько строк (записей) содержит DBF-файл:

RUN DBFGetCount IN h_dbf (OUTPUT vCount, OUTPUT vError).

Определим поля таблицы и их формат:

RUN DBFGetHead IN h_dbf (OUTPUT vHead, OUTPUT vError).

Возвращаемая строка vHead представляет собой список <имя поля>:<формат> с разделителем запятая.

Пример: ID:N8.0,FIO:C71,POL:L,DATAROGD:D

Читаем строки DBF-файла:

{setdest.i}
DO i = 1 TO vCount:
RUN DBFRead IN h_dbf (OUTPUT vError).
RUN DBFGetRecord IN h_dbf (OUTPUT vRecord,
     OUTPUT vError).
IF vError = 0 THEN                       
PUT UNFORMATTED vRecord SKIP.                          
END.
{preview.i}

Запись таблицы представляет собой совокупность значений всех полей таблицы в их формате без разделителя. Полученную строку необходимо разобрать согласно полям и их формату.

Так для нашего примера: 

  • ID - первый 8-м символов строки (размер поля 8 символов);
  • FIO - c 9-го символа по 79-й символ строки (размер поля 71 символ);
  • POL - 80 символ (Логической значение - 1 символ t/f);
  • DATAROGD - c 81-го по 88 символ строки (дата занимает 8 символов).

Для получения значений отдельного поля используется процедура DBFGetField:

{setdest.i}
DO i = 1 TO vCount:
RUN DBFRead IN h_dbf (OUTPUT vError).
RUN DBFGetField IN h_dbf ("FIO",
OUTPUT vField,
OUTPUT vError).
IF vError = 0 THEN                       
PUT UNFORMATTED vField SKIP.                          
END.
{preview.i}

По завершению работы с DBF-файлом его необходимо закрыть:

RUN DBFCloseRead IN h_dbf.
Вы здесь: Главная ИБС Бисквит БАЗОВЫЙ ИПОРТ-ЭКСПОРТ ДАННЫХ АБС В DBF