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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2019, 14:59   #1  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Добавил источник данных таблица
AssetLedgerAccounts(Asset Ledger Accounts):Таблица AssetLedgerAccounts
у нее есть метод
assetLedgerDimension():Int64 (String _assetId, String _assetBookId, AssetTransType _assetTransType, String _assetPostingProfile, AssetDocumentType_JP _assetDocumentType_JP, Int64 _assetDocumentEntryRecId)

Каждый параметр определил отдельной внутренней переменной
$CurAssetId(Current Asset Id):Вычисляемое поле = @.AssetId: Строка
$CurBookId(Current BookId):Вычисляемое поле = @.BookId: Строка
$CurPostingProfileId(Current PostingProfileId):Вычисляемое поле = model.'$BooksRecords'.General.PostingProfile.Id: Строка
$CurTransTypeAcquisition(TransType Acquisition):Вычисляемое поле = model.AssetTransTypeJournal.Acquisition: Перечислимый тип

и хочу получить значение, вычисляемое методом
$LDIm03(Ledger dimension ref 03):Вычисляемое поле = model.AssetLedgerAccounts.'assetLedgerDimension()'("$CurAssetId", "$CurBookId", "$CurTransTypeAcquisition", "$CurPostingProfileId"): Int64

Синтаксическая проверка проходит, формула сохраняется. Но при выполнении выдается ошибка
Ошибка при вычислении выражения для пути "$LDIm03".

Пробовал параметры задать просто константами
$LDIm03(Ledger dimension ref 03):Вычисляемое поле = model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", "1", "Головний"): Int64
результат такой же.

Можете что-то подсказать?
Старый 09.12.2019, 15:25   #2  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Такое предположение, что проблема в 3-м параметре. Он описан как AssetTransType (это enum) и непонятно если константой передавать 1 (int), "1", "Acquisition" или с учетом установленного языка "Ввод в эксплуатацию"?
Просто 1 (без кавычек) - не проходит валидация при сохранении формулы; все остальные варианты - ошибка при выполнении.
Старый 09.12.2019, 15:28   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
AssetTransType надо определить как Dynamics/Enum, а потом его можно везде использовать. См. мой синтаксис выше.
Старый 09.12.2019, 15:48   #4  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Цитата:
Сообщение от EVGL Посмотреть сообщение
AssetTransType надо определить как Dynamics/Enum, а потом его можно везде использовать. См. мой синтаксис выше.
Определил enum
AssetTransType:Перечисление Dynamics 365 for Operations AssetTransType

Определил параметр
$CurTransTypeAcquisition(TransType Acquisition):Вычисляемое поле = model.AssetTransType.Acquisition: Перечислимый тип

Описал вызов
$LDIm03(Ledger dimension ref 03):Вычисляемое поле = model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", "@.'$CurTransTypeAcquisition'", "Головний"): Int64
результат тот же.
Старый 09.12.2019, 15:51   #5  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Попробуйте еще добавить нули для ..., assetDocumentType_JP _assetDocumentType_JP, Int64 _assetDocumentEntryRecId)
Старый 09.12.2019, 16:21   #6  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Если в формуле задаю
model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", 1, "Головний")
то при сохранении выдается ошибка
Ошибка проверки: Неверный тип значения. Ожидаемый: AssetTransType, фактический: Integer.

AssetTransType:Перечисление Dynamics 365 for Operations AssetTransType
$CurTransTypeAcquisition(TransType Acquisition):Вычисляемое поле = model.AssetTransType.Acquisition: Перечислимый тип

При любых других вариантах задания параметра
model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", "model.AssetTransType.Acquisition", "Головний")

или

model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", "$CurTransTypeAcquisition", "Головний")

ошибка при выполнении.

По этому поводу по ссылке
https://fix.lcs.dynamics.com/Home/In...ssion=Download
сказано:
• Only elements with parameters that accept arguments specified as one of the supported primitive data type (integer, real, string, etc.) can be used as data source elements
• Such arguments must be defined at design-time in ER expression as constants of the required data type


Возможно enum это уже не primitive data type (хотя фактически это int) и никакими ухищрениями не удастся передать значение enum-а в качестве параметра.

