ИПОРТ-ЭКСПОРТ ДАННЫХ АБС В 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.