18.06.2008, 12:58 | #1 |
Участник
|
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 |
Участник
|
Делайте для экселя visible(false) в начале, потом заполняйте его данными, а в конце visible(true). А на счет прогрессбара или поищите сдесь или посмотрите как сделано в стандартных отчетах. Например, в классе LedgerRRGRunReport_RU смотрите метод outputReport().
|
|
18.06.2008, 13:19 | #3 |
Участник
|
Спасибо за подсказку,помогло.Вопрос закрыт
|
|
18.06.2008, 13:20 | #4 |
Участник
|
код, мягко говоря, написан неграмотно. используйте хотябы join, вместо 3х циклов и почитайте что-нибудь про вставку в эксель, чтобы вставлять не отдельно в ячейки
Последний раз редактировалось ice; 18.06.2008 в 13:22. |
|
18.06.2008, 13:57 | #5 |
Программатор
|
И переменные с маленьких букавок!!!
|
|
19.06.2008, 10:16 | #6 |
Developer
|
Уже год, как я использую небольшой движок для многостраничного экспорта в Excel, завязанного на использовании шаблонов.
Класс написан таким образом, чтобы в наследниках было как можно меньше кода. При этом гибкость движка вы также сможете оценить. Существует возможность не только генерить отчет на основании шаблона и выводить пользователю, а также без отображения сохранять на диск в определенную папку. Это уж, на что вы горазды и насколько изобретательны В целом, я считаю, что добился значительного снижения трудозатрат на разработку практически любой сложности отчета. На разработку отчета, в среднем уходит пара часов (а мы знаем, на сколько это, обычно, рутинная задача). Я думаю возможности движка перекроют все ваши потребности в экпорте в Excel. И еще одно, класс построен так, что при возникновении исключения во время генерации отчета - excel визуализируется, дабы не наплодить ненужных процессов. Генерация отчета происходит в два этапа: 1) Сбор данных и упаковка в map. 2) Инициализация Excel и выгрузка в него структурированных данных. Это минимизирует время взаимодействия Axapta с внешним приложением. Да, и только одна маленькая просьба: не удаляйте мои комменты А то неприятно видеть свой код под чужими комментами Последний раз редактировалось Jox; 19.06.2008 в 10:40. |
|
20.08.2008, 11:24 | #7 |
Гость
|
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 |
Гость
|
Цитата:
Делайте для экселя 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 | 12 | |||
ProgressBar в StatusBar(е) | 8 | |||
Свой progressBar | 65 | |||
Проблема с инициализацией экземпляра объекта | 2 |
|