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 |
Участник
|
я перед самым CLEAR(XlAppl); добавляю XlAppl.Visible(true); то есть ёксель становится видимым для пользователя только в самом конце, иначе, если пользователь в этом листе попытается что либо сделать во время вывода, может возникнуть ошибка в NAV. К тому же при выводе большого количества строк, скорость заметно, в разы, выше при экспорте в фоне. У меня такое ощущение, что это из-за расчета вертикального бегунка в ёкселе
|
|