Думаю, что только belugin может квалифицировано что-то посоветовать.
Старый 09.12.2019, 19:39   #7  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Почему бы не попробовать мой способ с FILTER, который гарантированно работает у другого клиента?
Старый 09.12.2019, 19:54   #8  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Цитата:
Сообщение от EVGL Посмотреть сообщение
Почему бы не попробовать мой способ с FILTER, который гарантированно работает у другого клиента?
FILTER тут не годится по функциональной логике. Метод assetLedgerDimension() это не простой SELECT ... WHERE ...
там достаточно сложная логика выбора записи. Эта таблица - настройка профиля разноски, который может задаваться для для конкретного ОС, для группы ОС или для "Всех". Поэтому в методе выполняется поиск записи по трем условиям: книга + профиль разноски + тип операции - сначала для конкретного AssetID; если не найдена - то для тех же условий - но для AssetGroupId; если и такой не найдено - то только по тем же трем условиям, но без учета ОС (т.е. для всех).
Вряд ли получится описать всю эту логику просто в одном FILTER. Надо писать 3 выражения FILTER, а потом анализ (с учетом приоритетности) какой первым вернул непустое значение.
Старый 09.12.2019, 16:28   #9  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Не поможет. В АХ объявление метода выглядит:
public server static LedgerDimensionDefaultAccount assetLedgerDimension(
AssetId _assetId,
AssetBookId _assetBookId,
AssetTransType _assetTransType,
AssetPostingProfile _assetPostingProfile = ""
// <GJP>
,AssetDocumentType_JP _assetDocumentType_JP = AssetDocumentType_JP::None
,AssetDocumentRecId_JP _assetDocumentEntryRecId = 0
// </GJP>
)

Т.е. обязательными являются первые три параметра. Если при написании формулы в ER я задаю меньше трех параметров - при сохранении не проходит валидация и выдается сообщение что не задан обязательный параметр.

Практически уверен, что проблема именно в 3-м параметре, который обязательный и при этом типа enum.
Старый 09.12.2019, 18:05   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Libovs Посмотреть сообщение
Практически уверен, что проблема именно в 3-м параметре, который обязательный и при этом типа enum.
Я не помню, работает ли enum в качестве аргумента вызова. Корректнго попробовать так

1. Добавить operations enum datasource в корень под именем myEnum
2. Употребить его так: myEnum.MyEnumValue1
Старый 09.12.2019, 19:41   #11  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Получилось таким образом:
добавил enum
AssetTransType:Перечисление Dynamics 365 for Operations AssetTransType

добавил таблицу с методом
AssetLedgerAccounts(Asset Ledger Accounts):Таблица AssetLedgerAccounts
assetLedgerDimension():Int64 (String _assetId, String _assetBookId, AssetTransType _assetTransType, String _assetPostingProfile, AssetDocumentType_JP _assetDocumentType_JP, Int64 _assetDocumentEntryRecId)

добавил переменную с формулой
$LDIm03(Ledger dimension ref 03):Вычисляемое поле = model.AssetLedgerAccounts.'assetLedgerDimension()'("000006", "БО", model.AssetTransType.Acquisition, "Головний"): Int64

