04.12.2019, 14:20 | #161 |
Участник
|
Цитата:
В модели ОС корневой элемент AssetTable, а связанные записи таблицы AssetBook определены как вычисляемое поле $Books:Вычисляемое поле = IF(ISEMPTY(AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'), EMPTYLIST(AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'), AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'): Список записей: DataContainerList (): DataContainerList () Хочу полностью аналогично добавить таблицу LedgerJournalTrans_Asset.AssertId. Добавляю $LedgerJournalTrans_Asset:Вычисляемое поле = IF(ISEMPTY(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), EMPTYLIST(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId') - а не работает. Почему - не понимаю. |
|
04.12.2019, 14:26 | #162 |
Участник
|
|
|
04.12.2019, 14:33 | #163 |
Участник
|
Цитата:
AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId' Возможно, вы хотите FIRSTORNULL(AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId') |
|
04.12.2019, 14:38 | #164 |
Участник
|
Цитата:
Сообщение от belugin
Рекомендуемый способ для этого использовать свою модель и меппинг (см derive) yна основе существующей.
Нерекомендуемый способ: Технически возможно использовать источники данных на меппинге формата, только там нету источников данных с меппингов модели а только результат - сама модель. Если вы можете использовать данные модели, то можно отбирать данные из источников с помощью функции FILTER: FILTER(MyTable, MyTable.AssetBookID = model.AssetBookID ) Попробовал вычисляемое поле с такой формулой: FILTER (LedgerJournalTrans_Asset, LedgerJournalTrans_Asset.AssetID = model.FixedAssets.General.Identification.Number) В ответ - "Неверная ссылка "LedgerJournalTrans_Asset". Т.е. фактическое имя таблицы не может использоваться в формулах, только внутренние метки (алиасы)? |
|
04.12.2019, 14:48 | #165 |
Участник
|
Имя источника данных типа table records. Непосредственно в языке формул нельзя обращаться к таблицам, только создавая источники данных. Имя источника данных можно сделать любым, в том числе и совпадающим с именем таблицы.
Последний раз редактировалось belugin; 04.12.2019 в 14:53. |
|
04.12.2019, 14:49 | #166 |
Участник
|
Цитата:
Я понимаю так, что к одной корневой записи AssetTable vможет быть несколько (или ни одной) записей в таблице AsssetBook. В этой формуле реализуется проверка на наличие связанных записей и возвращается их список; но если записей нет - возвращается не null, а EMPTYLIST. Видимо, чтобы тип данных был всегда одинаковый. |
|
04.12.2019, 14:55 | #167 |
Участник
|
Т.е. попробовать сначала добавить элемент типа table records, а потом уже добавить вычисляемое поле с такой формулой, используя заданное имя (метку) этого элемента? Сейчас попробую...
|
|
04.12.2019, 15:09 | #168 |
Участник
|
Вот и очередная непонятка: на форме создания источника данных типа записи таблицы есть галочка "Запросить запрос". Зачем она? На что влияет? Включать?
Без документации - ну ни как... Извините за нытье |
|
04.12.2019, 15:10 | #169 |
Участник
|
Он и так одинаковый - null в программистском понимании в ER отсутствует. FIRSTORNULL в случае пустоты списка возвращает пустую запись. Наверное правильнее было бы назвать FIRSTOREMPTY (аналогично (IF(ISEMPTY(x), EMPTYRECORD(x), x) только быстрее).
|
|
04.12.2019, 15:13 | #170 |
Участник
|
Эта штука просит вызывающего предоставить аксаптовский запрос. Стандартное поведение - вывод его в диалог запроса параметров запуска - там можно будет наложить какие-то источники данных, но его может и программно заполнить вызыващий код X++
|
|
04.12.2019, 15:33 | #171 |
Участник
|
Еще раз замечу, что эту формулу не я писал. А по сути - FIRSTORNULL тут не годится, т.к. реально для обработки нужна не первая, а все имеющиеся связанные записи. В данном контексте каждая операция с ОС может выполняться по нескольким моделям (книгам) учета: по бухучету одна проводка, по налоговому другая, по управленческому третья и т.п.
|
|
04.12.2019, 15:45 | #172 |
Участник
|
|
|
04.12.2019, 16:03 | #173 |
Участник
|
Цитата:
Я понимаю, сколько прошло времени с выпуска АХ2012 и сколько с D365. По АХ2012 на docs.microsoft.com все-таки расписана каждая форма, кнопка и поле на форме, пусть конспективно и не всегда понятно на что влияет, но хоть что-то... |
|
04.12.2019, 16:09 | #174 |
Участник
|
Я даже не об этом...
Формула в частности и формат в целом - работает. Качество (производительность) - для меня пока вопрос не второй и даже не пятый. Просто не вижу другого пути изучить функционал и промоделировать свои задачи кроме поиска в готовых моделях/форматах прямых аналогий для своих потребностей. |
|
|
За это сообщение автора поблагодарили: mazzy (10). |
04.12.2019, 17:12 | #175 |
Участник
|
Цитата:
Сообщение от Libovs
А по сути - FIRSTORNULL тут не годится, т.к. реально для обработки нужна не первая, а все имеющиеся связанные записи. В данном контексте каждая операция с ОС может выполняться по нескольким моделям (книгам) учета: по бухучету одна проводка, по налоговому другая, по управленческому третья и т.п.
|
|
04.12.2019, 18:06 | #176 |
Участник
|
Цитата:
В списке "model/FixedAssets/LedgerJournalLines" не выполняется проверка того, является ли он пустым, что может привести к ошибке во время выполнения. Добавьте соответствующую проверку. А если это же выражение "завернуть" в любую функцию типа ALLITEMS, FIRSTORNULL, ISEMPTY ... то то валидация не вякает. Но это мое предположение. |
|
|
За это сообщение автора поблагодарили: EVGL (1). |
05.12.2019, 12:48 | #177 |
Участник
|
Цитата:
Теперь смотрю на маппинг модели. В нем 3 корневых элемента, где Fixed asset сопоставлен с источником данных AssetTable. В этот корневой элемент добавлено поле $Books вычисляемое по формуле $Books:Вычисляемое поле = IF(ISEMPTY(AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'), EMPTYLIST(AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'), AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId') В этой формуле используется имя AssetBook, которое не является ER-именем источника данных, а системным именем таблицы. Это предположение я делаю исходя из того, что (см. выше) источник данных с таким именем не описывался и в выражении AssetTable используется без кавычек (ER-имя), а AssetBook взято в кавычки. И эта модель с такой формулой работает, на ней построено десятка два форматов. Для «чистоты эксперимента» выгрузил модель с маппингом в xml-файл и поиском проверил, что строка ‘AssetBook’ нигде, кроме этого выражения не встречается. И я возвращаюсь опять к вопросу: может ли в формуле использоваться системное имя таблицы? Почему возникает ошибка валидации при сохранении абсолютно идентичной формулы для таблицы LedgerJournalTrans_Asset $LedgerJournalTrans_Asset:Вычисляемое поле = IF(ISEMPTY(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), EMPTYLIST(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId') Предположение о том, что правила написания формул в модели и формате разные, мне кажется невероятным. Более вероятным может быть, что методы валидации для форм конструктора модели и формата реализованы разным кодом (в разных классах), но тогда в одном из них ошибка? Или я все-таки чего-то не понимаю или неверно трактую? Что неправильно в моих рассуждениях и/или выводах? Последний раз редактировалось Libovs; 05.12.2019 в 13:01. |
|
05.12.2019, 16:40 | #178 |
Banned
|
Цитата:
Одинарные кавычки появляются тогда, когда есть специальные символы или точки. К примеру, "AssetBook.AssetTable_AssertId" - это не таблица, а relation. Действительно, в явном виде надо объявлять только "корневые" таблицы, если с них начинается поиск. Если же до другой таблицы можно добраться через 1:N или N:1 от корневой, то их эксклюзивно объявлять не надо. |
|
05.12.2019, 16:48 | #179 |
Участник
|
Цитата:
Сообщение от Libovs
Вот смотрю я на модель ОС от официального поставщика. В источниках данных определены три таблицы – AssetTable, AssetTaxDepr_LV типа записи таблицы и CompanyInfo типа таблица. Таблица AssetBook как источник данных не описана, соответственно ER-имени (внутреннего алиаса) у этой таблицы нет.
Тут нет идентификатора AssetBook - есть идентификатор 'AssetBook.AssetTable_AssertId' (одинарные кавычки означают, что дальше до следующей кавычки продолжается один и тот же идентификатор) ER оперирует виртуальными записями. AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId'. Означает: из записи AssetTable взять поле <Relations потом оттуда взять поле AssetBook.AssetTable_AssertId: - Поле <relations это виртуальная запись со всеми входящими relations - поле AssetBook.AssetTable_AssertId это список записей выбранных по конкретному relation из текущей записи AssetTable (а не вся таблица AssetBook). Цитата:
И я возвращаюсь опять к вопросу: может ли в формуле использоваться системное имя таблицы?
Если удалить все источники данных, то данная формула перестанет работать. Цитата:
Почему возникает ошибка валидации при сохранении абсолютно идентичной формулы для таблицы LedgerJournalTrans_Asset
$LedgerJournalTrans_Asset:Вычисляемое поле = IF(ISEMPTY(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), EMPTYLIST(AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId'), AssetTable.'<Relations'.'LedgerJournalTrans_Asset.AssetTable_AssertId') Цитата:
Предположение о том, что правила написания формул в модели и формате разные, мне кажется невероятным. Более вероятным может быть, что методы валидации для форм конструктора модели и формата реализованы разным кодом (в разных классах), но тогда в одном из них ошибка?
Если что-то взято в одинарные кавычки, то это один идентификатор. идентификатор.ижентификатор2.идентификатор3 - это цепочка из трех идентификаторов 'идентификатор.ижентификатор2.идентификатор3' - это один идентификатор в который входит символ "." (без кавычек только буквы и цифры начиная с буквы). Какие именно поля - зависит от вида источника данных. Для аксаптовских таблиц есть два вида источника данных Table Records - список всех записей и table - статические методы. Каждая отдельная аксаптовская запись преобразуется в геровскую виртуальную запись у которой есть геровские поля для аксаптовских полей, методов, отношений и так далее. Для каждого отношения (relation) генерируется имя вида 'Таблица.{название поля или отношения>}', значением которой является список записей. Все доступные поля можно получить раскрывая дерево источников данных. Никакие другие поля недоступны - надо либо добавлять новые источники данных либо менять приложение (например добавить extension метод на таблицу и тогда появится новое геровское поле для этого метода). |
|
|
За это сообщение автора поблагодарили: EVGL (5), sukhanchik (6). |
05.12.2019, 19:57 | #180 |
Участник
|
Цитата:
Сообщение от EVGL
Многое
Одинарные кавычки появляются тогда, когда есть специальные символы или точки. К примеру, "AssetBook.AssetTable_AssertId" - это не таблица, а relation. Действительно, в явном виде надо объявлять только "корневые" таблицы, если с них начинается поиск. Если же до другой таблицы можно добраться через 1:N или N:1 от корневой, то их эксклюзивно объявлять не надо. И как быть если relation не у корневой на подчиненную, а наоборот? Т.е. корневая таблица «не знает» о существовании таблиц, которые на нее ссылаются? В примере, с которым я разбираюсь, у корневой таблицы AssetTable нет relation на таблицы AssetBook и LedgerJournalTrans_Asset. Эти таблицы ссылаются на AssetTable. У AssetBook relation AssetTable_AssertId AssetBook.AssertId == AssetTable.AssertId а у LedgerJournalTrans_Asset relation AssetTable_AssertId LedgerJournalTrans_Asse.AssertId == AssetTable.AssertId Правильно ли я понимаю, что о "направлении" связи говорит знак ">" или "<"? В первом случае - это relation корневой таблицы на подчиненную, а во втором - наоборот? И такой пример из той же модели: У таблицы AssetTable есть relation WorkerContactName_FK AssetTable.WorkerContactName == HcmWorker.RecID В модели есть поле с такой формулой FIRSTORNULL(AssetTable.'>Relations'.WorkerContactName) Раз ссылка на RecID, то это связь 1:1, WorkerContactName это имя поля, а не relation (там еще _FK и WorkerContactName вне кавычек) и данное выражение возвращает единичную запись из таблицы HcmWorker. Правильно? Выражение (опуская IF и проверку на пустой список) AssetTable.'<Relations'.'AssetBook.AssetTable_AssertId' Связь 1:N, AssetTable_AssertId это relation таблицы AssetBook (а не AssetTable) и данное выражение возвращает список записей таблицы AssetBook, но не всех, а только связанных с текущей записью AssetTable. Правильно? И, все равно не понимаю, чем выражение AssetTable.'<Relations'.' LedgerJournalTrans_Asset.AssetTable_AssertId' отличается от предыдущего. Единственное, что приходит на ум, это то, что первое используется в маппинге модели и там можно добраться до любой связанной таблицы без ее эксклюзивного объявления, независимо от «направления» relation. А в маппинге формата можно добраться только до элементов модели, но не до таблицы. Но если в формате ее добавить как источник данных, то можно записи из нее использовать – это я уже попробовал. Вот только связать ее с корневой таблицей модели так же не получается. Надо ссылаться на ER-метку и с отбором по relation что-то не получается. Пробую использовать FILTER, но пока никак не получается написать корректное выражение где с одной стороны поле добавленной таблицы (источника данных), а с другой – поле элемента модели данных. |
|
Теги |
generic electronic reporting, ger |
|
|