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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.10.2013, 11:52   #1  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Где выполняется код? на клиенте или на сервере?
__________________
// no comments
Старый 17.10.2013, 13:50   #2  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от dech Посмотреть сообщение
Где выполняется код? на клиенте или на сервере?
Данный код выполняется на клиенте.
Старый 17.10.2013, 14:28   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Данный код выполняется на клиенте.
Возможно в этом и проблема. Не у каждого пользователя настроены права. А на сервере должно быть все в ажуре. Попробуйте создать серверный класс и в него запихнуть такую же логику для теста. Если будут возникать аналогичные проблемы, попробуйте то, что посоветовал вам plumbum
__________________
// no comments
За это сообщение автора поблагодарили: Cardagant (1).
Старый 17.10.2013, 12:22   #4  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
В AX2009 есть ссылка на сборку System.Xml, попробуйте переписать Ваш код на .NET:

System.Xml.XmlSchemaSet заменит xs, System.Xml.XmlDocument соответственно xd. Используйте XmlDocument.Validate() вместо parseError. После этого вы можете отловить все исключения в блоке try catch с помощью типа исключения CLRError. .NET как по мне работает стабильнее и нагляднее (не нужно в имени объекта указывать версию MS XML), чем вызов COM объектов напрямую.

У пользователя возникает ошибка? А можно этот код выполнять на сервере?
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!

Последний раз редактировалось plumbum; 17.10.2013 в 12:48.
Старый 17.10.2013, 13:54   #5  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от plumbum Посмотреть сообщение
В AX2009 есть ссылка на сборку System.Xml, попробуйте переписать Ваш код на .NET:

System.Xml.XmlSchemaSet заменит xs, System.Xml.XmlDocument соответственно xd. Используйте XmlDocument.Validate() вместо parseError. После этого вы можете отловить все исключения в блоке try catch с помощью типа исключения CLRError. .NET как по мне работает стабильнее и нагляднее (не нужно в имени объекта указывать версию MS XML), чем вызов COM объектов напрямую.

У пользователя возникает ошибка? А можно этот код выполнять на сервере?
Насчёт того, что понятнее, возможно. Но ведь используются одни и те же объекты как COM, так и .Net. Просто в COM я могу указать какой именно использовать по имени, к примеру. Или я неправ?

Можно попробовать переписать валидацию на сервере. Для информации, чем это может помочь?
Ошибка вываливается периодически и сложно её отловить...
Старый 17.10.2013, 14:04   #6  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Насчёт того, что понятнее, возможно. Но ведь используются одни и те же объекты как COM, так и .Net. Просто в COM я могу указать какой именно использовать по имени, к примеру. Или я неправ?
Правы, а вам надо выбирать отличную от последней версию?

Цитата:
Сообщение от Cardagant Посмотреть сообщение
Можно попробовать переписать валидацию на сервере. Для информации, чем это может помочь?
Ошибка вываливается периодически и сложно её отловить...
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
За это сообщение автора поблагодарили: Cardagant (1).
Старый 17.10.2013, 14:35   #7  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от plumbum Посмотреть сообщение
Правы, а вам надо выбирать отличную от последней версию?
Нет. Я не так давно работаю с XML, решил воспользоваться приведённым в теме примером.

Цитата:
Сообщение от plumbum Посмотреть сообщение
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
Да, проблема устраняется при перезагрузке Аксапты и в последствии возникает снова через некоторое время (от часа до нескольких дней). Один и тот же файл в одной и той же сессии не проверял.

Хочу спросить о .Net.

Метод XmlDocument.Validate() возращает Void и требует в параметры некий ValidationEventHandler. Что это? Не могу его найти. И как мне правильн осчитать ошибку при её возникновении? Буду признателен за ответ!

UPD: И я так понимаю, нужен .Net не менее версии 3.5.

Последний раз редактировалось Cardagant; 17.10.2013 в 14:52.
Старый 17.10.2013, 16:09   #8  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Прочитав MSDN я понял, что вам и валидацию вызывать не надо:
http://msdn.microsoft.com/en-us/libr...t.loadxml.aspx
http://msdn.microsoft.com/en-us/library/875kz807.aspx

