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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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
 
365 / 542 (19) +++++++
Регистрация: 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), gl00mie (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
Участник
 
449 / 133 (5) +++++
Регистрация: 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).
Старый 02.03.2023, 18:05   #5  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от decoder Посмотреть сообщение
Всем привет!
Вопрос чайника знатокам 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
В итоге как получилось реализовать вставку текста по bookMark?
Старый 03.03.2023, 07:25   #6  
Pandasama is offline
Pandasama
Участник
 
449 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
Старый 03.03.2023, 08:10   #7  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
код отрабатывает, но файл не меняется. То есть изменений нет. Хотя файл сохраняется
Старый 03.03.2023, 08:40   #8  
Pandasama is offline
Pandasama
Участник
 
449 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Сообщение от IvanS Посмотреть сообщение
код отрабатывает, но файл не меняется. То есть изменений нет. Хотя файл сохраняется
Изменений нет или их не видно в офисе?
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними?
Распаковывать файл в xml и сравнивать до/после не пробовали?
Старый 03.03.2023, 08:43   #9  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Изменений нет или их не видно в офисе?
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними?
Распаковывать файл в xml и сравнивать до/после не пробовали?
Дата изменения обновляется, то есть файл сохранается, но не визуально в ворде, ни через архив XML изменений нет
Старый 03.03.2023, 08:15   #10  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
а код получился такой:
X++:
                runElement = new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text("рогаУндКопыта"));

                parameters = new Array(Types::Class);
                parameters.value(1, runElement);
                parameters.value(2, bookmarkStart);

                OXML_RU::invokeGeneric(paragraph, "InsertAfter", runElement.GetType(), parameters);
Теги
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, время: 01:47.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.