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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.12.2016, 23:17   #21  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Смысл в формальном выполнении правил выбранного фреймворка. Коли уж наследуется от ранбейза, а он поддерживает этот самый интерфейс сериализации. Другой вопрос, а зачем вам тогда в принципе ранбейз если вы не используете ни возможности пакетной обработки ни клиент-серверное взаимодействие. Работайте напрямую с классом диалога.
Старый 18.12.2016, 15:13   #22  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Какой вариант более правильный? Почему?
Я в таких случаях пытаюсь найти похожий пример на слое SYS. В крайнем случае - на SYP. И желательно из одного из базовых модулей.

Нашёл что-то похожее в классе InventDimRenameItemDimension. Класс тоже создаётся на сервере. В диалоге тоже надо указать текстовые параметры (правда, не один, а несколько), которые не нужно сохранять в SysLastValue. Там проблема решена следующим образом:
  1. В pack()/unpack() возвращается connull()/true
  2. Метод canSwapBetweenCS перекрыт и возвращает false
  3. Диалог строится с помощью FormRun, что, в принципе, эквивалентно forceOnClient = true при создании стандартного диалога (formRun всегда создаётся на клиенте).

То есть, в стандартном приложении используется вариант под номером 1.

P.S.: Спасибо за вопрос
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: dn (1), Владимир Максимов (2), S.Kuskov (2).
Старый 18.12.2016, 16:42   #23  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Смысл в формальном выполнении правил выбранного фреймворка.
Вариант 1 - это тоже "формальное выполнение правил выбранного фреймворка". Буквально. Ведь используются стандартные параметры стандартных методов этого фреймворка. Никакой "отсебятины" и "левых" методов или переменных

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Коли уж наследуется от ранбейза, а он поддерживает этот самый интерфейс сериализации.
Зачем? Если в данном конкретном случае мне сериализация не нужна?

У класса RunBase очень много самых разных функций. Но ведь Вы никогда не используете их все. А только те, которые нужны в Вашей конкретной задаче

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Другой вопрос, а зачем вам тогда в принципе ранбейз если вы не используете ни возможности пакетной обработки ни клиент-серверное взаимодействие. Работайте напрямую с классом диалога.
Т.е. Вы предлагаете мне написать свой собственный RunBase вместо перекрытия пары методов стандартного? Не слишком накладное (во всех смыслах) решение?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 18.12.2016, 16:55   #24  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Интересно... Похоже те, кто за заполнение pack/unpack не задавал себе вопроса "а почему, собственно?".

Почему, собственно я обязан поддерживать возможность сериализации, если она в данном конкретном случае мне не нужна?

Понятно, что ответ на этот вопрос лежит в области поддержки функционала. Т.е. если в будущем возникнет необходимость расширения и модификации данного функционала, то предполагается (!), что если класс поддерживает сериализацию, то и модифицировать его будет проще. Т.е. предполагается, что в будущем в данном функционале могут появится таки переменные, которые надо будет сохранять/восстанавливать в кеше

Ок. Предположим, действительно такая необходимость возникла. И? Неужели функционал с затиранием всего кеша будет проще модифицировать, чем функционал без поддержки сериализации? Как мне представляется, трудозатраты будут примерно одинаковые.

Или я не прав в своих рассуждениях? В чем ошибаюсь?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 18.12.2016 в 17:03.
Старый 18.12.2016, 19:05   #25  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Я думаю ,что тут дело в том, что есть некие патерны, которых следует придерживаться.
Один из них, это разделение интерфейса и реализации. RunBase и наследники должны реализовывать интерфейс SysSaveable. Раз используете классы, которые должны реализовать этот интерфейс, то будьте добры это сделать. Иначе нужен какой-то другой базовый класс.
Старый 19.12.2016, 09:04   #26  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Ну во-первых, RunBase много чего дает. Тот же диалог, прогресс-бар или запуск заданий.
Во-вторых, паттерн может быть уже реализован (см. RunBaseReport).
В-третьих, если нельзя сделать всем понятную заглушку, а нужно "четко следовать" стандартам, то здесь попахивает занудством и бессмыслицей.
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Почему, собственно я обязан поддерживать возможность сериализации, если она в данном конкретном случае мне не нужна?
Полностью поддерживаю Владимира и задаю вопрос, зачем делать то, что абсолютно не нужно. Потому что так надо? Или потому что другие не поймут? Опять же повторюсь:
Цитата:
Сообщение от dech Посмотреть сообщение
Даже если сменится программист, он вполне сможет понять, что автор не имел намерений сохранять что-либо в классе. Наоборот, сохранение параметров, которые затем затираются, лично на меня наводит легкий ступор.)))
__________________
// no comments
Старый 19.12.2016, 10:33   #27  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от dech Посмотреть сообщение
Ну во-первых, RunBase много чего дает. Тот же диалог, прогресс-бар или запуск заданий.
Во-вторых, паттерн может быть уже реализован (см. RunBaseReport).
В-третьих, если нельзя сделать всем понятную заглушку, а нужно "четко следовать" стандартам, то здесь попахивает занудством и бессмыслицей.

