gifts2017

Функция загрузки из DBF-файлов

Опубликовал Руслан Харисов (fAngel) в раздел Программирование - Практика программирования

Часто приходится что-то загружать из DBF-файлов и для того, чтобы не вспоминать каждый раз, как и что, сделал универсальную функцию загрузки DBF-файла в ТаблицуЗначений.
Функция ЗаполнитьТЗизDBF(ИмяФайла)
    Файл = создатьОбъект("XBASE");
    тз = СоздатьОбъект("ТаблицаЗначений");
    // открыть файл
    Файл.ОткрытьФайл(ИмяФайла);
    Файл.КодоваяСтраница(1); //задаем кодировку: 0 - windows, 1 - DOS 
    Если Файл.Открыта()=0 Тогда
        Сообщить("Не удалось открыть файл!");
        Возврат 0;
    КонецЕсли;
    сз = СоздатьОбъект("СписокЗначений");	// список имен полей
    // заполнение колонок ТЗ
    Для к = 1 По Файл.КоличествоПолей() Цикл
        ИмяПоля = "";
        Тип = "";
        Длинна = 0;
        Точность = 0;
        Файл.ОписаниеПоля(к, ИмяПоля, Тип, Длинна, Точность);
        сз.ДобавитьЗначение(ИмяПоля);
        тз.НоваяКолонка(ИмяПоля);
    КонецЦикла;
    // заполнение строк ТЗ
    Для н = 1 По Файл.КоличествоЗаписей() Цикл
        Файл.Перейти(н);
        тз.НоваяСтрока();
        Для к = 1 По сз.РазмерСписка() Цикл
            ИмяПоля = сз.ПолучитьЗначение(к);
            тз.УстановитьЗначение(н, ИмяПоля, Файл.ПолучитьЗначениеПоля(ИмяПоля));
        КонецЦикла;
    КонецЦикла;	
    Файл.ЗакрытьФайл();
    Возврат тз;
КонецФункции

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Аркадий Кучер (Abadonna) 28.05.08 04:49
http://infostart.ru/profile/1329/projects/786/
глДБФ_в_ТЗ.ert
DBF Viewer.ert (7.7)
DBFViewer.erf (8.1)
Шёпот теней; +1 Ответить 1
2. Руслан Харисов (fAngel) 28.05.08 07:30
Спасибо действительно размерность полей не учитывает точку,
но моя проще она позволяет обрабатывать данные не излишни
заморачиваясь на удаленные записи. Мое мнение легчи читается.
3. desty (lustin) 28.05.08 08:54
можно глупый вопрос ?
[code]
ТекстЗапроса = "select * from <ИмяТаблицыДБФ> ";
ТЗ = _OleDbCommand.ВыполнитьИнструкцию(ТекстЗапроса);
Возврат ТЗ;
[code]

извините но XBASE как то по моему "не кашерно"
4. desty (lustin) 28.05.08 08:55
ОФФ к СУппорту - "Хочется предварительный просмотр комментария"
5. Руслан Харисов (fAngel) 28.05.08 17:17
Согласен, но не всегда можно подгрузить 1cpp или что-то похожее,
а делать через ODBC драйвер из 1С очень грамостко получается, хотя
иногда производительность сильно возрастает.
6. desty (lustin) 28.05.08 17:51
не вижу никаких проблем - к тому же уже давно не модно применять odbc

Код
Функция ЗаполнитьТЗизDBF_ПрямойЗапрос(ПУтьКФайлу, ИмяФайла)
   Перем ТЗ;
   Попытка
      _Соединение = СоздатьОбъект("OLEDBData");
      _Соединение.Соединение(" 
      |Provider=VFPOLEDB.1;
   //   |Deleted=Yes; 
      |Null = Yes; 
      |Exclusive = No;
      |SourceType = DBF; 
      |Data Source=" + ПУтьКФайлу + ";
      |Mode=ReadWrite;
      |Extended Properties="""";
      |User ID="""";
      |Password="""";
      |Mask Password=False;
      |Collating Sequence=MACHINE; 
      |DSN="""""); 

      _Команда = _Соединение.СоздатьКоманду();
      ТЗ = _Команда.ВыполнитьИнструкцию("SELECT * FROM "+ИмяФайла);
      _Команда.Закрыть();
      _Соединение.Закрыть();
   Исключение
      ТЗ = ЗаполнитьТЗизDBF(ПУтьКФайлу+ИмяФайла);
   КонецПопытки;
   Возврат ТЗ;
КонецФункции // ЗаполнитьТЗизDBF
Показать полностью


типа того - функцию я примерно проверил *-)
7. Руслан Харисов (fAngel) 29.05.08 07:35
В результате опять прямой обход выборки, SQL удобнее использовать
при запросах объединениях, иначе XBASE быстрее, если нужна выборка
можно сделать индекс. Мне не нравится сама работа с OLE и гадать как примеры на
VB будут выгладить в синтаксисе 1С иногда не хочется. Документации по VFP мне не
удалось найти нормальной, что бы сделать что-то сложное.
8. Diims (diims) 05.11.08 16:46
Вот для 8.1 в кратце)

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

Для сч=1 по ДБФ.КоличествоЗаписей() цикл
ДБФ.Перейти(сч);
Стр=ТаблицаИзДБФ.Добавить();
Для к=0 по Дбф.Поля.Количество()-1 цикл
ИмяПоля=ДБФ.поля.Получить(к).Имя;
Стр.Установить(к,дбф.ПолучитьЗначениеПоля(ИмяПоля));
КонецЦикла;
КонецЦикла;
Возврат(ТаблицаИзДБФ);
//ТаблицаИзДБФ.ВыбратьСтроку();
КонецФункции
YaroslavLtv; PaNo; fAngel; +3 Ответить
9. Руслан Харисов (fAngel) 05.11.08 19:18
14. анна79 (Анна79) 20.03.12 08:44
Простите за вопрос, а куда код то втыкать?
15. Алекс Ю (AlexO) 11.05.12 15:24
(14) анна79,
это просто функции, которые можно использовать где угодно - обычно их вставляют в обработки переноса/обмена документами, справочниками и т.д. между восьмерками 1С, семерками 1С, семерками и восьмерками...
Т.е. здесь нет интерфейса - прсото приведена ключевая функция загрузки из DBF.
16. Александр Шишкин (Шёпот теней) 08.09.12 11:11
(1) ... куда катится мир ИС ... куда смотрят админы ИС ...

... перенумератоы это уже высший пилотаж по сравнению с этим ... видимо скоро "Сообщить("Hello? Word");" - станет достижением ...

... вотМЫСЛЬвот ...

п.с. ну и контингент ИС - впрочем бабки не пахнут ...

... вот ...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа