Работа с файлами DBF

Чтение файла DBF
Запись в файл DBF
Работа со структурой файла DBF
Работа с удаленными записями
Работа с индексами

 

Чтение файла DBF

В данном случае, мне кажется, что проще написать программу и прокомментировать ее, чем делать что-то еще. Вы уже такие продвинутые, раз добрались до этой главы! Я горжусь вами!

Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF
Файл.ОткрытьФайл("catalog.dbf"); //открываем файл на диске
Файл.КодоваяСтраница(1); //задаем кодировку: 0 - windows, 1 - DOS

Если Файл.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
........Сообщить("Не удалось открыть файл!");
КонецЕсли;

Файл.Первая(); //позиционируемся на первой записи
Пока Файл.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
.......НомерЗаписи = Файл.НомерЗаписи(); //получаем номер текущей записи
.......НазвТовара = Файл.NAME; //получаем значение поля
.......Цена = Файл.ПолучитьЗначениеПоля("PRICE"); //так тоже можно, но чуть медленнее
.......Файл.Следующая(); //переходим на следующую запись
КонецЦикла;

Файл.Последняя(); //позиционируемся на первой записи
Пока Файл.ВНачале()=0 Цикл //пока не дошли до начала, крутим цикл
.......НазвТовара = Файл.NAME;
.......Цена = Файл.PRICE;
.......Файл. Предыдущая(); //переходим на предыдущую запись
КонецЦикла;

Для н = 1 По Файл.КоличествоЗаписей() Цикл //здесь все понятно, по-моему
......Файл.Перейти(н); //позиционируемся на определенной записи
.......НазвТовара = Файл.NAME;
.......Цена = Файл.PRICE;
КонецЦикла;

Файл.ЗакрытьФайл(); //не забывайте пожалуйста


Запись в файл DBF

Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF

//определяем структуру файла
//Синтаксис: ДобавитьПоле(<Название>,<Тип>,<Длина>,<Точность>)

Файл.ДобавитьПоле("NAME","S",50,0);
Файл.ДобавитьПоле("PRICE","N",10,2);

Файл.СоздатьФайл("catalog.dbf"); //создаем файл физически

СпрТовары.ВыбратьЭлементы();
Пока СпрТовары.ПолучитьЭлемент()=1 Цикл
.......Файл.Добавить();
.......Файл.NAME = СпрТовары.Наименование;
.......Файл.УстановитьЗначениеПоля("PRICE",СпрТовары.Цена) //так тоже можно;
.......Файл.Записать();
КонецЦикла;

Файл.ЗакрытьФайл(); //не забывайте пожалуйста


Работа со структурой файла DBF

Например, создадим файл, идентичный по структуре исходному.
//При этом применяется метод ОписаниеПоля, который возвращает характеристики поля с указанным номером
//синтаксис: ОписаниеПоля(<НомерПоля>,<НазваниеПоля>,<Тип>,<Длина>,<Точность>)

Файл1 = СоздатьОбъект("XBASE");
Файл2 = СоздатьОбъект("XBASE");

Файл1 = ОткрытьФайл("file1.dbf");

Для н = 1 По Файл1.КоличествоПолей() Цикл
........НазвПоля = "";
........Тип = "";
........Длина = 0;
........Точность = 0;
........Файл1.ОписаниеПоля(н,назвПоля,Тип,Длина,Точность);
........Файл2.ДобавитьПоле(назвПоля,Тип,Длина,Точность);
КонецЦикла;

Для работы с файлом DBF неизвестной структуры часто применяются следующие методы:
ПолучитьЗначениеПоля(<ИмяПоля>);
УстановитьЗначениеПоля(<ИмяПоля>,<значение>);


Работа с удаленными записями
Файлы DBF устроены таким образом, что удаление записи не приводит к физическому удалению записи из файла. Запись просто помечается на удаление и пропускается при переборе. Таким образом размер файла остается прежним. Чтобы физически удалить все помеченные на удаление записи нужно применить метод Сжать. Средства встроенного языка позволяют работать с такими записями, перебирать их и даже отменять пометку на удаление.

