helpf.pro
Регистрация
 0 
Распечатать

Загрузка данных из текстовых файлов с выборкой через ADO.

Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.

Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!

Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt

Где XXXXX – порядковой номер пары файлов

Структура строки в Head_XXXXX.txt :

Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ

Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.

В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С

Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:

Код
[ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4

[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9


Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:

Ниже приведен пример кода для платформы 1С 8:

Код 1C v 8.х
 // Загружает данные из текстовых данных
// Параметры
// Стр_КаталогДанных - <Строка>
// Автор: Gmix 04.05.2006 12:22:09
// Возвращаемое значение:
//   <Булево>
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
            // проверки заполнения
           
            ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
            Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
                        Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
                        Возврат Ложь;
            КонецЕсли;
           
            Если НЕ ОБ_ФайлДанных.Существует() Тогда
                Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
                        Возврат Ложь;
            КонецЕсли;
           
            ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
            ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
            ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
           
            //Определяем пару файлов
            Стр_ОкончаниеФайла="";
            ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
            Для каждого ФайлШапки Из ФайлыШапок Цикл
                        Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
                        Стр_таблицаШапки=ФайлШапки.Имя;
                       
                        Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
                        Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
                        ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
                        Если НЕ ФайлСтрок.Существует() Тогда
                            Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
                                   Продолжить;
                        КонецЕсли;
                       
                        //Создаем схему данных
                        ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
                        Если ФайлСхемыДанных.Существует() Тогда
                                   Попытка
                                       УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
                                   Исключение
                                       Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
                                               Возврат Ложь;
                                   КонецПопытки;
                        КонецЕсли;
                       
                        Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
                                                                                  |ColNameHeader=False
                                                                                  |Format=FixedLength
                                                                                  |Col1=NumberNote Text Width 20
                                                                                  |Col2=StoreNum Text Width 5
                                                                                  |Col3=DataNote DateTime Width 10
                                                                                  |Col4=DataDev DateTime Width 10
                                                                                  |Col5=DataDes DateTime Width 10
                                                                                  |Col6=CountLine Long Width 4
                                                                                  |["+Стр_ТаблицаСтрок+"]
                                                                                  |ColNameHeader=False
                                                                                  |Format=FixedLength
                                                                                  |Col1=NumberNote Text Width 20
                                                                                  |Col2=Articul Text Width 7
                                                                                  |Col3=Counts Double Width 9";
                       
                        ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
                        ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
                        ТекстСхемы.Закрыть();
                       
                        // Создаем коннект
                        Попытка
                                   ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
                        Исключение
                                   Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
                            Возврат Ложь;
                        КонецПопытки;
 
                        Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
                       
                        Попытка
                                    ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);                
                        Исключение
                            Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
                                   Возврат Ложь;          
                        КонецПопытки;
 
                        Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
                                  
                                   // Заказ
                                  
                                   Стр_НомерЗаказа     = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
                                   Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
                                  
                                   Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
                                   Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
                                   Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
                                   Ч_КоличествоСтрок            = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
                               
                                   Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);

                                   // Обработка строк заказа
                                  Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
                                   Попытка
                                               ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);               
                                   Исключение
                                               Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
                                               Возврат Ложь;          
                                   КонецПопытки;
                                  
                                   Сч=0;
                                   Сообщить(" №           Артикул                     Количество");
                                   Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
                                               //Заполняем таб часть документа
                                               Сч=Сч+1;
                                              Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
                                               Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
                                               Сообщить(""+Сч+"    " +Стр_Артикул+ "               "+Ч_Количество);
                                               ОБ_АДОРекордсетСтроки.MoveNext();
                                   КонецЦикла;
                                   ОБ_АДОРекордсетШапка.MoveNext();
                        КонецЦикла;
            КонецЦикла;
    Возврат Истина;
КонецФункции   


Автор Журавлев Михаил Викторович
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 15650
 0 
Распечатать
Возможно, вас также заинтересует
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Автоматическая установка ширины колонки табличного документа. 0
Процедура, которая " примерно" делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего: Процедура РасчетШириныКолонок(Табличный
Алгоритм шифрования RC4 1
Для решения некоторых задач, иногда требуется имееть возможность шифровать и дешифровывать, какие-то данные. Но при этом нет возможности использовать стороние внешнии компоненты. Предлагаем пример реализации алгоритма шифрования RC4 на встроенном яз
Библиотека кода: Сравнить две таблицы значений 0
//Сравнивает две таблицы значений // Функция ТаблицыЗначенийРавны(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт Если ТипЗнч(ТаблицаЗначений1) Тип("ТаблицаЗначений") ИЛИ ТипЗнч(ТаблицаЗначений2) Тип("ТаблицаЗначений") Тогда Возв
Быстрая функция чтения данных с листа Excel 11
При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки ра
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!