Полностью поддерживаю Владимира и задаю вопрос, зачем делать то, что абсолютно не нужно. Потому что так надо? Или потому что другие не поймут? Опять же повторюсь:
Судя по всему, обоснованные ответы, которые вы запросили вас неудовлетворяют. По факту они вам не нужны, все упирается в "зачем делать то, что абсолютно не нужно. Потому что так надо? Или потому что другие не поймут?".

Ответ: Как нужно - не делайте, делайте как вам нравится. Кому будет нужно - разберется и поправит. Не заморачивайтесь.
За это сообщение автора поблагодарили: dn (2).
Старый 19.12.2016, 11:24   #28  
eugene egorov is offline
eugene egorov
Участник
Аватар для eugene egorov
 
273 / 97 (4) ++++
Регистрация: 05.06.2002
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Ответ: Как нужно - не делайте, делайте как вам нравится. Кому будет нужно - разберется и поправит. Не заморачивайтесь.
Отличный совет. Как человек прокопавший не один десяток тыщ строк Х++ рекомендую - делайте так! И я без работы не останусь
__________________
любитель портвейна и снов с прокисшей капустой в усах
За это сообщение автора поблагодарили: Sada (1).
Старый 19.12.2016, 11:53   #29  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Судя по всему, обоснованные ответы, которые вы запросили вас неудовлетворяют.
Возможно, я что-то пропустил. Дайте, пожалуйста, ссылку на обоснование. Т.е. где указаны причины по которым надо делать так, а не иначе. Ну, или просто процитируйте.

Цитата:
Сообщение от DSPIC Посмотреть сообщение
По факту они вам не нужны, все упирается в "зачем делать то, что абсолютно не нужно. Потому что так надо? Или потому что другие не поймут?".
По факту, я и пытаюсь получить обоснованный и аргументированный ответ на правильно понятый Вами вопрос.

Цитата:
Сообщение от DSPIC Посмотреть сообщение
Ответ: Как нужно - не делайте, делайте как вам нравится. Кому будет нужно - разберется и поправит. Не заморачивайтесь.
А КАК нужно-то? Точнее, не столько даже "как", сколько "почему именно ТАК"?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 19.12.2016, 12:22   #30  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Возможно, я что-то пропустил. Дайте, пожалуйста, ссылку на обоснование. Т.е. где указаны причины по которым надо делать так, а не иначе. Ну, или просто процитируйте.

По факту, я и пытаюсь получить обоснованный и аргументированный ответ на правильно понятый Вами вопрос.

А КАК нужно-то? Точнее, не столько даже "как", сколько "почему именно ТАК"?
Как нужно:
- паковать перменные в pack\unpack, использовать их в диалоге
- написать конструктор, с getLast() и перетереть сохраненные значение переменных, если предыдущее значение какой-то переменной

Обоснование
- поддержав сериализацию, вы не нарушаете правил RunBase Framework и следуете BestPractice
- класс сможет выполняться на сервере, в Batch даже если вам этого пока не нужно (может другим понадобится)
- вы полностью сохраняете универсальность класса, задавая нужное вам поведение отдельным конструктором.

Обоснуйте, почему вы "не хотите" сделать так?
Старый 19.12.2016, 12:57   #31  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Обоснование
- поддержав сериализацию, вы не нарушаете правил RunBase Framework и следуете BestPractice
- Отказ от поддержки сериализации НЕ нарушает правила RunBase FrameWork. Это один их штатных, предусмотренный самим FrameWork, способ реализации
- В Best Practices я не встречал упоминания об обязательности перекрытия pack/unpack. Ну, кроме обязательности перекрытия абстрактных методов из-за чего и возникает необходимость в заглушке. Но к Best Practices это не относится

