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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2020, 14:40   #1  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
OpenXml. C# -> X++
Всем привет!
Вопрос чайника знатокам C#. Пытаюсь конвертировать следующий условно рабочий код:
X++:
private void InsertBookmarkText(BookmarkStart bookmark, string value)
{
     bookmark.Parent.InsertAfter(new Run(new Text(value)), bookmark);
}
Но в X++ получаю ошибку:
X++:
 private void insertBookmarkText(
    DocumentFormat.OpenXml.Wordprocessing.BookmarkStart _bookmark,
    System.String                                       _value)
{
    DocumentFormat.OpenXml.OpenXmlElement       parent;
    DocumentFormat.OpenXml.Wordprocessing.Run   run;
    DocumentFormat.OpenXml.Wordprocessing.Text  text;
    ;
    parent  = _bookmark.get_Parent();

    text    = new DocumentFormat.OpenXml.Wordprocessing.Text(_value);
    run     = new DocumentFormat.OpenXml.Wordprocessing.Run(text);

    parent.InsertAfter(run, _bookmark); //Здесь ошибка: Аргумент 1 несовместим с требуемым типом 
}
Что не так то?

DAX2012 R3
Старый 21.10.2020, 15:33   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
308 / 403 (14) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Посмотрите на использование OXML_RU\invokeGeneric в приложении.

Например, вот так используется при добавлении нового листа
OxmlWorkBook_RU\insertSheet :

X++:
...
Array                                                       parameters = new Array(Types::Class);
DocumentFormat.OpenXml.Spreadsheet.Sheet                    newSheet, sheetAfter;
...
newSheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet();
...
if (sheetAfter)
{
    parameters.value(1, newSheet);
    parameters.value(2, sheetAfter);
    OXML_RU::invokeGeneric(sheets, 'InsertAfter', newSheet.GetType(), parameters);
}
else
{
    OXML_RU::appendChild(sheets, newSheet);
}
...
Есть правда один момент - почему то стандартный код у нас валился при выполнении в CIL из за типа элемента массива, пришлось слегка поправить, добавив строку в начале метода

X++:
...
if (xSession::isCLRSession())
{
    parameters = new Array(Types::AnyType);
}
...
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: decoder (1), Logger (5).
Старый 23.10.2020, 10:05   #3  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Еще вопрос.

Как имея имя метки (EDT Bookmark) получить DocumentFormat.OpenXml.Wordprocessing.BookmarkStart ?
Что-то типа:
X++:
public static DocumentFormat.OpenXml.Wordprocessing.BookmarkStart bookmark2BookmarkStart(
    Bookmark    _bookmark)
{
    DocumentFormat.OpenXml.Wordprocessing.BookmarkStart ret;
    DocumentFormat.OpenXml.StringValue                  stringValue;
    ;
    stringValue = OXML_RU::setStringValue(_bookmark);

    ret         = new DocumentFormat.OpenXml.Wordprocessing.BookmarkStart();
    ret.set_Id(stringValue);
    ret.set_Name(stringValue);

    return ret;
}
Старый 23.10.2020, 11:03   #4  
Pandasama is offline
Pandasama
Участник
 
248 / 62 (3) ++++
Регистрация: 11.08.2014
Адрес: Барнаул
Судя по ссылкам вроде https://stackoverflow.com/questions/...g-open-xml-sdk надо в коллекции типа doc.MainDocumentPart.RootElement.Descendants<BookmarkStart> найти элемент с нужным Name

Код:
Public static void ReplaceBookmarkParagraphs(WordprocessingDocument doc, string bookmark, string text)
    {
        //Find all Paragraph with 'BookmarkStart' 
        var t = (from el in doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
                 where (el.Name == bookmark) &&
                 (el.NextSibling<Run>() != null)
                 select el).First();
        //Take ID value
        var val = t.Id.Value;
        //Find the next sibling 'text'
        OpenXmlElement next = t.NextSibling<Run>();
        //Set text value
        next.GetFirstChild<Text>().Text = text;

        //Delete all bookmarkEnd node, until the same ID
        deleteElement(next.GetFirstChild<Text>().Parent, next.GetFirstChild<Text>().NextSibling(), val, true);
    }
За это сообщение автора поблагодарили: decoder (1).
Теги
generic

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
palleagermark: OpenXML teaser Blog bot DAX Blogs 0 21.08.2015 16:11
emeadaxsupport: Documentation collection: Inplace upgrade MS Dynamcis AX 2012 RTM --> AX 2012 R2 CU7 Blog bot DAX Blogs 0 22.06.2014 01:19
AX2009 -> RU5 -> RU6 -> RU7 Pustik DAX: Прочие вопросы 8 21.05.2011 15:25
Dynamics AX Sustained Engineering: Sale Order Batch Invoicing reprints invoices from prior runs, when “Print” is set to ‘After’ on AR >> Periodic >> Sales Update >> Invoice form Blog bot DAX Blogs 0 24.03.2010 02:06
Заказов -> Строки заказов -> Запросы -> Пункт "Производство" Андре DAX: Программирование 1 20.09.2002 10:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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