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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2008, 12:58   #1  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
ProgressBar
Подскажите как мне сделать,чтобы документ excel обрабатывался в фоновом режиме,и во время выполнения этой процедуры ,появлялось окно процесса.(progressBar)
Вот мой код программы.В моем случае весь процесс происходящего навиду(открывается окно excel и построчно заполняется данными).
Подскажите как его подкоректировать,чтобы был виден только конечный результат.
Если несложно приведите пример,я уже испробовал несколько методов,работает коряво.
X++:
public void printPage01()
 {
    real         ItogFacture,ItogProc,Facture;
   {
   Number = 1;
   _row = 12;
    while select InterestDays,InterestAmount,DueDate,ContractAccount,RcontractCode,Invoice,Closed,RemainAmount,AccountNum from CustTrans
         where CustTrans.InterestNote == CustJour.InterestNote
   while select * from FactureTrans group by FactureId
         where FactureTrans.BGR_RContractAccount == CustTrans.ContractAccount &&
               FactureTrans.BGR_RContractCode    == CustTrans.RcontractCode   &&
               FactureTrans.InvoiceId            == CustTrans.Invoice
   while select * from FactureJour
         where FactureJour.FactureId == FactureTrans.FactureId
     {
      ItogProc += CustTrans.InterestAmount;
      ExcelDocument.insertRow(_row);
      this.insertValueIntoDoc("NameKontr",           CustJour.Name);
      this.insertValueIntoDoc("FromDate",            CustJour.FromDate);
      this.insertValueIntoDoc("ToDate",              CustJour.ToDate);
      this.insertValueIntoDoc("NumberContr",         CustJour.ContractAccount);
      this.insertValueIntoDoc("A" + int2Str(_row),   Number);
      this.insertValueIntoDoc("B" + int2Str(_row),   "Счет фактура");
      this.insertValueIntoDoc("C" + int2Str(_row),   FactureJour.BGR_FromDate);
      this.insertValueIntoDoc("D" + int2Str(_row),   FactureJour.BGR_ToDate);
      this.insertValueIntoDoc("E" + int2Str(_row),   FactureJour.FactureExternalId);
      this.insertValueIntoDoc("F" + int2Str(_row),   CustTrans.Invoice);
      this.insertValueIntoDoc("G" + int2Str(_row),   FactureJour.amountInclTax());
      this.insertValueIntoDoc("H" + int2Str(_row),   CustTrans.Closed);
      this.insertValueIntoDoc("K" + int2Str(_row),   CustTrans.InterestDays);
      this.insertValueIntoDoc("M" + int2Str(_row),   CustTrans.InterestAmount);
      this.insertValueIntoDoc("I" + int2Str(_row),   CustTrans.RemainAmount);
      this.insertValueIntoDoc("J" + int2Str(_row),  -CustTrans.RemainAmount);
      this.insertValueIntoDoc("Data",                CustJour.ContractDate);
      this.insertValueIntoDoc("Itog2",                 ItogProc);
   while select * from CustOpen
         where CustOpen.AmountMST == CustTrans.RemainAmount &&
               CustOpen.AccountNum == CustTrans.AccountNum
      {
ItogFacture += CustOpen.AmountMST;
this.insertValueIntoDoc("J" + int2Str(_row),  CustTrans.RemainAmount);
this.insertValueIntoDoc("Itog", ItogFacture);
}
Number++;
_row++;
 }
 }
}
Старый 18.06.2008, 13:14   #2  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Делайте для экселя visible(false) в начале, потом заполняйте его данными, а в конце visible(true). А на счет прогрессбара или поищите сдесь или посмотрите как сделано в стандартных отчетах. Например, в классе LedgerRRGRunReport_RU смотрите метод outputReport().
Старый 18.06.2008, 13:19   #3  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
Спасибо за подсказку,помогло.Вопрос закрыт
Старый 18.06.2008, 13:20   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
код, мягко говоря, написан неграмотно. используйте хотябы join, вместо 3х циклов и почитайте что-нибудь про вставку в эксель, чтобы вставлять не отдельно в ячейки

Последний раз редактировалось ice; 18.06.2008 в 13:22.
Старый 18.06.2008, 13:57   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
И переменные с маленьких букавок!!!
Старый 19.06.2008, 10:16   #6  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Post
Уже год, как я использую небольшой движок для многостраничного экспорта в Excel, завязанного на использовании шаблонов.
Класс написан таким образом, чтобы в наследниках было как можно меньше кода. При этом гибкость движка вы также сможете оценить.
Существует возможность не только генерить отчет на основании шаблона и выводить пользователю, а также без отображения сохранять на диск в определенную папку.
Это уж, на что вы горазды и насколько изобретательны
В целом, я считаю, что добился значительного снижения трудозатрат на разработку практически любой сложности отчета.
На разработку отчета, в среднем уходит пара часов (а мы знаем, на сколько это, обычно, рутинная задача).
Я думаю возможности движка перекроют все ваши потребности в экпорте в Excel.
И еще одно, класс построен так, что при возникновении исключения во время генерации отчета - excel визуализируется, дабы не наплодить ненужных процессов.
Генерация отчета происходит в два этапа:
1) Сбор данных и упаковка в map.
2) Инициализация Excel и выгрузка в него структурированных данных.
Это минимизирует время взаимодействия Axapta с внешним приложением.
Да, и только одна маленькая просьба: не удаляйте мои комменты
А то неприятно видеть свой код под чужими комментами
Вложения
Тип файла: xpo FastExcelReport.xpo (44.5 Кб, 356 просмотров)

Последний раз редактировалось Jox; 19.06.2008 в 10:40.
Старый 20.08.2008, 11:24   #7  
Shakr
Гость
 
n/a
while select * from FactureTrans group by FactureId

так можно писать? будет работать?

По поводу прогресс бара:
Если ваш класс наследуется от RunBase*, то там уже есть "встроенный" прогресс. На самом деле, он делает тот же самый прогресс, что и вы будете делать руками, но самого кода будет меньше. Методы "встроенного" прогресса:
Код:
\Classes\RunBase\progressInit  //этим методом инициализируем: this.progressInit(....)
\Classes\RunBase\parmProgress //этим методом получаем доступ к нему; увеличить счётчик так: this.parmProgress().incCount();
\Classes\RunBase\progressHide //этим прячем
\Classes\RunBase\progressKill //этим - убиваем после исполнения
Старый 20.08.2008, 11:33   #8  
Shakr
Гость
 
n/a
Цитата:
Делайте для экселя visible(false) в начале, потом заполняйте его данными, а в конце visible(true).
Цитата:
класс построен так, что при возникновении исключения во время генерации отчета - excel визуализируется, дабы не наплодить ненужных процессов
В двух словах это выглядит так:
Код:
...
ComExcelDocument_Ru doc;
...
try{
 инициализировали doc
 doc.visible(false);
... заполняем данными...
 doc.visible(true);
}
catch()
{
 doc.visible(true);
}
Теги
download, excel, progress bar, runbase, законченный пример, как правильно, отчет, полезное, программно, экспорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
mazzy: Комфортный ProgressBar Blog bot DAX Blogs 12 05.02.2009 19:54
ProgressBar в StatusBar(е) Morpheus DAX: База знаний и проекты 8 10.09.2007 15:21
Свой progressBar Андре DAX: База знаний и проекты 65 11.08.2007 12:42
Проблема с инициализацией экземпляра объекта Jox DAX: Программирование 2 11.01.2006 12:55

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:33.