Цитата:
XmlException. There is a load or parse error in the XML. In this case, the document remains empty.
просто проверьте потом тип исключения на XmlException (вхождение в строку текста исключения например)

Приведу общий код обработки исключений для .NET в AX:

X++:
    try
    {
        lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop);
        lclsInteropPerm.assert();

        ....

        CodeAccessPermission::revertAssert();
    }
    catch (Exception::CLRError)
    {
        this.processCLRException();

	CodeAccessPermission::revertAssert();
    }
X++:
protected void processCLRException()
{
    System.Exception            lclsNetException;
    str                         lstrExceptionMessage, lstrErrorMessage;
    InteropPermission           lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop);

    lclsInteropPerm.assert();
    lclsNetException        = CLRInterop::getLastException();

    while (! CLRInterop::isNull(lclsNetException))
    {
        lstrExceptionMessage = lclsNetException.get_Message();
        lstrErrorMessage     += lstrErrorMessage
                                ? "\n" + lstrExceptionMessage
                                : lstrExceptionMessage;
        lclsNetException   = lclsNetException.get_InnerException();
    }

    CodeAccessPermission::revertAssert();
}
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 17.10.2013, 17:59   #9  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Спасибо за полезные примеры!

Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо!
Старый 17.10.2013, 20:41   #10  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо!
Ну так пишет MS. Возможно этого и недостаточно. А Вы проверили и не получили исключения? Вот примерный вариант вашего кода на .NET с использованием метода Validate:

