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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.10.2004, 11:07   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Список полей таблиц на базе конкретного EDT
AXAPTA 2.5 SP3

Как получить список полей таблиц, созданных на базе конкретного EDT?

Точнее так:

Есть EDT-base, на его основе может быть создано множестов EDT-child, на основе каждого EDT-child также могут быть созданы множество EDT-child-child

Так вот, мне надо получить список всех полей созданных на базе либо EDT-base, либо на базе любых EDT-наследников от EDT-base

Перекрестные ссылки, в принципе, использовать можно, но это большой напряг:

-) Выводится список вообще всех объектов имеющих ссылки на EDT и фильтрации эта куча не поддается! Точнее, попытка настроить фильтр приводит к пустой выборке.

-) Показывается список объектов только непосредственно искомого EDT, а не его наследников. Для каждого из них надо повторять поиск по перекрестным ссылкам

AXAPTA 2.5 SP3
Старый 06.10.2004, 11:43   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А зачем, если не секрет?

Если, допустим, просто для переименования, то в 3,0 (не знаю как в 2,5) есть функция renamePrimaryKey. По идее, она должна находить и переименовывать все узлы. Возможно, есть что-либо похожее...

Иначе, имхо, все равно придеться лазить по перекрестным ссылкам

С Уважением,
Георгий.
Старый 06.10.2004, 11:52   #3  
ddadream is offline
ddadream
Участник
Аватар для ddadream
 
130 / 17 (1) ++
Регистрация: 30.11.2001
Адрес: moscow
типа может так?

X++:
static void LookPropertiesInTables1(Args _args)
{
    TreeNode    tablesRoot;
    TreeNode    newTable, newField;
    AOTTableFieldList   newTableFields;
    TreeNode    tableField;
    int         edtPos;
    str         properties;
    str         tablename;
    UtilIdElements  UtilIdElements;

;
    tablesRoot = TreeNode::findNode("\\Data Dictionary\\Tables");

    newTable = tablesRoot.AOTfirstChild();
    while (newTable)
    {

        newField = newTable.AOTfindChild("Fields");
        newField = newField.AOTfirstChild();
        while (newField)
        {
            properties = newField.AOTgetProperties();
            edtPos = strlen(properties);

            if(strscan(properties, "tableId",1,strlen(properties)))
            {
                print newTable.treeNodeName();
            }
            newField = newField.AOTnextSibling();
        }
        newTable = newTable.AOTnextSibling();
    }
}
Старый 06.10.2004, 12:00   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да не секрет, конечно.

Проблема в следующем: когда создали нашу базу данных, то оставили выравнивание по правому краю (Adjustment = Right).

В результате, база данных уже имеет немеренный размер (на сегодня 130ГБ) и после каждого закрытия склада подрастает примерно на 10ГБ. Это без учета регулярного пополнения базы в рабочем порядке.

Просто сделать выравнивание по левому краю в EDT Num - не получится Кроме всего прочего, номера заказов и закупок (да и вообще всех документов) - это просто числа без префиксов. Выравнивание по левому краю нарушит порядок следования.

Идея заключается в том, чтобы сделать выравнивание по левому краю хотя бы для тех полей, где порядок следования не имеет значения, но эти поля занимают существенную часть базы данных. Например, номер лота (InventTransId)

Проблема в том, что в базу вводилось масса дополнительных полей и я просто не уверен, что во всех новых полях, которые должны хранить ссылку на номер лота в качестве EDT использовался именно InvetTransId или InventTransIdBase. Вполне возможно, что там использовался напрямую NUM или какие-то его наследники.

Вот я и хотел получить список всех полей, которые были созданы на базе NUM или его наследников. В идеале, получить вообще полный список полей с выравниванием по правому краю (не все они наследники от NUM). И дальше уже смотреть как и что надо менять.
Старый 06.10.2004, 12:06   #5  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да, печальная задача.... Чем-то напоминает Авгиевы конюшни
Старый 06.10.2004, 13:03   #6  
Sergik is offline
Sergik
Участник
 