Файл.ПоказыватьУдаленные(1);
Файл.Первая();
Пока Файл.ВКонце()=0 Цикл
......Если Файл.ЗаписьУдалена()=1 Тогда
............Файл.Восстановить();
......КонецЕсли;
......Файл.Следующая();
КонецЦикла;

Файл.Первая();
Пока Файл.ВКонце()=0 Цикл
......Если Файл.PRICE < 1000 Тогда
............Файл.Удалить();
......КонецЕсли;
......Файл.Следующая();
КонецЦикла;

Файл.Сжать(); //удалить записи физически

Можно удалить все записи в файле одним движением. При этом они физически удаляются и не могут быть восстановлены.
Файл.ОчиститьВсе();

Стоит еще отметить про метод Очистить(), что он очищает все поля текущей записи. Атрибуты, соответствующие полям типа "строковый" приобретают значение «пустая строка», числовой — 0, логический — 0, дата — «пустая дата».


Работа с индексами

Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.

Каждый индекс имеет наименование, признак уникальности, выражение индекса и фильтр. Наименование индекса используется для идентификации индекса. Выражение индекса и фильтр представляют собой написанные на специальном языке выражения, вычисление значения которых для каждой записи позволяет определить ее место при упорядочивании и необходимость помещения ее в упорядоченный список (индекс может содержать упоминание не обо всех записях таблицы, а только об удовлетворяющих выражению фильтра). Уникальный индекс (имеющий установленным признак уникальности) позволяет иметь в индексе ссылки на записи только с различным значением индексного выражения.

Основное правило: индекс нужен, чтобы быстро искать нужную запись.

DBF-ФАЙЛ
Индекс по фамилии
Физ. номер записи
Фамилия
1
Иванов
2
Абдулов
3
Барабанов
4
Мирнов
5
Раскольников
6
Комаров
Фамилия
Физ. номер записи
Абдулов
2
Барабанов
3
Иванов
1
Мирнов
4
Комаров
6
Раскольников
5

Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле DBF и производим прямое позиционирование на нужную запись.

После создания структуры базы данных можно добавить индексы следующим образом:
//Синтаксис: ДобавитьИндекс(<Название>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>)

Файл = СоздатьОбъект("XBase");
Файл.ДобавитьПоле("NAME", 1, 19, 3);
Файл.ДобавитьПоле("PRICE", 2, 25, 0);
Файл.ДобавитьИндекс("IDXCODE", "CODE", 1, 0, "");
Файл.ДобавитьИндекс("IDXNAME", "NAME", 0, 0, "");
Файл.ДобавитьИндекс("IDXNAMECODE", "NAME+CODE", 0, 0, "");
Файл.СоздатьФайл("mydb.dbf", "mydb.cdx");

//1-й вариант
Файл.ТекущийИндекс("IDXNAME");
Файл.Найти("Иванов",0); //передается значение и режим поиска

//2-й вариант
Файл.ТекущийИндекс("IDXNAMECODE");
Файл.Ключ.NAME = "Иванов";
Файл.Ключ.CODE = 123;
Файл.НайтиПоКлючу(0);

//после сбоя рекомендуется заново переформировать все индексы
Файл.Переиндексировать();

В 1С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.

к оглавлению

Знаете ли Вы, что такое мысленный эксперимент, gedanken experiment?
Это несуществующая практика, потусторонний опыт, воображение того, чего нет на самом деле. Мысленные эксперименты подобны снам наяву. Они рождают чудовищ. В отличие от физического эксперимента, который является опытной проверкой гипотез, "мысленный эксперимент" фокуснически подменяет экспериментальную проверку желаемыми, не проверенными на практике выводами, манипулируя логикообразными построениями, реально нарушающими саму логику путем использования недоказанных посылок в качестве доказанных, то есть путем подмены. Таким образом, основной задачей заявителей "мысленных экспериментов" является обман слушателя или читателя путем замены настоящего физического эксперимента его "куклой" - фиктивными рассуждениями под честное слово без самой физической проверки.
Заполнение физики воображаемыми, "мысленными экспериментами" привело к возникновению абсурдной сюрреалистической, спутанно-запутанной картины мира. Настоящий исследователь должен отличать такие "фантики" от настоящих ценностей.

Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").

Максимально, на что может претендовать "мысленный эксперимент" - это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution