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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2026, 15:16   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,017 / 3301 (119) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А вот сами методы класса SysDictTable

X++:
// см. \Classes\SysDictTable\as_ByFieldId

// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024

public static TableId getConcreteTableIdByFieldId_MRC(Common _common, FieldId _fieldId)
{
    DictTable   dictTable;

    TableId     tableId;
    TableId     tableId4Field;

    str         fieldName;
    ;

    dictTable = new DictTable(_common.TableId);

    if (!(dictTable && dictTable.supportInheritance()))
    {
        return _common.TableId;
    }

    // Get concrete table for inheritance
    dictTable = new DictTable(tableName2id(_common.getInstanceRelationType()));

    if (dictTable)
    {
        // ищем tableId в иерархии наследования для которой первой определено поле _fieldId т.е. ту для которой оно было введено, а не отнаследовано.
        // fieldName = fieldId2name(_common.TableId, _fieldId);
        fieldName = fieldId2name(dictTable.id(), _fieldId); // в CIL для таблиц с наследованием лучше использовать не _common.TableId а tableName2id(_common.getInstanceRelationType())
        // а еще лучше SysDictTable::getConcreteTable() так как он работает для любых табличек
        // метод getInstanceRelationType() для ненаследуемых табличек выдает пустую строку но в нашем случае можно его юзать так как заведомо наследование есть в этом месте,
        // а работать будет быстрее чем SysDictTable::getConcreteTable()
        // см. [url=http://axforum.info/forums/showthread.php?p=412646#post412646]Приведение типов для таблиц ax2012[/url]

        // tableId4Field = _common.TableId;
        tableId4Field = dictTable.id();

        if (fieldName)
        {
            tableId = dictTable.extends();

            while (tableId)
            {
                dictTable = new DictTable(tableId);

                if (fieldName2id(tableId, fieldName))
                {
                    tableId4Field = tableId;
                }
                else
                {
                    break;
                }

                tableId = dictTable.extends();
            }
        }
    }

    if (!tableId4Field)
    {
        // не должны сюда попасть. Можно кидать исключение.
        throw error(strFmt("Не получилось определить таблицу для буфера %1, RecId = %2, поле = %3 (id поля = %4)",
            tableId2name(SysDictTable::getConcreteTable(_common)),
            _common.RecId,
            fieldId2name(_common.TableId, _fieldId),
            _fieldId
            ));
    }

    return tableId4Field;
}
X++:
// см. \Classes\SysDictTable\as_ByFieldName

// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024

public static TableId getConcreteTableIdByFieldName_MRC(Common _common, FieldName _fieldName)
{
    TableId     tableId;
    FieldId     fieldId;
    TableId     ret;
    ;

    // fieldId = fieldName2id(_common.TableId, _fieldName);

    tableId = SysDictTable::getConcreteTable(_common);
    fieldId = fieldName2Id(tableId, _fieldName);

    ret = SysDictTable::getConcreteTableIdByFieldId_MRC(_common, fieldId);

    return ret;
}
X++:
// [url=https://axforum.info/forums/showthread.php?t=78933]Приведение типов для таблиц ax2012[/url]
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024

public static Common as_ByFieldId(
    Common          _common,
    FieldId         _fieldId
    )
{
    anytype         anyBuffer;
    TableId         tableId;
    Common          ret;
    ;

    if (_fieldId)
    {
        tableId = SysDictTable::getConcreteTableIdByFieldId_MRC(_common, _fieldId);
        if (tableId)
        {
            // anyBuffer = _common as tableId2Name(tableId);
            anyBuffer = new DictTable(tableId).makeRecord();
            anyBuffer = _common;
            ret       = anyBuffer;
        }
    }

    return ret;
}
X++:
// [url=https://axforum.info/forums/showthread.php?t=78933]Приведение типов для таблиц ax2012[/url]
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024

public static Common as_ByFieldName(
    Common          _common,
    FieldName       _fieldName
    )
{
    anytype         anyBuffer;
    TableId         tableId;
    Common          ret;
    ;

    if (_fieldName)
    {
        tableId = SysDictTable::getConcreteTableIdByFieldName_MRC(_common, _fieldName);
        if (tableId)
        {
            // anyBuffer = _common as tableId2Name(tableId);
            anyBuffer = new DictTable(tableId).makeRecord();
            anyBuffer = _common;
            ret       = anyBuffer;
        }
    }

    return ret;
}
Теги
inheritance, isfielddataretrieved, orig, table inheritance, type cast

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
[AX2012] Наследование таблиц. iCloud DAX: Программирование 4 26.03.2014 15:28
AX2012 - изменение связи таблиц на форме DTD DAX: Программирование 4 10.12.2013 16:30
Как сравнить financials dimensions у двух таблиц (AX2012) ? DTD DAX: Программирование 0 17.07.2013 15:16
AX2012: drag'n'drop и поля таблиц wojzeh DAX: Программирование 2 18.01.2012 22:07
приведение типов в select simply2double DAX: Программирование 3 30.09.2004 11:24

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

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

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