На СЭД включен экспорт по получении "информации из расчетных документов". Они падают в каталог, откуда их при обработке забирает АС Бюджет и перекладывает в каталог из своих настроек в виде
...
20090609\
20090610\
20090611\
20090615\
...
внутри каждого некоторый набор файлов типа
...
02671F00.BDI
02672F00.BDI
02673F00.BDI
02674F00.BDI
02675F00.BDI
...
3-5 цифра имени файла идентифицируют поселение.
Скрипт который мы используем ищет каталоги соответствующие диапазону дат на форме диалога (рис окно диалог).
Параметр "почтовый каталог" - это то что стоит в настройках АС Бюджет для почтовых сообщений урмщикам.
Параметр "буферный каталог" - это любой каталог.
Параметр "отклонение даты" - это сколько дней назад искать возможные дубликаты (чтоб повторной отправки не было).
Остальные параметры - фильтры.
Скрипт обрабатывает нужные каталоги и на основе файлов в этих каталогах в АС Бюджет формирует письма УРМ соответствующим поселенцам.
Соответствие 3-5 цифры имени файла и поселения задана статически (для других районов надо будет подправить).
Код: Выделить всё
// автоформирование писем для поселений с файлами полученными из ОФК
// Ейский район
// 13.02.2008
// 02.05.2009 под пересылку BD файлов, без удаления из исходного каталога
включить "Project";
включить "\Библиотеки\LibRu.lib";
включить "\Библиотеки\ABLtools.lib";
включить "\Библиотеки\SysUtils.lib"; // операции с файлами
константы
УзелИмя = 'Бюджет\Объекты\Интерфейсы\{5BA0A88A-9B78-44C8-AB3B-765F20230FFF}\настройки\Создание_BD_Параметры';
//стрПуть = "z:\buffer\"; // каталог для промежуточной сортировки
// стрПутьНаОтправку = "z:\messages\"; // каталог с письмами УРМ
// стрПутьИсх = "G:\Банк\katalog\UFK\OK\"; // каталог с файлами из ОФК
переменные
стрПуть, стрПутьНаОтправку,стрПутьИсх : строка;
дат : целое; // цикл по датам
дата_нач, дата_кон : целое;
длг : ДиалогПараметров;
стрПутьНаОтправкуГотов : строка;
мас,сдБуфер : статическиеданные;
фСсылка : целое;
ОбщееУникальноеИмя : строка; //
провНачДата, провКонДата : строка;
Узел : УзелРеестра;
//====================================================================================================
функция ВыполнитьЗапросКБазе(запрос : строка; сс : статическиеДанные) : целое;
переменные
фЗапрос : строка;
начало
результат := -1;
попытка
сс.Закрыть;
фЗапрос := "[PumpData] { " + запрос + " }";
сс.СоединитьБД;
сс.Запрос := фЗапрос;
сс.Открыть;
сс.ВНачало;
результат := сс.ЧислоЗаписей;
обязательно
конец;
конец;
//====================================================================================================
функция СоздатьКаталог(фИмя : строка):целое;
переменные
фИмяФайла : строка;
начало
findfirst(фИмя + "\*.*",32,фИмяФайла);
если фИмяФайла <> "" и FileExists(фИмя + "\" + фИмяФайла) тогда
начало
//сообщение(Подстрока(фИмяФайла,1,2));
если (Подстрока(фИмяФайла,1,2)<>"m_" и Диалог.Флаг("ПроверкаНаПустыеКаталоги")) тогда ВызватьОшибку("Промежуточные каталоги не пусты");
пока findnext(фИмя + "\*.*")<>0 и FileExists(фИмя + "\" + фИмяФайла) делать
начало
если (Подстрока(фИмяФайла,1,2)<>"m_" и Диалог.Флаг("ПроверкаНаПустыеКаталоги")) тогда ВызватьОшибку("Промежуточные каталоги не пусты");
конец;
конец;
если не DirectoryExists(фИмя) тогда CreateDir(фИмя);
конец;
//====================================================================================================
// Создает html файл для письма. Пока содержание для всех одинаково
функция ВыбратьТекстовыйФайл(Тип : строка): строка;
переменные
УникальноеИмя : строка;
начало
попытка
УникальноеИмя := ОбщееУникальноеИмя;
если не FileExists(стрПутьНаОтправку + УникальноеИмя + ".html") тогда фСсылка := FileCreate(стрПутьНаОтправку + УникальноеИмя + ".html");
FileClose(фСсылка);
фСсылка := FileOpen(стрПутьНаОтправку + УникальноеИмя + ".html",1);
результат := стрПутьНаОтправку + УникальноеИмя + ".html";
выбрать тип из
"1" : FileWriteln(фСсылка,"Это сообщение ФУ для УРМ ",24);
иначе ВозбудитьОшибку("Нет такого типа сообщения");
конец;
обязательно
FileClose(фСсылка);
конец
конец;
//====================================================================================================
// возвращает iD сообщения по типу, теме и напоминанию
функция ВыбратьИдСообщения(Тип : строка;Тема : строка;Напоминание : строка): целое;
переменные
ЗапросСообщений : Строка;
начало
результат :=-1;
попытка
ЗапросСообщений := "select id from remotemailmessages where 1=1";
если тип<>"" тогда ЗапросСообщений := ЗапросСообщений + " and textfilename='" + ВыбратьТекстовыйФайл(тип) + "'";
если тема<>"" тогда ЗапросСообщений := ЗапросСообщений + " and subject='" + тема + "'";
если напоминание<>"" тогда ЗапросСообщений := ЗапросСообщений + " and reminder='" + напоминание + "'";
ВыполнитьЗапросКБазе(ЗапросСообщений,сдБуфер);
Если сдБуфер.ЧислоЗаписей = 0 тогда ВозбудитьОшибку("Не найдено сообщение");
Если сдБуфер.ЧислоЗаписей > 1 тогда ВозбудитьОшибку("Больше 1 сообщения найдено");
результат := сдБуфер.ПолеПоИмени("ID").КакЦелое;
обязательно
конец;
конец;
//====================================================================================================
функция СоздатьЗаголовокПисьма(Тип : строка;Тема : строка;Напоминание : целое): целое;
переменные
фЗапрос : строка;
начало
фЗапрос := "insert into remotemailmessages (subject,textfilename,reminder,createdate) values ('" + тема + "','" + ВыбратьТекстовыйФайл(тип) + "','" + ЦелоеВСтроку(напоминание)+ "','NOW')";
//Сообщение(фЗапрос);
ВыполнитьЗапрос(фЗапрос);
конец;
//====================================================================================================
функция СоздатьПолучателяПисьма(ИД : целое;Получатель:Целое): целое;
переменные
фЗапрос : строка;
начало
фЗапрос := "insert into remotemailclientmessages (messageref,remoteclientref) values ('" + ЦелоеВстроку(ИД) + "','" + ЦелоеВстроку(Получатель) + "')";
//Сообщение(фЗапрос);
ВыполнитьЗапрос(фЗапрос);
конец;
//====================================================================================================
функция СоздатьВложениеПисьма(стрИмяФайла:строка;ИД : целое): целое;
переменные
фЗапрос : строка;
начало
фЗапрос := "insert into remotemailattachedfiles (attachedfilename,messageref) values ('" + стрИмяФайла + "','" + ЦелоеВстроку(ИД) + "')";
//Сообщение(фЗапрос);
ВыполнитьЗапрос(фЗапрос);
конец;
//====================================================================================================
функция ПроверкаОтсылки(фИмя : строка) : строка;
переменные
фМас : статическиеДанные;
фф : строка;
начало
фМас := создатьстатическиеданные;
результат := "";
провКонДата := ДатаВСтроку(ТекущаяДата);
провНачДата := ДатаВСтроку(РасширДатаВОбычную( ОбычнаяДатаВРасшир(ТекущаяДата) - СтрокаВцелое(длг.Значение("ОтклонениеДаты")) ));
ВыполнитьЗапросКБазе("select * from remotemailmessages m,remotemailattachedfiles f where m.id=f.messageref and m.createdate>'" + провНачДата + "' and m.createdate<'" + провКонДата + "'" ,фМас);
фМас.ВНачало;
пока не ФМас.ВКонце делать
начало
фф := ExtractFileName(фМас.ПолеПоИмени("attachedfilename").какСтрока);
если фф = фИмя тогда
начало
результат := "Уже отсылался файл " + фИмя + "! найден : " + фМас.ПолеПоИмени("attachedfilename").какСтрока + " : " + фМас.ПолеПоИмени("subject").какСтрока + " : " + фМас.ПолеПоИмени("createdate").какСтрока + " Продолжить обработку?";
если Сообщение(результат, 1, кнопка_Да + кнопка_Нет)=результат_Да тогда результат := "";
конец;
фМас.Следующая;
конец;
конец;
//====================================================================================================
функция ПроверкаОтсылкиВсех(фМас : статическиеДанные) : строка;
начало
// результат := "";
// фМас.ВНачало;
// пока не ФМас.ВКонце делать
// начало
// результат := ПроверкаОтсылки(фМас.ПолеПоИмени("имя").КакСтрока);
// если результат <> "" тогда
// начало
// если Сообщение(результат, Соообщение_Предупреждение, кнопка_Да + кнопка_Нет)=результат_Нет тогда ВызватьОшибку("Прервано пользователем с целью недопущения повторной обработки")
// иначе результат := "";
// конец;
// фМас.Следующая;
// конец;
конец;
//====================================================================================================
функция СоздатьКаталоги: целое;
начало
результат :=-1;
попытка
СоздатьКаталог(стрПуть + "671");
СоздатьКаталог(стрПуть + "672");
СоздатьКаталог(стрПуть + "673");
СоздатьКаталог(стрПуть + "674");
СоздатьКаталог(стрПуть + "675");
СоздатьКаталог(стрПуть + "676");
СоздатьКаталог(стрПуть + "677");
СоздатьКаталог(стрПуть + "678");
СоздатьКаталог(стрПуть + "679");
СоздатьКаталог(стрПуть + "680");
СоздатьКаталог(стрПуть + "681");
СоздатьКаталог(стрПуть + "50");
СоздатьКаталог(стрПуть + "999");
обязательно
конец;
конец;
//====================================================================================================
функция ВернутьНомерКлиента(Имя : строка) : целое;
начало
результат :=-1;
попытка
выбрать имя из
"александровское" : результат:= 1883439;
"должанское" : результат:= 1883566;
"ейское" : результат:= 1887680;
"камышеватское" : результат:=1885677;
"копанское" : результат:=1887754;
"красноармейское" : результат:= 1887653;
"кухаривское" : результат:=1885637;
"моревское" : результат:=1885657;
"трудовое" : результат:=1887711;
"ясенское" : результат:=1887769;
"ейск" : результат:=2801084;
"урм" : результат:=999;
"671" : результат:= 1883439;
"672" : результат:= 1883566;
"674" : результат:= 1887680;
"675" : результат:=1885677;
"676" : результат:=1887754;
"677" : результат:= 1887653;
"678" : результат:=1885637;
"679" : результат:=1885657;
"680" : результат:=1887711;
"681" : результат:=1887769;
"673" : результат:=2801084;
конец;
обязательно
конец;
конец;
//====================================================================================================
// создает в каталоге сообщений УРМ подкаталог для хранения вложений письма
функция СоздатьКаталогНаОтправку(доб : строка) : строка;
переменные
УникальноеИмя : строка;
начало
результат :=-1;
попытка
УникальноеИмя := ОбщееУникальноеИмя + "_files";
CreateDir(стрПутьНаОтправку + УникальноеИмя);
результат := стрПутьНаОтправку + УникальноеИмя;
обязательно
конец;
конец;
//====================================================================================================
// на основе данных полученных "проверитьКаталог" формируем письмо и переносим файлы из промежуточного
функция ОбработатьКаталог(имя:строка;фмас : статическиеданные);
переменные
времИмя : строка;
начало
//сообщение(фмас.ЧислоЗаписей);
если фмас.ЧислоЗаписей >0 и фмас.ПолеПоИмени("имя").КакСтрока<>"" тогда
начало
//показатьданные(фмас);
фмас.вначало;
СоздатьЗаголовокПисьма(1,ОбщееУникальноеИмя,0);
СоздатьПолучателяПисьма(ВыбратьИДСообщения(1,ОбщееУникальноеИмя,0),ВернутьНомерКлиента(имя));
стрПутьНаОтправкуГотов := создатькаталогнаотправку(имя);
пока не фмас.вконце делать
начало
renamefile(стрПуть + имя + "\" + фмас.ПолеПоИмени("имя").КакСтрока, стрПутьНаОтправкуГотов + "\" + фмас.ПолеПоИмени("имя").КакСтрока);
времИмя := стрПутьНаОтправкуГотов + "\" + фмас.ПолеПоИмени("имя").КакСтрока;
СоздатьВложениеПисьма(времИмя,ВыбратьИДСообщения(1,ОбщееУникальноеИмя,0));
фмас.следующая;
конец;
конец;
конец;
//====================================================================================================
// получаем в промежуточную таблицу информацию о содержиимом каталога
функция проверитьКаталог(имя : строка;фмас : статическиеданные) : целое;
переменные
фИмя : строка;
начало
результат :=-1;
попытка
findfirst(стрПуть + имя + "\*.*",32,фИмя);
если фИмя<>"" и FileExists(стрПуть + имя + "\" + фИмя) тогда
начало
фмас.Вставить;
фмас.ПолеПоИмени("имя").КакСтрока := фИмя;
фмас.ПолеПоИмени("признак").КакЦелое := FileGetAttr(стрПуть + имя + "\" + фИмя);
пока findnext(фИмя)<>0 и FileExists(стрПуть + имя + "\" + фИмя) делать
начало
фмас.Вставить;
фмас.ПолеПоИмени("имя").КакСтрока := фИмя;
фмас.ПолеПоИмени("признак").КакЦелое := FileGetAttr(стрПуть + имя + "\" + фИмя);
конец;
конец;
обязательно
фмас.сохранить;
findclose();
конец;
конец;
// Комментарий
функция ПроверкаНеобходимости(стр : строка) : строка;
начало
результат := "нет";
если Подстрока(стр,3,3)="671" и Диалог.Флаг("671_александровское") тогда результат := "да";
если Подстрока(стр,3,3)="672" и Диалог.Флаг("672_должанское") тогда результат := "да";
если Подстрока(стр,3,3)="674" и Диалог.Флаг("674_ейское") тогда результат := "да";
если Подстрока(стр,3,3)="675" и Диалог.Флаг("675_камышеватское") тогда результат := "да";
если Подстрока(стр,3,3)="676" и Диалог.Флаг("676_копанское") тогда результат := "да";
если Подстрока(стр,3,3)="677" и Диалог.Флаг("677_красноармейское") тогда результат := "да";
если Подстрока(стр,3,3)="678" и Диалог.Флаг("678_кухаривское") тогда результат := "да";
если Подстрока(стр,3,3)="679" и Диалог.Флаг("679_моревское") тогда результат := "да";
если Подстрока(стр,3,3)="680" и Диалог.Флаг("680_трудовой") тогда результат := "да";
если Подстрока(стр,3,3)="681" и Диалог.Флаг("681_ясенское") тогда результат := "да";
если Подстрока(стр,3,3)="673" и Диалог.Флаг("673_ейск") тогда результат := "да";
конец;
//====================================================================================================
// переносим файлы из каталога с файлами ОФК в промежуточный каталог
функция проверитьКаталогИсх(фстрПутьИсх : строка;фстрПуть : строка) : целое;
переменные
фИмя : строка;
начало
результат :=-1;
попытка
findClose;
findfirst(фстрПутьИсх + "*.*",32,фИмя);
если фИмя<>"" и FileExists(фстрПутьИсх + фИмя) тогда
начало
если СтрокаВЦелое(подстрока(фИмя,1,3))>0 тогда
начало
если (ПроверкаОтсылки(фИмя) = "" и ПроверкаНеобходимости(фИмя) = "да") тогда copyfile(фстрПутьИсх + фИмя,фстрПуть + подстрока(фИмя,3,3)+ "\" + фИмя,0)
конец
иначе copyfile(фстрПутьИсх + фИмя,фстрПуть + "0" + "\" + фИмя,0);
пока findnext(фИмя)<>0 и FileExists(фстрПутьИсх + фИмя) делать
начало
если фИмя<>"" и FileExists(фстрПутьИсх + фИмя) тогда
начало
если СтрокаВЦелое(подстрока(фИмя,1,3))>0 тогда
начало
если (ПроверкаОтсылки(фИмя) = "" и ПроверкаНеобходимости(фИмя) = "да") тогда copyfile(фстрПутьИсх + фИмя,фстрПуть + подстрока(фИмя,3,3)+ "\" + фИмя,0)
конец
иначе copyfile(фстрПутьИсх + фИмя,фстрПуть + "0" + "\" + фИмя,0);
конец;
конец;
конец;
обязательно
конец;
конец;
//====================================================================================================
// глобальный вызов для обработки одного каталога
функция Вызов(фИмя : строка;фмас : статическиеданные) : целое;
начало
фмас := СоздатьСтатическиеДанные;
фмас.добавитьстроковоеполе("имя",255);
фмас.добавитьцелоеполе("признак");
фмас.открыть;
фмас.редактировать;
ОбщееУникальноеИмя := фимя + ФорматироватьВремя("YYMMDD" + "HHMMSS", ТекущаяДата);
проверитькаталог(фимя,фмас);
//проверкаОтсылкиВсех(фмас);
обработатьКаталог(фимя,фмас);
конец;
//====================================================================================================
начало
попытка Узел := Реестр.Узел(УзелИмя);
сдБуфер := СоздатьСтатическиеДанные; // для запросов к базе
// стрПуть := "z:\buffer\";
// стрПутьНаОтправку := "z:\messages\";
// стрПутьИсх := "G:\Банк\katalog\UFK\OK\";
длг := Диалог;
//-----------------------------------------
длг.Очистить;
длг.Заголовок := "Обработка пакетов";
длг.Добавить("НачальнаяДата","Дата1",0,Календарь,"00.00.0000");
длг.Добавить("КонечнаяДата","Дата2",0,Календарь,"00.00.0000");
длг.Добавить("Каталог исходных","Каталог_исх", 0, 8, "");
длг.Добавить("Буферный каталог","Каталог_буф", 0, 8, "");
длг.Добавить("Почтовый каталог","Каталог_почта", 0, 8, "");
длг.Добавить("ОтклонениеДаты","ОтклонениеДаты",0,0,"");
длг.Добавить("ПроверкаНаПустыеКаталоги","ПроверкаНаПустыеКаталоги",1,Проверка+ТолькоЧтение,"");
длг.Добавить("Поселения","Поселения",0,0);
длг.Добавить("671_александровское","671_александровское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("672_должанское","672_должанское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("674_ейское","674_ейское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("673_ейск","673_ейск",1,Проверка+ТолькоЧтение,"");
длг.Добавить("675_камышеватское","675_камышеватское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("676_копанское","676_копанское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("677_красноармейское","677_красноармейское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("678_кухаривское","678_кухаривское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("679_моревское","679_моревское",1,Проверка+ТолькоЧтение,"");
длг.Добавить("680_трудовой","680_трудовой",1,Проверка+ТолькоЧтение,"");
длг.Добавить("681_ясенское","681_ясенское",1,Проверка+ТолькоЧтение,"");
//-----------------------------------------
длг.Значение("Дата1") := (ТекущаяДата);
длг.Значение("Дата2") := (ТекущаяДата);
длг.Флаг("ПроверкаНаПустыеКаталоги") := 1;
длг.Флаг("671_александровское") := 1;
длг.Флаг("672_должанское") := 1;
длг.Флаг("674_ейское") := 1;
длг.Флаг("673_ейск") := 1;
длг.Флаг("675_камышеватское") := 1;
длг.Флаг("676_копанское") := 1;
длг.Флаг("677_красноармейское") := 1;
длг.Флаг("678_кухаривское") := 1;
длг.Флаг("679_моревское") := 1;
длг.Флаг("680_трудовой") := 1;
длг.Флаг("681_ясенское") := 1;
длг.Значение("ОтклонениеДаты") := 3; // сколько дней назад проверять отосланные файлы
длг.Значение("Каталог_исх") := Узел.Значение("КаталогИсходных").КакСтрока; //"G:\Банк\katalog\UFK\OK\";
длг.Значение("Каталог_буф") := Узел.Значение("КаталогБуфер").КакСтрока; //"z:\buffer\";
длг.Значение("Каталог_почта") := Узел.Значение("КаталогПочта").КакСтрока;
//-----------------------------------------
если не (длг.выполнить) тогда выход;
стрПуть := длг.Значение("Каталог_буф");
стрПутьНаОтправку := длг.Значение("Каталог_почта");
стрПутьИсх := длг.Значение("Каталог_исх");
Узел.Значение("КаталогИсходных").КакСтрока := длг.Значение("Каталог_исх");
Узел.Значение("КаталогБуфер").КакСтрока := длг.Значение("Каталог_буф");
Узел.Значение("КаталогПочта").КакСтрока := длг.Значение("Каталог_почта");
СоздатьКаталоги; // подкаталоги в промежуточном каталоге
дата_нач := ОбычнаяДатаВРасшир(СТРОКАВДАТУ(длг.Значение("Дата1")));
дата_кон := ОбычнаяДатаВРасшир(СТРОКАВДАТУ(длг.Значение("Дата2")));
Если дата_нач>дата_кон тогда вызватьошибку("НачальнаяДата больше чем КонечнаяДата");
Если дата_кон-дата_нач>СтрокаВЦелое(Диалог.Значение("ОтклонениеДаты")) тогда вызватьошибку("Разница между НачальнойДатой и КонечнойДатой больше 3 дней");
если не(DirectoryExists(стрПуть)) тогда ВозбудитьОшибку("Нет исходного каталога " + стрПуть);
если не(DirectoryExists(стрПутьНаОтправку)) тогда ВозбудитьОшибку("Нет каталога сообщений " +стрПутьНаОтправку);
если не(DirectoryExists(стрПутьИсх)) тогда ВозбудитьОшибку("Нет каталога исходных " +стрПутьИсх);
//от дат:=дата_нач до дата_кон делать ПроверитьКаталогИсх(стрПутьИсх,стрПуть); // все дни перегоняем в промежуточный
от дат:=дата_нач до дата_кон делать ПроверитьКаталогИсх(стрПутьИсх + ЦелоеВСтроку(дат) + "\" ,стрПуть); // все дни перегоняем в промежуточный
если Диалог.Флаг("671_александровское") тогда вызов(671,мас);
если Диалог.Флаг("672_должанское") тогда вызов(672,мас);
если Диалог.Флаг("674_ейское") тогда вызов(674,мас);
если Диалог.Флаг("675_камышеватское") тогда вызов(675,мас);
если Диалог.Флаг("676_копанское") тогда вызов(676,мас);
если Диалог.Флаг("677_красноармейское") тогда вызов(677,мас);
если Диалог.Флаг("678_кухаривское") тогда вызов(678,мас);
если Диалог.Флаг("679_моревское") тогда вызов(679,мас);
если Диалог.Флаг("680_трудовой") тогда вызов(680,мас);
если Диалог.Флаг("681_ясенское") тогда вызов(681,мас);
если Диалог.Флаг("673_ейск") тогда вызов(673,мас);
обязательно
конец;
конец.
У вас нет необходимых прав для просмотра вложений в этом сообщении.