X++:
    System.Xml.XmlDocument                  xd;        
    System.Xml.Schema.XmlSchemaSet          xs; 
    CLRObject                               validationEventHandler; //not initialized, always null
    InteropPermission                       interopPerm;
    
    
    #define.xml('filename')    
    ;
    try
    {
        xd                      = new System.Xml.XmlDocument();        
        xs                      = new System.Xml.Schema.XmlSchemaSet();        
        
        xs.Add('xmln', 'schemaPath1.xsd');
        xs.Add('xmln', 'schemaPath2.xsd');
    
        xd.set_Schemas(xs);   
        
        xd.Load(#xml);
    
        xd.Validate(validationEventHandler);                
    }
    catch (Exception::CLRError)
    {
        this.processCLRException();
    }
вот что написано про метод Validate вот тут:
Цитата:
XmlSchemaValidationException: A schema validation event occurred and no ValidationEventHandler object was specified.
По ссылке вы также найдете пример, где в метод передается делегат для обработки исключений. Это делается с целью прохода всего документа, однако, если вы не укажете делегат, то исключение будет сгенерированно на первой же ошибке.

Я к сожалению не могу сейчас проверить это. Напишите, если Вам удасться.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 18.10.2013, 10:04   #11  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Спасибо за пример!

Ругается на метод Validate() с ошибкой:
"Класс System.Xml.XmlDocument не содержит эту функцию."
Хоть в выпадающем списке методов он есть. Как такое может быть?
Старый 18.10.2013, 11:16   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Спасибо за пример!

Ругается на метод Validate() с ошибкой:
"Класс System.Xml.XmlDocument не содержит эту функцию."
Хоть в выпадающем списке методов он есть. Как такое может быть?
Вот код, который работает в четверке. Проверяет валидность xml файла схеме (xsd файла):
X++:
    XMLTextReader                   xmlReader; // системный класс ядра
    XMLSchema                         xmlSchema; // системный класс ядра
    XmlSchemaValidationError    validationError; // системный класс ядра
    boolean                               ret = true;
    ;
    if (!WinApi::fileExists(shemaName))
    {
        ret = checkfailed(strfmt("Не найден файл \"%1\"", shemaName));
        return ret;
    }

    new FileIOPermission(shemaName, 'r').assert();
    xmlSchema = XMLSchema::newFile(shemaName);
    xmlSchema.compile();
    CodeAccessPermission::revertAssert();

    if (! xmlSchema.isCompiled())
    {
        ret = checkfailed(xmlSchema.validationError().message());
        return ret;
    }

    new FileIOPermission(fileName, 'r').assert();
    xmlReader = XMLTextReader::newFile(fileName);
    xmlReader.read();
    CodeAccessPermission::revertAssert();

    validationError = xmlReader.validate(xmlSchema.writeToString());

    if (validationError)
    {
        ret = checkfailed(validationError.message());
    }

    return ret;
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: plumbum (1), Cardagant (1), A_BAS (1).
Старый 18.10.2013, 12:17   #13  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
2lev

Спасибо! Знаю такой способ.
Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют.

Если взглянете на код в сообщениях выше, то сможете увидеть
X++:
xs.Add('xmln', 'schemaPath1.xsd');
xs.Add('xmln', 'schemaPath2.xsd');
А у меня таких схем больше двух

Последний раз редактировалось Cardagant; 18.10.2013 в 12:19.
Старый 18.10.2013, 13:28   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Cardagant Посмотреть сообщение
2lev

Спасибо! Знаю такой способ.
Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют.

Если взглянете на код в сообщениях выше, то сможете увидеть
X++:
xs.Add('xmln', 'schemaPath1.xsd');
xs.Add('xmln', 'schemaPath2.xsd');
А у меня таких схем больше двух
Я правильно понял, что один xml файл должен провериться на соответствие нескольким схемам?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2013, 11:44   #15  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Хоть в выпадающем списке методов он есть. Как такое может быть?
Мне кажется, это связано с установленными версиями MS Core XML Services.

Наверное самый надежный способ привел lev. Через AX классы, как и через .NET будут дергаться все те же COM компоненты MS Core XML Services.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 20.11.2013, 16:33   #16  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Скажите пожалуйста куда смотреть что за ошибка на
Вызывается в коде:

validationError = xmlReader.validate(xmlSchema.writeToString());
if (validationError)
{
ret = checkfailed(validationError.message());
}

Элемент "E6411" недействителен: значение "PCE" недействительно с точки зрения его типа данных "String" — Сбой ограничения Pattern.

Вот данные из схемы
<xs:elementname="E6411">
<
xs:annotation>
<
xs:documentation>Measurement unit code
KGM = kilogram
</xs:documentation>
</
xs:annotation>
<
xs:simpleType>
<
xs:restrictionbase="xs:string">
<
xs:minLengthvalue="1"/>
<
xs:maxLengthvalue="3"/>
<
xs:enumerationvalue="KGM"/>
<
xs:enumerationvalue="PCE"/>
</
xs:restriction>
</
xs:simpleType>
</
xs:element>

и чуть позже

<xs:elementname="E6411"minOccurs="0">
<
xs:annotation>
<
xs:documentation>Measurement unit code
KGM = kilogram
PF = pallet (lift)
PCE = Piece ()
</xs:documentation>
</
xs:annotation>
<
xs:simpleType>
<
xs:restrictionbase="xs:string">
<
xs:minLengthvalue="1"/>
<
xs:maxLengthvalue="3"/>
<
xsatternvalue=""/>
<
xs:enumerationvalue="KGM"/>
<
xs:enumerationvalue="PF"/>
<
xs:enumerationvalue="PCE"/>
</
xs:restriction>
</
xs:simpleType>
</
xs:element>

DAX 2009 не знаю что и где смотреть
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!
Старый 20.11.2013, 17:25   #17  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
По-моему, в схеме нужно задавать ограничения для возможных значений элемента или атрибута либо через pattern, либо через enumeration, но не смешивать эти два способа. Во втором же фрагменте получается, что задан и pattern, и значения enumeration, причем pattern пустой, так что значения enumeration под него не подходят, - получается, что схема некорректна.
Теги
ax2009, ax3.0, ax4.0, xml, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta & XML dj_Mage DAX: Программирование 4 11.08.2006 12:42
Проблема с выгрузкой/загрузкой файлов в базу из Axapta в др базу Jony DAX: Программирование 1 29.09.2004 15:20
Axapta 3, отправка файлов по eMail (КАК ИСПРАВИТЬ) raz DAX: Программирование 1 01.10.2003 15:07
XML в Axapta axot DAX: Программирование 4 01.11.2002 11:37
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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