AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2008, 14:23   #1  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Всем здравствуйте!
В форме 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  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Скорей всего он выполняет цикл: На 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  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
ImportSalesPricefromExcel.RUNMODAL;
Старый 30.09.2008, 16:02   #4  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
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  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Falcongeo, а вы часом индикатор процента выполнения не выводите на экран во время импорта?
Старый 30.09.2008, 16:20   #6  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Может OnPostDataItem, а не OnAfterGetRecord!
Старый 30.09.2008, 16:43   #7  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Milk, не, явно никаких диалоговых окон не вывожу дополнительно. ShowPrintStatus в свойствах отчета = Yes, но для ProcessingOnly = Yes он не имеет значения вроде.
Старый 30.09.2008, 16:48   #8  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
by_HT, переделал все в OnPostDataItem - с третьего раза все равно появилось это сообщение!((
Старый 30.09.2008, 16:56   #9  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Первый раз такое сообщение появилось, причем не понятно как от него избавиться теперь...
Проблема не именно с моим компьютером, на других тоже иногда появлятеся.
Старый 30.09.2008, 17:04   #10  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Интересно, что с первого раза ничего не появляется... Обычно раза со второго-третьего, причем параметры на форме запроса (типа цены включают НДС или не включают, параметры округления и т.п.) должны быть различны в разных запусках...
Старый 30.09.2008, 18:27   #11  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Поступило предложение добавить 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  
AnDr is offline
AnDr
Участник
 
6 / 10 (1) +
Регистрация: 06.02.2006
Попробуйте запускать отчет на форме, сначала очищая переменную report

CLEAR(ImportSalesPricefromExcel);
ImportSalesPricefromExcel.RUN;
Старый 01.10.2008, 14:36   #13  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Andrey, спасибо за идею.
Попробовал
CLEAR(ImportSalesPricefromExcel);
ImportSalesPricefromExcel.RUN;
но с 3 раза все равно появилось сообщение.

В отчете еще используется
CU Common Dialog Management для выбора файла.
Поэтому в OnInitReport добавил ClearAll на всякий случай.
Но ошибка осталась!
Пробовал еще не пользоваться окном выбора файла, а просто вводить имя файла в поле ввода - все равно ошибка...
Старый 12.12.2008, 09:18   #14  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Спасибо, helga!
Так и сделали.
Сначала думали открыть Excel-файл, прочитать информацию, добавить текстовые комментарии, сохранить и закрыть.
Но не получилось. После обработки делаем Excel видимым для пользователя и не делаем Quit: и результат можно сразу посмотреть, и ошибки не появляются
Всем спасибо!
Старый 12.12.2008, 10:22   #15  
Falcongeo is offline
Falcongeo
Участник
 
15 / 10 (1) +
Регистрация: 29.05.2008
Helga, не совсем понял насчет FALSE.

Если использовать код
XlAppl.Visible(FALSE);
XlAppl.UserControl(FALSE);
CLEAR(XlAppl);
, то получим висящий в процессах Excel и все.
Старый 15.12.2008, 11:12   #16  
Urgen is offline
Urgen
Участник
 
8 / 10 (1) +
Регистрация: 15.11.2006
Цитата:
Сообщение от Falcongeo Посмотреть сообщение
Helga, не совсем понял насчет FALSE.

Если использовать код
XlAppl.Visible(FALSE);
XlAppl.UserControl(FALSE);
CLEAR(XlAppl);
, то получим висящий в процессах Excel и все.
я перед самым CLEAR(XlAppl); добавляю XlAppl.Visible(true); то есть ёксель становится видимым для пользователя только в самом конце, иначе, если пользователь в этом листе попытается что либо сделать во время вывода, может возникнуть ошибка в NAV. К тому же при выводе большого количества строк, скорость заметно, в разы, выше при экспорте в фоне. У меня такое ощущение, что это из-за расчета вертикального бегунка в ёкселе
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.