136 / 10 (1) +
Регистрация: 25.08.2004
Адрес: Москва
Нормальная задача, одна из многих, которые мы делаем для оптимизации базы. Пока это только исследование эффективности данного решения на размер БД и скорость обработки запросов.
Старый 06.10.2004, 14:12   #7  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Re: Список полей таблиц на базе конкретного EDT
Цитата:
Изначально опубликовано Владимир Максимов
-) Выводится список вообще всех объектов имеющих ссылки на EDT и фильтрации эта куча не поддается! Точнее, попытка настроить фильтр приводит к пустой выборке.
Попробуйте для Name такой Range:
\\Data Dictionary\\Tables\\*\\Fields\\*

Вообще, проще, по-моему, все-таки с таблицами перекрестных ссылок поработать, чем все поля в произведении со всеми типами перебирать.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 06.10.2004, 14:20   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
ddadream
Спсибо за намек. Написал Job который выводит все что нужно.

Maxim Gorbunov
Опять забыл, что слэш - это управляющий символ. Указание двойного слэша при настройке условия фильтра помогло. Спасибо.
Старый 06.10.2004, 14:37   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
вот, на коленке собрано

PHP код:
static void Job1(Args _args)
{
    
Dictionary          dictionary = new Dictionary();
    
DictTable           dictTable;
    
DictField           dictField;
    
DictType            dictType;
    
int                 ij;

    
extendedTypeId parentTypeId(extendedTypeId _typeId)
    {
        
DictType            parentType = new DictType(_typeId);
        
ExtendedTypeId      parentId;
        ;

        while (
parentType)
        {
            
parentId parentType.id();
            
parentType = new DictType(parentType.extend());
        }

        return 
parentId;
    }

    ;

    for (
1<= dictionary.tableCnt(); i++)
    {
        
dictTable = new DictTable(dictionary.tableCnt2Id(i));

        if (!
dictTable.isTmp() && !dictTable.isSystemTable() && !dictTable.isView())
        {
            for (
1<= dictTable.fieldCnt(); j++)
            {
                
dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(j));
                if (!
dictField.isSystem())
                {
                    if (
dictField.baseType() == Types::String)
                    {
                        
//if (parentTypeId(dictField.id()) == extendedtypenum(Num))

                        
dictType = new DictType(dictField.typeId());

                        if (!
dictType)
                            
warning (strfmt("%1.%2 - поле без типа, неаккуратно как-то"dictTable.name(), dictField.name()));
                        else
                            if (
dictType.stringRight())
                                
info (strfmt("%1.%2 - выравнивание вправо"dictTable.name(), dictField.name()));
                    }
                }
            }
        }
    }

все равно для себя давно собирался написать что-то подобное, не пропадать же добру
За это сообщение автора поблагодарили: Yprit (1).
Старый 06.10.2004, 14:43   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Vadik
Спасибо. Я сделал примерно то же самое, только за основу взял перебор в дереве AOT, как показал ddadream.

PS: Поле без типа - это, например, поле на базе ENUM. Так что не обязательно это неаккуратность.
Старый 06.10.2004, 14:45   #11  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано Владимир Максимов
Поле без типа - это, например, поле на базе ENUM. Так что не обязательно это неаккуратность.
для строковых полей (if (dictField.baseType() == Types::String)) - наверное, все же неаккуратность
Теги
законченный пример, полезное, field

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
список таблиц с CreatedBy fialka DAX: Программирование 5 02.08.2007 10:59
Синхронизация таблиц при изменении EDT z_av DAX: Программирование 1 16.12.2004 11:55
Табличный Mapping - список используеиых таблиц db DAX: Программирование 6 30.06.2004 10:40
список таблиц с saveDataPerCompany=No a.kopytin DAX: Программирование 4 14.05.2004 17:16
Список таблиц ZVV DAX: Прочие вопросы 3 16.03.2004 16:57
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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