![]() |
#1 |
Columbus IT
|
Приветствую Вас...
При рытье в функциональности Документооборота Аксапты 3.0 выявилось следующее: В Excel вставляем данные из шапки заказа (SaleTable) и строки заказа (SalesLine). Проблема в следующем: Строки заказов вставляются в одни и те же ячейки - в итоге в документе Excel остается только последняя строка заказа... Можно ли как-нибудь это исправить??? (Перевод Каретки не помогает!) Ну если начали, говорить об этом, то еще один вопрос... Вставляем тоже самое в Word - все ок - все сроки видны, НО Axapta не понимает закладки, созданные в Worde... Что можно с этим сделать??? Не исключаю, что мог что-нибудь сам упустить из вида, так как никакой документации у меня по этой функциональности к сожалению нет... Спасибо за ответы, если такие будут ![]() |
|
![]() |
#2 |
Участник
|
Спасибо, den_ram.
Да, в вывести строчки в ecxel при помощи документооброта и у меня не получилось. Кто знает как вывести строчки в Excel? |
|
![]() |
#3 |
Шаман форума
|
Что значит "не понимает закладки" в Ворде?
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
![]() |
#4 |
Участник
|
это значит, что пишешь закладки для строчек, а весь текст все равно выводится в первую закладку строчки таблицы.
![]() |
|
![]() |
#5 |
Шаман форума
|
А! это не победить, насколько я понимаю- откуда она заранее знает, сколько там будет строчек?
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
![]() |
#6 |
Участник
|
как откуда? из связанной таблицы... в ворде строчки то делает...
хорошо. постараюсь разобраться. |
|
![]() |
#7 |
Administrator
|
На самом деле, сколько будет строчек она не знает (по крайней мере, не считает). Больше того, вывод в документ производится по полям, а не по записям (то есть, таблицы выводятся по столбцам, а не по строкам). Чтобы создать видимость разбивки на строки, Axapta вставляет мягкий перенос (soft line break) между различными значениями поля при выводе. Лучше всего это заметно при выводе документов в Word.
С Excel что-то напортачили они немного. Чуть-чуть поправив классы DocuActionCOM_Excel и DocuActionTrans можно добиться такого же поведения при создании документов Excel, как и при создании документов Word. Во-первых, в методе insertField класса DocuActionTrans нужно указать, чтобы перевод строки (soft line break) при переходе к новой записи вставлялся после уже выведенного значения, а не вместо него. Блок перевода строки в оригинале: Код: if (first) first = false; else this.insertSoftLineBreak(); Код: if (first) first = false; else { this.insertSoftLineBreak(curPos); curPos++; } Код: // MAXIM, Move right if no hard break void mainInsertField(DocuField docuField, DocuRef docuRef) { COM range; ; super(docuField, docuRef); if (!docuField.HardLineBreak) { range = sysExcelRange.comObject(); range = range.offset(0,1); range.select(); sysExcelRange.comObject(range); } }
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#8 |
Columbus IT
|
Цитата:
Сообщение от Maxim Gorbunov
Блок перевода строки в оригинале:
Код: if (first) first = false; else this.insertSoftLineBreak(); Код: if (first) first = false; else { this.insertSoftLineBreak(curPos); curPos++; } Я сделал изменение, о котором ты говорил, но у меня Excel как скидывал строки в одни и те же ячейки, так и скидывает... ![]() |
|
![]() |
#9 |
Участник
|
Maxim появится чуть позже.
|
|
![]() |
#10 |
Administrator
|
Maxim появился
![]() Да, так и должно быть. То есть, в одну ячейку через символ перевода строки ("\r") будут слиты все отобранные значения одного поля (например, itemId из SalesLine). Сделать так, чтобы различные значения одного и того же поля выводились в разные ячейки мне не удалось. Указанный fix служит лишь для того, чтобы в ячейку выводились все отобранные значения, а не только последнее.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#11 |
Columbus IT
|
Цитата:
Сообщение от Maxim Gorbunov
Maxim появился
![]() Да, так и должно быть. То есть, в одну ячейку через символ перевода строки ("\r") будут слиты все отобранные значения одного поля (например, itemId из SalesLine). Сделать так, чтобы различные значения одного и того же поля выводились в разные ячейки мне не удалось. Указанный fix служит лишь для того, чтобы в ячейку выводились все отобранные значения, а не только последнее. ![]() Неужели нельзя вставить комманду экселю переходить на следующую ячейку вниз... типа клавиши Enter??? |
|
![]() |
#12 |
Участник
|
Прошу прощение, что выдвигаю непроверенную гипотезу.
Есть такая функция в Excel "Текст по столбцам". Так вот она сохраняет настройки от последнего применения. И это иногда приводит к интересным эффектам при попытке вставки текста через буфер обмена (разбиение текста с " на несколько столбцов). Может быть, можно задать в её параметрах, что '\r' является окончанием строки и тогда Excel начнет автоматом переходить на новую строку? |
|
![]() |
#13 |
Administrator
|
Хм... Сначала начал писать ответ, что нифига не возможно выводить данные в разные строчки, а потом решил проверить....
![]() Оказывается МОЖНО! ![]() Все, что нужно сделать, это вместо того блока, который я рекомендовал изменить в методе insertField класса [b]DocuActionTrans, вставить HardLineBreak. То есть, следующий код: Код: if (first) first = false; else this.insertHardLineBreak(); Большое спасибо den_ram и Wamr за идею.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#14 |
Administrator
|
Единственное дополнение: после такой модификации желательно не использовать вывод полей в документы без закладок. То есть, при настройке Типа Документа в Axapta следует указывать закладки для всех выводимых полей.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#15 |
Columbus IT
|
Большое спасибо всем, принявшим участие в данном обсуждении, за нахождение решения поставленной проблемы!
![]() |
|
![]() |
#16 |
Columbus IT
|
Эээ... у меня еще одна проблема...
![]() Шаблоны не присоединяются... Создаю в Excel шаблон - прикрепляю его к документу... Когда создаю уже сам документ... он на чистом листе , а не на листе с моими комментариями из шаблона... Затереться они не могли! |
|
![]() |
#17 |
Administrator
|
Known problem, как говорится...
![]() При настройке типа документа поставьте галочку "Проверка таблицы" (см. рисунок).
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#18 |
Columbus IT
|
Есть контакт
![]() ![]() Еще раз спасибо ![]() |
|
![]() |
#19 |
Columbus IT
|
Дааа... чувствую эта тема никогда не закроется
![]() Подскажите, пожалуйста, как указывать ячейки на другом листе - отличном от изначального? Ссылка вида Лист1!а5 не помогает... Закладка тоже не помогает... Аксапта видит закладки только на текущей странице шаблона... Я понимаю, что есть выход сделать все на одном листе! Но может быть есть какой-то выход и в ссылки можно прописать в другой лист... |
|
![]() |
#20 |
Administrator
|
Немного покопался... Да, по человечески (без программирования) сделать это нельзя.
![]() ![]() Немного теории для начала. В интерфейсах Excel есть два метода для выбора Range: один в интерфейсе Worksheet (range выбирается в контексте листа книги Excel), другой в интерфейсе Application (range можно выбирать вообще как угодно, хоть из другого файла). Так вот, в документообороте Axapta используется первый метод, но приложив минимум усилий можно заставить его использовать второй. Во-первых, надо написать обертку для второго метода. В класс SysExcelApplication добавьте абстрактный метод range: Код: abstract public SysExcelRange range(str _rangeName = '') { } Код: public SysExcelRange range(str _rangeName = "") { return SysExcelRange::construct(MSOfficeVersion::Office2000, _rangeName ? application.range(_rangeName) : application.range()); } Код: public SysExcelRange range(str _rangeName = "") { return SysExcelRange::construct(MSOfficeVersion::OfficeXP, _rangeName ? application.range(_rangeName) : application.range()); } Код: sysExcelRange = sysExcelWorksheet.range(bookmark); Код: sysExcelRange = sysExcelApplication.range(bookmark);
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|