Формула сохранилась и формат выполнился. Метод вернул (как и должен) значение визуально похожее на RecId - теперь осталось проверить правильное ли и попробовать остальные параметры вызова задать не константами, а ссылками на элементы модели.
За это сообщение автора поблагодарили: EVGL (5).
Старый 09.12.2019, 23:53   #12  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Какая там функциональная логика - это известно
Только по факту настройка для конкретного ОС на проектах очень редко используется. На это есть масса причин, характера разделения прав доступа и ответственности между отделами IT, бухгалтерии, сторонних консультантов, логики внедрения и обучения бухгалтеров, а главным образом нормативов в конкретной стране. Если принять это предположение, то запрос сводится к одному FIRST(ORDER(FILTER(AND(OR(...
Старый 10.12.2019, 15:00   #13  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Цитата:
Сообщение от EVGL Посмотреть сообщение
Какая там функциональная логика - это известно
Только по факту настройка для конкретного ОС на проектах очень редко используется. На это есть масса причин, характера разделения прав доступа и ответственности между отделами IT, бухгалтерии, сторонних консультантов, логики внедрения и обучения бухгалтеров, а главным образом нормативов в конкретной стране. Если принять это предположение, то запрос сводится к одному FIRST(ORDER(FILTER(AND(OR(...
На счет "редко" - не могу согласиться. По моему опыту, бухгалтера настраивают один счет для "Все", другой для конкретной Группы ОС (например, для зданий) и нередко для каких-то очень дорогих ОС (типа производственная линия) "персональный" счет. Так что, все-таки ИМХО, лучше использовать отлаженый за многоие годы метод, чем писать ER-формулу.
Старый 10.12.2019, 13:04   #14  
mnt_dx is offline
mnt_dx
Участник
Axapta Retail User
Лучший по профессии 2014
 
1,746 / 188 (10) ++++++
Регистрация: 17.02.2011
Адрес: К Северу через Северо-Запад
А почему нельзя перегрузить ту же самую версию модели?

Цитата:
Can not overwrite a version
Старый 10.12.2019, 13:46   #15  
axm2017 is offline
axm2017
Участник
 
1,787 / 293 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от mnt_dx Посмотреть сообщение
А почему нельзя перегрузить ту же самую версию модели?
Это как раз неплохо.
Если версии одинаковы то смысл загружать, если разные то увеличивай версию.
Старый 11.12.2019, 22:22   #16  
mnt_dx is offline
mnt_dx
Участник
Axapta Retail User
Лучший по профессии 2014
 
1,746 / 188 (10) ++++++
Регистрация: 17.02.2011
Адрес: К Северу через Северо-Запад
Цитата:
Сообщение от axm2017 Посмотреть сообщение
Это как раз неплохо.
Если версии одинаковы то смысл загружать, если разные то увеличивай версию.
номер версий одинаковый, но содержимое каким-то образом получилось разное.
Старый 11.12.2019, 22:42   #17  
axm2017 is offline
axm2017
Участник
 
1,787 / 293 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от mnt_dx Посмотреть сообщение
номер версий одинаковый, но содержимое каким-то образом получилось разное.
По идее если не так называемый дерайв ака чайлд, от которых мы к счастью отказались, такого быть не должно. Можно сравнить xml ради интереса.
Старый 10.12.2019, 14:51   #18  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Подскажите, плз, как в ER работать со структурой LedgerDimension.

Из поля LedgerDimension таблицы AssetLedgerAccounts вытащил методом значение – это RecId структуры. В АХ2012 это был RecId записи в таблице DimensiomAttributeValueCombination (AssetLedgerAccounts > Relation: AssetLedgerAccounts. LedgerDimension == DimensiomAttributeValueCombination.RecID) и можно было из этой записи получить значение счета ГК и финаналитик - либо методами либо просто распарсить поле DisplayValue.

В АХ10 похоже механизм работы с LedgerDimension существенно переделали и таблицы DimensiomAttributeValueCombination уже нет; куда ведет эта ссылка из AssetLedgerAccounts посмотреть не могу, т.к. AOT мне недоступен.

Но если я правильно понимаю, то в можно этого и не знать, если использовать ER объект Сведения о финаналитиках. Но как реально это сделать – не понимаю.

Если добавляю этот объект – получаю список записей; методов у него нет. Получается, что надо написать какую-то формулу используя функции ER, чтобы выбрать набор значений (по имеющемуся RecId?), затем выбрать из списка конкретную запись для счета ГК или финаналитики (по имени?) и тогда из поля Definition.Name можно будет получить значение?

Или все вообще не так? Подскажите хотя бы в общих чертах что пробовать делать?
Старый 10.12.2019, 15:08   #19  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от Libovs Посмотреть сообщение
Или все вообще не так? Подскажите хотя бы в общих чертах что пробовать делать?
По крайней мере при использовании в модели проблем не было никаких:
'$EGCAssetAcquLedgerAccount'.'>Relations'.LedgerDimension.MainAccountValue

$EGCAssetAcquLedgerAccount - это была переменная типа record DimensiomAttributeValueCombination, конечно (найденная указанным выше методом). Одним RecId сыт не будешь.
Старый 10.12.2019, 15:34   #20  
Libovs is offline
Libovs
Участник
 
224 / 53 (2) ++++
Регистрация: 26.03.2018
Цитата:
Сообщение от EVGL Посмотреть сообщение
По крайней мере при использовании в модели проблем не было никаких:
'$EGCAssetAcquLedgerAccount'.'>Relations'.LedgerDimension.MainAccountValue

$EGCAssetAcquLedgerAccount - это была переменная типа record DimensiomAttributeValueCombination, конечно (найденная указанным выше методом). Одним RecId сыт не будешь.
Если $EGCAssetLedgerAccountsT - это таблица, то у меня есть метод assetLedgerDimension(), которым нахожу нужную запись, но этот метод возвращает не запись и не поле AssetLedgerAccounts.RecId, а поле AssetLedgerAccounts.LedgerDimension.

Если $EGCAssetLedgerAccountsR - это список записей, уже отфильтрованный по AssetId, BookId и AssetTransType, из которого нужно выбрать одну. Если бы у меня был именно AssetLedgerAccounts.RecId, то написал бы FILTER($EGCAssetLedgerAccountsR, $EGCAssetLedgerAccountsR.RecId = $EGCAssetLedgerAccountsT.RecId)

А так не хватает соображения связать это до кучи.
Теги
generic electronic reporting, ger

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ievgensaxblog: MSDyn365FO. How to Import CSV file using Electronic Reporting. Part 2 – Format. Blog bot DAX Blogs 0 06.02.2019 07:12
ievgensaxblog: MSDyn365FO. How to Import CSV file using Electronic Reporting. Part 1 – Data Model. Blog bot DAX Blogs 0 06.02.2019 07:12
erconsult: Electronic Reporting (ER) Cookbook 2: new tips from the kitchen Blog bot DAX Blogs 0 06.08.2018 17:11
powerobjects: Electronic Reporting in Dynamics 365 for Finance and Operations Blog bot DAX Blogs 0 14.02.2018 03:28
erconsult: Electronic Reporting (ER) Cookbook Blog bot DAX Blogs 24 09.10.2017 08:47

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

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

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