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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.11.2012, 08:13   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
С помощью формы такое можно сделать. Data Source формы позволяет добавить еще одно поле, не привязанное к таблице, которая является источником для Data Source и потом в методе дата-сорса вычислить значения и подставить их в нужное поле. Причем, ссылаться при вычислениях нужно на имя дата-сорса как на имя таблицы. При этом строки временной таблицы станут видны в форме.
Немного сумбурно написано. В аксапте есть возможность отображать на форме или в отчёте результат вычисления метода, написанного непосредственно на X++. Если по вычисленному значению вам не нужно проводить фильтрацию сортировку или агрегацию, а нужно всего лишь отображать значение, то можно использовать механизм display-методов. Их можно реализовывать не только на формах но и на таблицах.

Если просто отображать вычисленное значение не достаточно, то стандартный подход - использовать временные таблицы для промежуточных вычислений. Есть ещё не стандартный способ создания нужного View, заключающийся в том чтобы подменять аксаптовский View на нужный на уровне БД. Правда, как и у всех нестандартных способов, и у этого есть свои проблемы Запрет синхронизации объекта АОТ
Старый 07.11.2012, 09:11   #2  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Если не устраивают дисплейные методы, которые можно использовать как вычисляемые поля, можешь завести отдельное поле и сделать такую операцию:
X++:
ThisIsMyTable mytable;
;

mytable.skipDataMethods(true);
update_recordset mytable
    setting
        field3 = mytable.field1 + mytable.field2;
    where mytable.field4 == "F4";
__________________
// no comments
Старый 07.11.2012, 13:27   #3  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от dech Посмотреть сообщение
Если не устраивают дисплейные методы, которые можно использовать как вычисляемые поля, можешь завести отдельное поле и сделать такую операцию:
X++:
ThisIsMyTable mytable;
;
 
mytable.skipDataMethods(true);
update_recordset mytable
    setting
        field3 = mytable.field1 + mytable.field2;
    where mytable.field4 == "F4";
Ну да, ну да... Это, собственно, и предполагалось делать во временной таблице, но вся проблема в связывании временной таблицы с дата-сорсом, как я написал выше.
А для постоянной таблицы такого рода тактика не айс, потому как держать в одной постоянной таблице и записи для свертки и результаты свертки как-то странно.
Старый 07.11.2012, 13:13   #4  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Немного сумбурно написано. В аксапте есть возможность отображать на форме или в отчёте результат вычисления метода, написанного непосредственно на X++. Если по вычисленному значению вам не нужно проводить фильтрацию сортировку или агрегацию, а нужно всего лишь отображать значение, то можно использовать механизм display-методов. Их можно реализовывать не только на формах но и на таблицах.

Если просто отображать вычисленное значение не достаточно, то стандартный подход - использовать временные таблицы для промежуточных вычислений. Есть ещё не стандартный способ создания нужного View, заключающийся в том чтобы подменять аксаптовский View на нужный на уровне БД. Правда, как и у всех нестандартных способов, и у этого есть свои проблемы Запрет синхронизации объекта АОТ
Написано, действительно, сумбурно, потому что про всякого рода дата-базные дела, вообще, очень сложно писать человеческим языком. Это связано со множественностью всякого рода отображений и неоднозначностью небольшого количества слов для описания явления. В общем, давно известный эффект, - лучшей моделью описываемого объекта является сам объект.

Отображение вычисляемых значений в полях форм и отчетов возможно и удобно с помощью методов, но нужно не это. Нужно готовый View, для того, чтобы передавать его как дата-сорс в Data Set для портала.
Не, ну это, вообще, чисто идейно кривой ход, вычисления делать уже в форме. Вся смысловая бизнес логика должна реализовывать в единой структуре данных.
И потом, это же Аксапта, а не 1С. В общем, недоработка. Причем, крупная.

А вот как использовать дисплей-методы для вычисления полей в таблице я не понял. В хелпе про это ничего нет. Только про формы и отчеты.
Если можно, приведите пример.

Здесь ведь в чем тонкость.
Просто создать в коде переменную для временной таблицы и вычислить для этой таблицы все поля, не сложно. Невозможно эту таблицу как объект в виде переменной привязать ко View. Ну, то есть, можно просто View не предлагает временную таблицу для подстановки в качестве дата-сорса.

То же самое и с запросом.
Вы можете выбрать временную таблицу в качестве дата-сорса, но когда этот запрос затолкаете во View, то он не будет отражаться в дата-сорсах для этого View.

Переходить ко вьшкам в базе, это уже выглядит извращением для такой простой задачи. Но, если ничего не получится, можно попробовать.
Хотя, наверное, проще переформатировать таблицы и перейти от горизонтальной агрегации в вертикальной, доступной.
Старый 07.11.2012, 14:10   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
А вот как использовать дисплей-методы для вычисления полей в таблице я не понял. В хелпе про это ничего нет. Только про формы и отчеты.
Если можно, приведите пример.
Это тоже самое. Разница только в области видимости. Если реализовать метод на уровне таблицы, то он будет доступен на всех формах и отчётах.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Здесь ведь в чем тонкость.
Просто создать в коде переменную для временной таблицы и вычислить для этой таблицы все поля, не сложно. Невозможно эту таблицу как объект в виде переменной привязать ко View. Ну, то есть, можно просто View не предлагает временную таблицу для подстановки в качестве дата-сорса.

То же самое и с запросом.
Вы можете выбрать временную таблицу в качестве дата-сорса, но когда этот запрос затолкаете во View, то он не будет отражаться в дата-сорсах для этого View.
Посмотрите метод SetRecord
TmpTable в QueryRun
За это сообщение автора поблагодарили: Narayana (1).
Теги
query, архитектура, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление поля с определённым типом во всех таблицах. Corel DAX: Программирование 1 20.12.2008 13:37
Достаточно ли изменить дату в таблицах inventTrans, inventTransPosting, VendPackingSlipJour? DmitryS DAX: Программирование 3 18.09.2008 14:37
Проверки заполненных значений в связанных таблицах. miklenew DAX: База знаний и проекты 11 25.12.2007 14:40
Как не использовать relations на таблицах demetra DAX: Программирование 13 14.07.2006 11:00
Осторожнее с CTRL+S на таблицах mit DAX: Администрирование 7 25.07.2005 19:09

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

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

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