Цитата:
Сообщение от DSPIC Посмотреть сообщение
- класс сможет выполняться на сервере, в Batch даже если вам этого пока не нужно (может другим понадобится)
- Класс и так выполняется на сервере. Это было в постановке задачи. RunOn = Server
- Batch не нужен и не понадобиться. Это также было в постановке задачи

Если Batch все-таки понадобиться, то объем модификаций при использовании заглушек и при затирании кеша будет сопоставим. Надо будет организовать "вырезание" из кеша тех переменных, которые не надо сохранять от тех, которые понадобятся для работы Batch. Там придется добавлять ряд переменных именно для Batch

Цитата:
Сообщение от DSPIC Посмотреть сообщение
- вы полностью сохраняете универсальность класса, задавая нужное вам поведение отдельным конструктором.
- Не понял этого тезиса. О чем идет речь?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 19.12.2016 в 13:07.
Старый 19.12.2016, 13:06   #32  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
[U]
Обоснуйте, почему вы "не хотите" сделать так?
?
Старый 19.12.2016, 13:52   #33  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Обоснуйте, почему вы "не хотите" сделать так?
По той причине, что я вынужден буду делать лишнюю и бессмысленную работу.

- Писать "лишний" код pack/unpack
- Инициализировать переменные, которые сразу после инициализации необходимо затирать (очищать) (getLast())

Т.е. делать "мусорную" работу. С этим можно смирится, если бы в этом был какой-то практический смысл. Но вот этого самого смысла я и не вижу
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 19.12.2016, 14:17   #34  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Регистрация: 02.04.2002
Адрес: Москва
Я делаю так:
1. Если переменные сохранять не нужно (в теме это называется "кэш"? getLast/saveLast в общем), диалог swap-ить не нужно, batch не предусматривается - заглушки на pack/unpack.
2. Если переменные сохранять не нужно, но диалог на клиенте - реализуются полноценные pack/unpack и пустые getLast/saveLast.
3. Если переменные сохранять нужно и они совпадают с данными в диалоге - ну тут понятно.
4. Если переменные сохранять нужно, но не все, а также при swap диалога на клиента зачастую данных в нем нужно больше, чем сохранять, то в pack смотрим признак inGetSaveLast, в зависимости от него возвращаем разные версии/наборы данных. Соответственно, в unpack - обрабатываем.

Реализовывать сохранение всех данных из диалога в БД, а потом затирать, не используя, только потому, что кажется, что фреймворк такой, имхо, абсурд. В надежде, что когда-то кто-то что-то поменяет? А если нет? А сейчас все нужно реализовать, да протестировать.

ЗЫ. Ax3
За это сообщение автора поблагодарили: Владимир Максимов (2), dech (1).
Старый 19.12.2016, 14:24   #35  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Проще говоря, у нас 2 лагеря. :-)
Один лагерь состоит из приверженцев соблюдения всех правил, другой - из тех, кто не любит делать лишнюю работу.

Плюсы в сторону первого лагеря: да, действительно, следующим программистам придется меньше материться, т.к. pack/unpack уже написаны. Остается добавить +1 в #CurrentVersion и новые поля в #CurrentList.
Все полностью соответствует BP и корректно работает.
Минус в том, что заглушка в виде лишней переменной все-таки будет в макросе #CurrentList, допустим называться она будет dummy.

В пользу второго лагеря скажу, что все плюсы, которые видит первый лагерь нивелируются тем, что на клиенте тупо реализуется один класс, который может прожить лет 5 в неизменном состоянии, а потом устареет и не будет использоваться.

Если ты работаешь в Microsoft, то для тебя важно, чтобы все красиво вписывалось в инфраструктуру. Но если ты пашешь на клиенте, ты в принципе можешь прикинуть, стоит ли заморачиваться и делать лишнюю работу, пусть даже в 20 строк.
__________________
// no comments
Старый 19.12.2016, 14:26   #36  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
По той причине, что я вынужден буду делать лишнюю и бессмысленную работу.

- Писать "лишний" код pack/unpack
- Инициализировать переменные, которые сразу после инициализации необходимо затирать (очищать) (getLast())

Т.е. делать "мусорную" работу. С этим можно смирится, если бы в этом был какой-то практический смысл. Но вот этого самого смысла я и не вижу
Я расцениваю ваше обоснование так: "не хочу". Ну так и не делайте. О всех нюансах вы в курсе, ответ/совет вам таки не нужен, как я предполагал.

