Функция загрузки из dbf

Универсальная функция чтения данных из dbf файлов и создания таблицы значений.

Функция возвращает таблицу значений с колонками, имена которых заданы в списке колонок. Далее по этой ТЗ легко заполнить, например, табличную часть используя ЗаполнитьЗначенияСвойств().

&НаСервере
// Функция загружает данные из указанного dbf файла в таблицу значений.
// Параметры:
//  ИмяФайла - строка - полный путь к файлу.
//  Кодировка - КодировкаXBase.
//  СписокКолонок - СписокЗначений - список колонок, которые будут прочитаны,
//      СписокКолонок.Значение - имя колонки в dbf файле,
//      СписокКолонок.Представление - имя колонки в таблице значений,
//      СписокКолонок.Пометка - читать колонку из файла; истина = читать,
//      ложь = колонка будет создана в итоговой ТЗ, но не заполнена.
//
Функция ЗаполнитьТЗизDBF(ИмяФайла, Кодировка, СписокКолонок)

    // Открытие файла данных
    ФайлДанных = Новый XBase(ИмяФайла);
    ФайлДанных.Кодировка = Кодировка;
    Если Не ФайлДанных.Открыта() Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не удалось открыть файл " + ИмяФайла;
        Сообщение.Сообщить();
        Возврат Неопределено;
    КонецЕсли;

    // Переменные и объекты, что бы не создавать постоянно в цикле
    ОписаниеБулево = Новый ОписаниеТипов("Булево");
    ОписаниеДаты = Новый ОписаниеТипов("Дата",,, Новый КвалификаторыДаты(ЧастиДаты.Дата));

    // Создание таблицы значений
    ТабЗнач = Новый ТаблицаЗначений;
    Для Каждого Поле из ФайлДанных.Поля Цикл
        Колонка = СписокКолонок.НайтиПоЗначению(Поле.Имя);
        Если Колонка <> Неопределено Тогда
            Если Поле.Тип = "L" Тогда
                Тип = ОписаниеБулево;
            ИначеЕсли Поле.Тип = "D" Тогда
                Тип = ОписаниеДаты;
            ИначеЕсли (Поле.Тип = "N") ИЛИ (Поле.Тип = "F") Тогда
                Тип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Поле.Длина, Поле.Точность));
            Иначе
                Тип = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(Поле.Длина));
            КонецЕсли;
            ТабЗнач.Колонки.Добавить(Колонка.Представление, Тип);
        КонецЕсли;
    КонецЦикла;

    // Заполнение строк таблицы
    Если (ТабЗнач.Колонки.Количество() <> 0) И (ФайлДанных.Первая()) Тогда
        Пока Истина Цикл
            СтрокаТаб = ТабЗнач.Добавить();
            Для Каждого Поле из ФайлДанных.Поля Цикл
                Колонка = СписокКолонок.НайтиПоЗначению(Поле.Имя);
                Если (Колонка <> Неопределено) И Колонка.Пометка Тогда
                    СтрокаТаб[Колонка.Представление] = ФайлДанных[Поле.Имя];
                КонецЕсли;
            КонецЦикла;
            Если Не ФайлДанных.Следующая() Тогда Прервать; КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    ФайлДанных.ЗакрытьФайл();
    Возврат ТабЗнач;
КонецФункции

Публикация на Infostart.


Опубликовано

в

от

Метки: