|  30.09.2008, 14:23 | #1 | 
| Участник | 
			
			Всем здравствуйте! В форме 7023 Sales Price Worksheet на кнопке Функции добавил MenuItem, кот. вызывает новый отчет для импорта цен из Excel: ImportSalesPricefromExcel.RUN; (где ImportSalesPricefromExcel - это переменная типа Report, соответствующая новому отчету). В отчете установлено свойство ProcessingOnly=True; один DataItem Integer с фильтром на 1. В отчете содержится следующий код: На OnPreReport: IF NOT CREATE(xlApp,TRUE) THEN BEGIN CLEAR(xlApp); ERROR(Text000); END; На Integer - OnAfterGetRecord(): [Делаются разные проверки на заполненность iFile, iSheet;] xlApp.Visible := FALSE; xlApp.Workbooks.Open(iFile); xlBook := xlApp.ActiveWorkbook; [проверка на существование листа с именем iSheet;] xlSheet := xlBook.Worksheets.Item(iSheet); xlSheet.Activate; xlRange := xlSheet.UsedRange; IF Found THEN BEGIN Import(); //В функции Import просматриваю таблицу Excel и заполняю таблицу 7023 Sales Price Worksheet. xlBook.Save; MESSAGE(Text005); END; xlBook.Close(FALSE); xlApp.Quit; CLEAR(xlApp); В Text005 содержится 'Загрузка завершена'. После завершения работы отчета иногда!!! появляется сообщение <<'Импорт Цен Продажи из Excel' не может быть закрыто, так как система работает>>, и уже за ним <<Загрузка завершена>>. Причем первое сообщение появляется не всегда, иногда после второго запуска, иногда после первого, иногда после третьего... При пошаговом выполнении в Debugger оно вообще никогда не появляется. Причем загрузка выполняется корректно вне зависимости от появления этого сообщения. В чем может быть дело??? При запуске отчета из ObjectDesigner, а не из формы 7023 подобного сообщения не наблюдалось. Что предпринималось для решения проблемы: -для вызова отчета использовался Report.Run(50005); -для вызова отчета использовались свойства Action и RunObject у MenuItem. -много еще всего. P.S. Разработка ведется в Navision 5.0, хотя, скорее всего, та же ошибка и в других версиях. | 
|  | 
|  30.09.2008, 14:30 | #2 | 
| Участник | 
			
			Скорей всего он выполняет цикл: На Integer - OnAfterGetRecord(): а в ней он пытается закрыть книгу после первого цикла. я думаю должно быть так: Код: IF Found THEN BEGIN Import(); //В функции Import просматриваю таблицу Excel и заполняю таблицу 7023 Sales Price Worksheet. xlBook.Save; MESSAGE(Text005); END ELSE BEGIN xlBook.Close(FALSE); xlApp.Quit; CLEAR(xlApp); END; | 
|  | 
|  30.09.2008, 14:55 | #3 | 
| Участник | 
			
			ImportSalesPricefromExcel.RUNMODAL;
		 | 
|  | 
|  30.09.2008, 16:02 | #4 | 
| Участник | 
			
			by_HT, в свойствах DataItem указан фильтр только на 1 (SORTING(Number) WHERE(Number=CONST(1))). Пробовал ставить BreakPoint в OnAfterGetRecord - он заходит туда только один раз. Чтобы Excel не висел в процессах, в случае успеха тоже надо делать xlBook.Close(False); xlApp.Quit; Clear(xlApp); Я привел сокращенный код, в оригинале этот кусок такой: IF Found THEN BEGIN xlSheet := xlBook.Worksheets.Item(iSheet); xlSheet.Activate; Import(); xlBook.Save; MESSAGE(Text005); END ELSE BEGIN xlBook.Close(FALSE); xlApp.Quit; CLEAR(xlApp); ERROR(Text008); END; xlBook.Close(FALSE); xlApp.Quit; CLEAR(xlApp); Romeo, с Runmodal пробовал уже, вообще странные вещи получаются: форма запроса отчета закрыватеся, отчет начинает работать, появляется окно, что "...не может быть закрыто, так как система работает", потом мо сообщение, что Загрузка завершена, потом при возвращении фокуса в табличную часть формы 7023 опять появляется форма запроса моего отчета (заполненная, с именем файла Excel, с именем листа и т.д.) !!! и так по кругу. Но иногда, как и в случае с Run, все работает. У меня есть подозрение, что Navision пытается закрыть отчет не дождавшись, пока завершится вся работа внутри отчета (типа закрытия объектов Automation; в таблице, куда произвожу запись, некоторые поля заполняются через SalesPriceWksh.Validate(); SalesPriceWksh.Insert(True), т.е. с обработчиком; в функции Import вначале SalesPriceWksh.LOCKTABLE, а в конце Commit (хотя пробовал их комментарить, дело не в них)). | 
|  | 
|  30.09.2008, 16:09 | #5 | 
| Участник | 
			
			Falcongeo, а вы часом индикатор процента выполнения не выводите на экран во время импорта?
		 | 
|  | 
|  30.09.2008, 16:20 | #6 | 
| Участник | 
			
			Может OnPostDataItem, а не OnAfterGetRecord!
		 | 
|  | 
|  30.09.2008, 16:43 | #7 | 
| Участник | 
			
			Milk, не, явно никаких диалоговых окон не вывожу дополнительно. ShowPrintStatus в свойствах отчета = Yes, но для ProcessingOnly = Yes он не имеет значения вроде.
		 | 
|  | 
|  30.09.2008, 16:48 | #8 | 
| Участник | 
			
			by_HT, переделал все в OnPostDataItem - с третьего раза все равно появилось это сообщение!  (( | 
|  | 
|  30.09.2008, 16:56 | #9 | 
| Участник | 
			
			Первый раз такое сообщение появилось, причем не понятно как от него избавиться теперь... Проблема не именно с моим компьютером, на других тоже иногда появлятеся. | 
|  | 
|  30.09.2008, 17:04 | #10 | 
| Участник | 
			
			Интересно, что с первого раза ничего не появляется... Обычно раза со второго-третьего, причем параметры на форме запроса (типа цены включают НДС или не включают, параметры округления и т.п.) должны быть различны в разных запусках...
		 | 
|  | 
|  30.09.2008, 18:27 | #11 | 
| Участник | 
			
			Поступило предложение добавить Sleep(1000), чтобы подождать и дать дополнительное время системе на закрытие Excel. В обоих приведенных ниже вариантах xlBook.Close(FALSE); xlApp.Quit; SLEEP(10000); CLEAR(xlApp); xlBook.Close(FALSE); xlApp.Quit; CLEAR(xlApp); SLEEP(10000); ошибка все равно появляется!!! А 10 секунд - это большое время. Есть ли еще какие-то варианты решения проблемы? Могу выложить объекты где-нибудь, если кто-то хочет попробовать... | 
|  | 
|  01.10.2008, 13:18 | #12 | 
| Участник | 
			
			Попробуйте запускать отчет на форме, сначала очищая переменную report CLEAR(ImportSalesPricefromExcel); ImportSalesPricefromExcel.RUN; | 
|  | 
|  01.10.2008, 14:36 | #13 | 
| Участник | 
			
			Andrey, спасибо за идею. Попробовал CLEAR(ImportSalesPricefromExcel); ImportSalesPricefromExcel.RUN; но с 3 раза все равно появилось сообщение. В отчете еще используется CU Common Dialog Management для выбора файла. Поэтому в OnInitReport добавил ClearAll на всякий случай. Но ошибка осталась! Пробовал еще не пользоваться окном выбора файла, а просто вводить имя файла в поле ввода - все равно ошибка... | 
|  | 
|  12.12.2008, 09:18 | #14 | 
| Участник | 
			
			Спасибо, helga! Так и сделали. Сначала думали открыть Excel-файл, прочитать информацию, добавить текстовые комментарии, сохранить и закрыть. Но не получилось. После обработки делаем Excel видимым для пользователя и не делаем Quit: и результат можно сразу посмотреть, и ошибки не появляются  Всем спасибо! | 
|  | 
|  12.12.2008, 10:22 | #15 | 
| Участник | 
			
			Helga, не совсем понял насчет FALSE. Если использовать код XlAppl.Visible(FALSE); XlAppl.UserControl(FALSE); CLEAR(XlAppl); , то получим висящий в процессах Excel и все. | 
|  | 
|  15.12.2008, 11:12 | #16 | 
| Участник | Цитата:   | 
|  |