|
![]() |
#1 |
Участник
|
А использовать системную табличку File не пробовали? И для всего автоматизма настроить соответствующий Job Queue (T. 472) и повесить его выполнение на NAS?
Т.е. 1.создаёте один Codeunit для Job Queue. 2. В Codeunit'e проходитетe циклом по табличке File, находите там нужные вам XML-файлы, запускаете для каждого XML-Port (для этого процесса создать второй Codeunit) , в случае успеха/неудачи обработки каждого файла удаляете файл в папку ArchivOK или ArchivNOK. Т.е что-то типа: Код: fileRec.RESET; fileRec.SETRANGE(Path, 'C:\'); IF fileRec.FINDFIRST THEN; // -> что-то типа нажатия клавиши F5 в Windows Explorer fileRec.RESET; fileRec.SETRANGE(Path, MyDirectory); fileRec.SETRANGE("Is a file", TRUE); fileRec.SETFILTER(Name, '*.xml); IF fileRec.FINDSET THEN BEGIN REPEAT // обработка фаила вo втором Codeunit'e напр. по имени 'FileProcessing' CLEAR(FileProcessing); FileProcessing.SetFile(fileRec); // передача имени фаила в codeunit для обработки оного там хмл-портом CLEARLASTERROR(); COMMIT; IF FileProcessing.RUN() THEN BEGIN RENAME(fileRec.Name,'C:\ArchivOK\fileRec.Name'); END ELSE BEGIN RENAME(fileRec.Name,'C:\ArchivNOK\fileRec.Name'); // ... так же можно ещё Log написать типа файл такой то не обработан так => смотри GETLASTERRORTEXT END; UNTIL fileRec.NEXT = 0; END; |
|
![]() |
#2 |
Участник
|
Спасибо за совет, Алекс, он мне очень помог!
Автозапуск решил при помощи Job Queue, окно убрал запуская ХМЛ-порт через XMLPORT.IMPORT. Следующий код поместил в codeunit, который использовал в Job Queue: Код: SalesSet.GET; DirectoryInfo := DirectoryInfo.DirectoryInfo(SalesSet."Orders from Customers"); List := DirectoryInfo.GetFiles('*.XML'); enumerator := List.GetEnumerator; WHILE enumerator.MoveNext DO BEGIN FileInfo := enumerator.Current; XmlFile.OPEN(SalesSet."Orders from Customers" + FileInfo.Name); XmlFile.CREATEINSTREAM(InputStream); IF XMLPORT.IMPORT(XMLPORT::"Orders From Web", InputStream) THEN BEGIN FileInfo.CopyTo(SalesSet."Archive Orders from Customers" + FileInfo.Name, TRUE); FileInfo.Delete; END; XmlFile.CLOSE; END; |
|
![]() |
#3 |
Участник
|
Не за что, если помог, то поставьте +1
![]() Я всё-таки советую вынести обработку каждого файла из JobQueue-codeunit'а в отдельный codeunit и вызывать результат обработки посредством IF CODEUNIT.RUN() (т.е. как я уже описал). Как вы в этом новом codeunit'е эти файлы просматриваете / обрабатываете, вашим методом Dot.Net или File.таблицей, XML-Port'ом или ещё как: по барабану, главное: функциональность вынести в в отдельный codeunit и вызывать результат обработки КАЖДОГО файла посредством IF CODEUNIT.RUN(). В этом варианте программа обработает ВСЕ файлы, с положительным или отрицательным результатом, но ВСЕ. Поверьте моему опыту: в вашем варианте JobQueue примется например за обработку 100 файлов, на 15-ом файле случится какая-нибудь ошибка (XML-Port не сможет его прочитать /обработать или при импорте заказов в NAV-таблицы случилась ошибка при INSERT'е или VALIDATE (я надеюсь вы при импорте валидируете хотя бы самые важные поля!), и.т.д. и.т.п ), ваш JobQueue на этом 15-ом файле остановится и вылетит с соотв. ошибкой и остальные файлы останутся не обработанными. |
|