Вам приходилось сдавать майкрософту ISV решения? Там куда больше спорных моментов из ряда "кому это нужно", правки занимали недели. Так принято, работа не бессмысленная и не мусорная - вам за неё платят, как минимум. Есть стандарт, принято ему следовать и не плодить антипатиерны. Еще раз - сделать можно так как вам хочется, кому нужно будет - переделает, тоже за деньги
Старый 19.12.2016, 14:29   #37  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от dech Посмотреть сообщение
Если ты работаешь в Microsoft, то для тебя важно, чтобы все красиво вписывалось в инфраструктуру.
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Вам приходилось сдавать майкрософту ISV решения?
Что и следовало доказать. :-)
__________________
// no comments
Старый 19.12.2016, 14:49   #38  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от dech Посмотреть сообщение

Если ты работаешь в Microsoft, то для тебя важно, чтобы все красиво вписывалось в инфраструктуру. Но если ты пашешь на клиенте, ты в принципе можешь прикинуть, стоит ли заморачиваться и делать лишнюю работу, пусть даже в 20 строк.
Цитата:
Сообщение от dech Посмотреть сообщение
Что и следовало доказать. :-)
Об этом и речь. Меньше контроля - меньше качества. На клиенте "не хочу, не буду", в MS "Надо". В итоге клиентсий код зачастую вызывает тошнотвоное чувство - уровня лабораторной работы по программированию 1-го курса института.
Старый 19.12.2016, 14:56   #39  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Есть стандарт, принято ему следовать и не плодить антипатиерны.
Вот с этого места поподробнее. О каком стандарте идет речь? Я же неоднократно указывал, что то, что я делал по Варианту 1 - это тоже стандарт. Стандарт, предусмотренный самим FrameWork. Просто этот подход используется нечасто из-за его не типичности (нестандартности самого подхода, а не реализации)

Ради интереса, сделайте поиск по перекрытым методам pack/unpack. Заглушки в этих методах встречаются довольно часто в разных стандартных классах. Но! Все они имеют RunOn = calledFrom, при этом неявно предполагая, что речь будет всегда идти о запуске на стороне клиента. Т.е. нет проблемы сериализации.

Просто в данном конкретном случае "камнем преткновения" является RunOn = Server. Это как раз и есть то самое "бессмысленное и беспощадное" требование клиента, которое я вынужден сделать. Клиента не интересует надо/не надо. У него есть свой "стандарт"

Вариант 1, описанный мной - это следование требованию клиента об установке RunOn = Server, но при этом выполняется отказ от сериализации. Еще раз подчеркиваю, отказ происходит стандартными способами, предусмотренными самим FrameWork

-------------

Ответ на какой вопрос я хотел услышать, но так и не услышал

Чем грозит отказ от сериализации при настройке RunOn = Server? Т.е. класс запускается на сервере, а форма диалога на клиенте без создания дубликатов. Происходит прямое "общение" формы на клиенте и обслуживающего его класса на сервере.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 19.12.2016 в 15:02.
Старый 22.12.2016, 10:23   #40  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Ещё вот такой аргумент пришёл в голову: меньше всего ошибок в коде, который не надо писать. Ну или другими словами, чем меньше вы кода напишете, тем меньше вероятность того, что в нём будет ошибка. Применительно к данному случаю: в пустых pack() и unpack() меньше шансов поймать ошибку, чем если их полностью реализовывать. Я думаю, многие здесь сталкивались с ошибкой, когда типы данных в контейнере в SysLastValue не соответствовали тому, что ожидал получить unpack() (да, я знаю про CurrentVersion). Зачем лишний раз подставляться, если это не нужно для решения задачи?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: ax_mct (5).
Теги
как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axinthefield: Critical issue in SQL Server 2012 Service Pack 1 that could crash your SQL server Blog bot DAX Blogs 0 01.11.2013 01:11
emeadaxsupport: How to disable the Public Sector solution when using Microsoft Dynamics AX 2012 Feature Pack Blog bot DAX Blogs 0 07.08.2012 00:13
emeadaxsupport: Error when upgrading to AX 2012 Feature Pack: The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_ModelElementData_HasModelId_LayerId" Blog bot DAX Blogs 0 20.07.2012 00:11
AX UK: Microsoft Dynamics AX 2009 Management Pack for SCOM 2007 Blog bot DAX Blogs 2 12.08.2009 09:08
chrisfie: Announcing the release of Project Portfolio Server 2007 Service Pack 2 (SP2) Blog bot DAX Blogs 0 24.07.2009 04:20

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

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

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