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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.07.2022, 11:46   #21  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Не могу детально пояснить. Очень большая загруженность сейчас.
Просто внимательно посмотрите примеры данные по ссылкам.
Там все работает аналогично вызовам методов через SysDictClass / SysDictTable
Старый 16.10.2023, 11:28   #22  
LETTO is offline
LETTO
Участник
 
439 / 67 (3) ++++
Регистрация: 14.07.2022
Цитата:
Сообщение от DesparioN Посмотреть сообщение
Если не сложно, можете раскрыть тему более подробно?

X++:
System.Type                                                     enumValue;
System.Reflection.MethodInfo                          methodInfo;


enumValue = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1");
methodInfo = enumValue.GetMethod("Value");
А что собственно дальше?

В частности мне надо в DocumentFormat.OpenXml.Spreadsheet.Alignment указать значение для горизонтальных и вертикальных границ.
Коллеги, может у кого есть пример создания типа "DocumentFormat.OpenXml.EnumValue`1" в аксапте. Уже голову сломал.
Вот тут хороший пример:
https://wiki.programstore.ru/primer-...rammy-v-excel/
Но там используется метод OXMLExp::getEnumValue(), а кода нет.

В reflection более менее разбираюсь. Но всё равно не выходит

ЗЫ Ну а если есть готовый код по вставке картинки в XMLExcelReport_RU в XML буду оооочень благодарен.

На С# вот такой простой код:
X++:
            DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues> value;

            value = new DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues>(DocumentFormat.OpenXml.Drawing.BlipCompressionValues.Print);
