|
07.03.2012, 17:06 | #1 |
Участник
|
вывод по листам Excel
Добрый вечер всем!!
Возник вопрос. Есть шаблон *.xlt , в нем три листа, на первый лист вывожу при помощи textBuffer некоторые данные: X++: while select * from rPaySheetTrans where rPaySheetTrans.sheetTableRecId == rPaySheetTable.RecId { counter++; buffer.addValue(counter); buffer.addValue(EmplTable::find(rPaySheetTrans.Emplid).name()); buffer.addValue(EmplBankAccount_RU::find(rPaySheetTrans.Emplid,rPaySheetTrans.EmplBankAccountId,false).AccountNum); buffer.addValue(rPaySheetTrans.Amount); amount += rPaySheetTrans.Amount; buffer.addNewLine(); } |
|
07.03.2012, 17:50 | #2 |
Участник
|
командой excel выбрать нужный worksheet из коллекции activeworkbook.worksheets
__________________
Felix nihil admirari |
|
07.03.2012, 17:55 | #3 |
Участник
|
http://forum.mazzy.ru/index.php?showtopic=385
Третий параметр - номер листа, в который надо выводить данные PS: На всякий случай замечу, что вывод в Excel через буфер обмена - не лучшее решение. Проблема связана с тем, что сам по себе буфер обмена - это внешний (по отношению к Axapta) объект, который Вы не в состоянии контролировать. В связи с этим возникают самые разнообразные проблемы, решить которые, зачастую, просто невозможно. Нет инструментов управления этим самым буфером обмена из среды Axapta. Более "управляемым" выглядит решение по передаче данных через предварительно созданный Com-объект RecordSet. Это чуть медленнее, чем работа с буфером обмена, но именно что "чуть". Взамен получаем полную управляемость процесса и независимость от "внешних" факторов.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 07.03.2012 в 18:21. |
|
|
За это сообщение автора поблагодарили: NickMDAX (1). |
08.03.2012, 00:19 | #4 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
http://forum.mazzy.ru/index.php?showtopic=385
Нет инструментов управления этим самым буфером обмена из среды Axapta. |
|
08.03.2012, 02:10 | #5 |
Участник
|
Хотя бы. События разворачиваются во времени, винды, начиная, по крайней мере, с NT 3.51, - ОС с вытесняющей многозадачностью, на каждом втором рабочем столе - комп с многоядерным процом... В таких условиях (а тем более на каком-нить терминальном сервере) нельзя без механизма блокировок быть уверенным, что если в момент времени n вы поместили что-то в буфер обмена, то в момент времени n+1 вы вставите из буфера то же самое. Если у вас m одновременно работающих пользователей в системе, на такие "мелочи" можно закрывать глаза; при числе пользователей m*3 стоимость разруливания проблем уже может перевесить стоимость переделки механизма вывода в Excel на что-то более надежное и детерминированнное.
|
|
08.03.2012, 04:47 | #6 |
Участник
|
На многозадачных компьютерах работают многозадачные пользователи, пока отчет строится, им может быть нужно с другими документами работать. Я теперь понял, что это было, когда на одной инсталляции во время построения отчетов нельзя было буфером пользоваться. Отчеты причем строились десятками минут. Если это так работает, то, думаю, подход с буфером можно применять только при очень крайней необходимости.
|
|
11.03.2012, 10:56 | #7 |
Участник
|
Цитата:
Ситуация как в анекдоте. "Пуля вышла из ствола. Проблемы на Вашей стороне" Тот факт, что в "мишень" не попали (в буфер обмена ничего не записалось) - никого не интересует... Еще один очень неприятный момент. Перед тем как что-то посылать в буфер обмена он должен быть инициализирован. Должен существовать. Из среды Axapta Вы никак не можете определить факт его существования. Я столкнулся с этой проблемой при работе на бездисковых станциях. Как оказалось, в момент включения этих станций буфер обмена просто не существует. Пришлось устраивать "пляски с бубном" чтобы хоть иногда заставлять его инициализироваться. Ну, и то, на что уже обратили внимание. Процесс закрузки данных в буфер обмена может быть достаточно длительным по времени. И пользователь может вмешаться в этот процесс банально нажав Ctrl+C, затем Ctrl+V. Обратите внимание, что по приведенной ссылке процесс копирования через буфер обмена зациклен. Это как раз один из вариантов "бубна", поскольку нет других средств контроля. Приходится изворачиваться...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
11.03.2012, 09:42 | #8 |
Участник
|
У каждого пользователя в системе свой буфер обмена. При использовании текстового буфера, буфер обмена используется на самом последнем этапе (в зависимости от архитектуры отчета), а долгое время уходит на выборку данных. При вставке из текстового буфера в Excel может быть потеря или искажение данных, тк Excel любит преобразовывать данные в нужный ему тип
|
|
11.03.2012, 13:48 | #9 |
Enjoy!
|
Можно так:
X++: //первая вставка данных buffer.excelOutput(); buffer.blockReset(); buffer.setSheetNo(2); //вторая вставка данных buffer.excelOutput(); buffer.excelFinishOutput(); |
|