В аксапте возвращает null (тот же код в C# выдает значение)
X++:
    enumObject = CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print');

    enumType = System.Type::GetType("DocumentFormat.OpenXml.Drawing.BlipCompressionValues, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    enumValueType = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

    typeParams = new System.Type[1]();
    typeParams.SetValue(enumType, 0);

    genericType = enumValueType.MakeGenericType(typeParams);

    Object = System.Activator::CreateInstance(genericType, 
              CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print'));

Последний раз редактировалось LETTO; 16.10.2023 в 13:08.
Старый 16.10.2023, 13:10   #23  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Готового примера нет.

Но как я понимаю, вам надо не дженерик тип вызвать, а дженерик конструктор для типа "DocumentFormat.OpenXml.EnumValue`1"
т.е. сам этот тип "DocumentFormat.OpenXml.EnumValue`1" не получится использовать, нужно конкретный производный тип подставить.

Копайте в эту сторону.

У меня была похожая задача.
Делали обмен с кафкой, используя .net компонент Confluent.Kafka.dll
там вся библиотека построена на дженериках.

и для того чтобы заменить одну строку C# кода такого вида
X++:
consumer = new ConsumerBuilder<String, String>(config).Build();
в джобе пришлось написать десяток строк кода.
Сначала создаем в аксапте объект с типом Confluent.Kafka.ConsumerBuilder`2
а затем для него создаем экземпляр System.Reflection.ConstructorInfo
constructorInfo = System.Type.GetConstructor(...)
при помощи которого уже и вызываем конструктор типа
X++:
new ConsumerBuilder<String, String>
Во вложении простой проект с примером джобика (KafkaGenericTest) и ссылками на документацию
Я поигрался недавно с этим, получил рабочий код, но пока отложил, так как коллега написал сборку обертку, которая в аксапту выставляет классы обертки над дженериками, так что без всего этого можно обойтись стало.
Вложения
Тип файла: zip PKoz_NetGenericConstructor_dev.zip (7.7 Кб, 193 просмотров)

Последний раз редактировалось Logger; 16.10.2023 в 13:18.
За это сообщение автора поблагодарили: LETTO (3).
Старый 16.10.2023, 13:17   #24  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Dll-ка кафки нужной версии во вложении
Вложения
Тип файла: zip Confluent.Kafka.zip (89.0 Кб, 164 просмотров)
Старый 16.10.2023, 13:24   #25  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В моем случае тоже приходил null в аксапте
Не получалось создать тип Confluent.Kafka.ConsumerBuilder`2
Похоже аксапта просто не находила нужный тип в сборке теми методами которыми я пытался делать (там в джобе закомменченный код)
В итоге пришлось извращаться. Брать другой обычный (не generic) тип из библиотеки Confluent.Kafka
Для него получать System.Reflection.Assembly и уже при помощи экземпляра этого типа получать Confluent.Kafka.ConsumerBuilder`2

попробуйте также.
Старый 16.10.2023, 13:42   #26  
LETTO is offline
LETTO
Участник
 
439 / 67 (3) ++++
Регистрация: 14.07.2022
Цитата:
Сообщение от Logger Посмотреть сообщение
Копайте в эту сторону.
constructorInfo = System.Type.GetConstructor(...)
Спасибо огромное
Object удалось получить. И вроде даже все как надо.
Старый 15.08.2025, 18:31   #27  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,822 / 402 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от LETTO Посмотреть сообщение
Спасибо огромное
Object удалось получить. И вроде даже все как надо.
Добрый день. Не сохранилось ли примера со вставкой картинки в XmlExcelReport_RU? не поделитесь проектом?
Старый 04.09.2025, 23:09   #28  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от ice Посмотреть сообщение
Добрый день. Не сохранилось ли примера со вставкой картинки в XmlExcelReport_RU? не поделитесь проектом?
Привет.

Я сам такое не делал. Хотя тут все аналогично как в моем примере с кафкой.
Что-то вопрос популярен. Спрашивают его повторно в личке другие люди.

Мой коллега делал. С его разрешения публикую его вариант

X++:
protected void insertImage_inCell(
      Filename _fileName
    , int     _posX
    , int     _posY
    , int64     _posXOffcet
    , int64     _posYOffcet
    , int64     _width
    , int64     _height
)
{
    #define.EMU_per_pixel(9525)//EMU per pixel(approximately)

    DocumentFormat.OpenXml.Packaging.ImagePart                                      imagePart;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.ShapeProperties                      shapeProperties;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureProperties           nonVisualPictureProperties;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties           nonVisualDrawingProperties;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.BlipFill                             blipFill;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture                              picture;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor                        twoCellAnchor;
    DocumentFormat.OpenXml.Drawing.Stretch                                          stretch;
    DocumentFormat.OpenXml.Drawing.Blip                                             blip;
    DocumentFormat.OpenXml.Drawing.Transform2D                                      transform2D;
    DocumentFormat.OpenXml.Drawing.Extents                                          extents;
    DocumentFormat.OpenXml.Drawing.PresetGeometry                                   presetGeometry;
    System.IO.FileStream                                                            fileStream;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker                           fromMarker;
    DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker                             toMarker;

    void clearNet()
    {
        imagePart                   = null;
        shapeProperties             = null;
        nonVisualPictureProperties  = null;
        nonVisualDrawingProperties  = null;
        blipFill                    = null;
        picture                     = null;
        twoCellAnchor               = null;
        stretch                     = null;
        blip                        = null;
        transform2D                 = null;
        extents                     = null;             
        presetGeometry              = null;
        fromMarker                  = null;
        toMarker                    = null;
    }
    
    picId += picId ? 1000 : 1; //Id начинаем с 1000, на случай, если в книге уже есть картинки

    imagePart = drawingsPart.AddImagePart(DocumentFormat.OpenXml.Packaging.ImagePartType::Png);

    fileStream      = new System.IO.FileStream(_fileName, System.IO.FileMode::Open);
    imagePart.FeedData(fileStream);
    fileStream.Close();
    fileStream.Dispose();
    fileStream = null;
    
    blip = new DocumentFormat.OpenXml.Drawing.Blip();
    blip.set_Embed(new DocumentFormat.OpenXml.StringValue(drawingsPart.GetIdOfPart(imagePart)));
    
    blipFill = new DocumentFormat.OpenXml.Drawing.Spreadsheet.BlipFill();
    blipFill.set_Blip(blip);
    blipFill.set_SourceRectangle(new DocumentFormat.OpenXml.Drawing.SourceRectangle());
     
    stretch = new DocumentFormat.OpenXml.Drawing.Stretch();
    stretch.set_FillRectangle(new DocumentFormat.OpenXml.Drawing.FillRectangle());   
    
    OXML_RU::appendChild(blipFill, stretch);

    extents = new DocumentFormat.OpenXml.Drawing.Extents();
    extents.set_Cx(new DocumentFormat.OpenXml.Int64Value(_width));
    extents.set_Cy(new DocumentFormat.OpenXml.Int64Value(_height));

    transform2D = new DocumentFormat.OpenXml.Drawing.Transform2D();
    transform2D.set_Extents(extents);

    shapeProperties = new DocumentFormat.OpenXml.Drawing.Spreadsheet.ShapeProperties();
    shapeProperties.set_BlackWhiteMode(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.BlackWhiteModeValues::Auto));
    shapeProperties.set_Transform2D(transform2D);

Последний раз редактировалось Logger; 04.09.2025 в 23:10. Причина: не влезло сообщение - пришлось разбить на несколько
Старый 04.09.2025, 23:11   #29  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
X++:
    presetGeometry = new DocumentFormat.OpenXml.Drawing.PresetGeometry();
    presetGeometry.set_AdjustValueList(new DocumentFormat.OpenXml.Drawing.AdjustValueList());
    presetGeometry.set_Preset(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.ShapeTypeValues::Rectangle));

    OXML_RU::appendChild(shapeProperties, presetGeometry);
    OXML_RU::appendChild(shapeProperties, new DocumentFormat.OpenXml.Drawing.NoFill());
    
    fromMarker = new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker();
    fromMarker.set_ColumnId     (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnId    (int642str(_posX - 1))); //считается от нуля
    fromMarker.set_ColumnOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnOffset(int642str(_posXOffcet * #EMU_per_pixel))); // convert to pixels
    fromMarker.set_RowId        (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowId       (int642str(_posY - 1))); //считается от нуля
    fromMarker.set_RowOffset    (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowOffset   (int642str(_posYOffcet * #EMU_per_pixel))); // convert to pixels

    toMarker = new DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker();
    toMarker.set_ColumnId     (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnId    (int642str(_posX - 1))); //считается от нуля
    toMarker.set_ColumnOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnOffset(int642str((_posXOffcet + _width) * #EMU_per_pixel))); // convert to pixels
    toMarker.set_RowId        (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowId       (int642str(_posY - 1))); //считается от нуля
    toMarker.set_RowOffset    (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowOffset   (int642str((_posYOffcet + _height) * #EMU_per_pixel))); // convert to pixels

    twoCellAnchor = new DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor();
    twoCellAnchor.set_FromMarker(fromMarker);
    twoCellAnchor.set_ToMarker  (toMarker);
    twoCellAnchor.set_EditAs(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.Spreadsheet.EditAsValues::OneCell));    
    
    nonVisualDrawingProperties          = new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties();
    nonVisualDrawingProperties.set_Id(OXML_RU::setUInt32Value(picId));
    nonVisualDrawingProperties.set_Name(new DocumentFormat.OpenXml.StringValue(_fileName));

    nonVisualPictureProperties          = new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureProperties();
    nonVisualPictureProperties.set_NonVisualDrawingProperties(nonVisualDrawingProperties);
    nonVisualPictureProperties.set_NonVisualPictureDrawingProperties(new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureDrawingProperties());
    
    picture = new DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture();
    picture.set_NonVisualPictureProperties(nonVisualPictureProperties);
    picture.set_BlipFill(blipFill);
    picture.set_ShapeProperties(shapeProperties);

    OXML_RU::appendChild(twoCellAnchor, picture);
    OXML_RU::appendChild(twoCellAnchor, new DocumentFormat.OpenXml.Drawing.Spreadsheet.ClientData());

    OXML_RU::appendChild(worksheetDrawing, twoCellAnchor);
    
    clearNet();
}
Цитата:
- метод вставки картинки
основная замена: DocumentFormat.OpenXml.Drawing.Spreadsheet.AbsoluteAnchor на DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor
+ добавлена очистка объектов (все это игнорируют, в исходнике даже FileStream не диспозился)
Старый 04.09.2025, 23:11   #30  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,990 / 3283 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
X++:
public static System.Object getEnumValue(System.Enum  _o)
{
    System.Object                               ret;
    System.Reflection.Assembly                  assembly;
    System.Reflection.ConstructorInfo           constructorInfo;
    System.Type                                 enumType,
                                                enumGenericType,
                                                genericType;
    System.Type[]                               enumTypes;
    System.Object[]                             enumValues;
    str                                         enumTypeStr,
                                                enumValueStr,
                                                assemblyStr;

    if (! CLRInterop::isNull(_o))
    {
        try
        {
            enumValueStr    = _o.ToString();
            enumType        = _o.GetType();
            enumTypeStr     = enumType.ToString();

            assembly        = enumType.get_Assembly(); //определяем .net сборку (по ENUM)
            assemblyStr     = assembly.ToString();
            enumGenericType = assembly.GetType (#OpenXmlGenericEnumValue); //тип DocumentFormat.OpenXml.EnumValue`1
            assembly        = null;

            if (CLRInterop::isNull(enumGenericType))
            {
                enumType = null;
                throw error (strFmt(".net сборка '%1'(ENUM '%2') не содержит дженерик-тип %3", assemblyStr, enumTypeStr, #OpenXmlGenericEnumValue));
            }

            //инициируем массив типов (с единственным элементом = enumType)
            enumTypes = new System.Type[1]();
            enumTypes.SetValue(enumType, 0);
            enumType = null;

            genericType     = enumGenericType.MakeGenericType   (enumTypes); //создаем generic DocumentFormat.OpenXml.EnumValue`1, приведенный к типу enumTypes
            enumGenericType = null;

            if (CLRInterop::isNull(genericType) || ! genericType.get_IsGenericType())
            {
                throw error (strFmt("ENUM '%1' не является дженериком", enumTypeStr));
            }

            constructorInfo = genericType.GetConstructor        (enumTypes); //конструктор (для ENUM generic типа)
            genericType     = null;
            enumTypes       = null;

            //инициируем массив занчений значение ENUM (с единственным элементом= enumValueStr)
            enumValues = new System.Object[1]();
            enumValues.SetValue (CLRInterop::parseClrEnum(enumTypeStr, enumValueStr), 0);

            ret = constructorInfo.Invoke(enumValues); //создаем объект ENUM generic типа (с значением = enumValueStr)

            constructorInfo = null;
            enumValues      = null;
        }
        catch
        {
            error (WMSCOMPrint::getClrErrorMessage());
        }
    }

    return ret;
}
Цитата:
- метод создания дженерика еще немного подрихтовал(+ добавил комментарии)
За это сообщение автора поблагодарили: S.Kuskov (10).
Теги
.net, ado, generic, net

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: When browsing AX 2009 Role Centers, you get an error: An unexpected error has occurred on systems with .NET Framework v4.0 installed Blog bot DAX Blogs 1 28.07.2010 08:24
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
jinx: Microsoft Dynamics AX und .NET - Erstellen eines Termins in Outlook Blog bot DAX auf Deutsch 0 03.11.2007 00:33
Inside Dynamics AX 4.0: Working with the .NET Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15
Как при импорте задать значение определенного поля? mvf DAX: Программирование 3 04.05.2005 16:26

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:27.