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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.12.2004, 19:26   #1  
AKIS-Falcon is offline
AKIS-Falcon
Ехидна
Аватар для AKIS-Falcon
 
543 / 13 (2) ++
Регистрация: 22.06.2004
Адрес: Pincourt, Montreal, Canada
Перебор всех таблиц, имеющих поле определенного типа
Буду весьма благодарен за советы, а также за ссылки на советы на этом форуме или любом другом ресурсе, о том как решить следующую задачу:

Нужно организовать перебор всех таблиц в АОТ, имеющих поле определенного расширенного типа. Для таблиц с таким полем, нужно перебирать все записи, имеющие определенное значение, и изменять это значение на другое.

Аксапта 3.0 SP2, если это имеет значение.

Еще раз заранее спасибо за советы.
__________________
Strictly IMHO and nothing personal.
Сугубо мое персональное мнение, безотносительно к личности оппонента.
Старый 22.12.2004, 20:43   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Что касается поиска - несколько способов было здесь

Список полей таблиц на базе конкретного EDT

изменить можно например так:

PHP код:
static void Job2(Args _args)
{
    
DictTable       dt;
    
DictField       df;
    
str             newvalue "new'name";
    
str             oldvalue "old'name";
    
str             execstr;
    
XppCompiler     xppCompiler = new XppCompiler();
    ;

    
dt = new DictTable(tablenum(LedgerTable));
    
df = new DictField(tablenum(LedgerTable), fieldnum(LedgerTableAccountName));

    
execstr =  strfmt('void updatejob() {%1 t; update_recordset t setting %2 = "%3" where t.%4 == "%5";}',
        
dt.name(),
        
df.name(),
        
newvalue,
        
df.name(),
        
oldvalue);

    
info (execstr);

    if (
xppCompiler.compile(execstr))
    {
        
info ("ok");
        
runbuf(execstr);
    }
    else
        
error ("error");

Правда, надо еще как минимум поаккуратнее работать с нестроковыми типами, но это уже мелочи
Старый 22.12.2004, 21:19   #3  
AKIS-Falcon is offline
AKIS-Falcon
Ехидна
Аватар для AKIS-Falcon
 
543 / 13 (2) ++
Регистрация: 22.06.2004
Адрес: Pincourt, Montreal, Canada
Vadik, спасибо большое!!!!
__________________
Strictly IMHO and nothing personal.
Сугубо мое персональное мнение, безотносительно к личности оппонента.
Старый 22.12.2004, 21:44   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Перебор всех таблиц, имеющих поле определенного типа
Цитата:
Изначально опубликовано AKIS-Falcon
Нужно организовать перебор всех таблиц в АОТ, имеющих поле определенного расширенного типа.
Думаю, стоит рыть в сторону перекрестных ссылок.
http://axapta.mazzy.ru/hints/xref/#040

Стоит встать в АОТ на EDT и спросить чем этот EDT используется.
Отфильтровать записи, которые содержат \Data Dictionary\Tables\
Старый 22.12.2004, 23:19   #5  
AKIS-Falcon is offline
AKIS-Falcon
Ехидна
Аватар для AKIS-Falcon
 
543 / 13 (2) ++
Регистрация: 22.06.2004
Адрес: Pincourt, Montreal, Canada
Вот мой вариант того, что в результате получилось - фактически скрестил два Вадиковских куска кода, спасибо ему кстати еще раз

PHP код:
static void ChangeDimension5(Args _args)
{
    
Dictionary          dictionary = new Dictionary();
    
DictTable           dictTable;
    
DictField           dictField;
    
DictType            dictType;
    
int                 ij;
    
int table_idfield_idtype_id;
    
str             execstr;
    
XppCompiler     xppCompiler = new XppCompiler();

    
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() && ! dicttable.isMap())
        {
            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());
                        
type_id dictfield.typeId();
                        if (!
dictType)
                            
warning (strfmt("%1.%2 - No Type for the Field"dictTable.name(), dictField.name()));
                       else
                           if(
dictField.typeId() == typeid(Dimension) || dictField.typeId() == 132// Dimension
                           
{
                             
infolog.add(Exception::Infostrfmt("%1, %2, %3, %4, %5"dictTable.name(), DictField.name(), dicttype.name(), dictfield.typeid(), typeid(Dimension)));
                             
execstr =  strfmt('void updatejob() {%1 t; ttsbegin; while select forupdate t  where t.%4[5] like "%5" { t.%2[5] = "%3"; t.update(); } ttscommit;}',
                             
dicttable.name(),
                             
dictfield.name(),
                             
'10',
                             
dictfield.name(),
                             
'*');

                             
info (execstr);

                             if (
xppCompiler.compile(execstr))
                             {
                              
info ("ok");
                              
runbuf(execstr);
                             }
                             else
                              
error ("error");
                           }

                    }
                }
            }
        }
    }

Комментарии:
1. Как видно, тип у меня текстовый, так что никаких доппроверок не делаю
2. Не стал заморачиваться с длинным наследованием типа "внук-правнук" и пр. Ограничился только прямым
3. Немного поменял сам код, изменяющий значения полей - update record_setting почему-то не пошло...

Вот.
__________________
Strictly IMHO and nothing personal.
Сугубо мое персональное мнение, безотносительно к личности оппонента.
Старый 23.12.2004, 00:05   #6  
AKIS-Falcon is offline
AKIS-Falcon
Ехидна
Аватар для AKIS-Falcon
 
543 / 13 (2) ++
Регистрация: 22.06.2004
Адрес: Pincourt, Montreal, Canada
Добавлю, что такие массовые обновления вообще-то надо вести очень осторожно. К примеру, может оказаться, что новое значение делает запись в таблице неуникальной по первичному ключу -> она не может быть сохранена -> выполнение всей процедуры прерывается. Т.е. неплохо бы обрабатывать такие ситуации по try.. catch. Насколько я понимаю, могут также быть затруднения и похуже...
__________________
Strictly IMHO and nothing personal.
Сугубо мое персональное мнение, безотносительно к личности оппонента.
Старый 23.12.2004, 12:06   #7  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
На всякий случай напомню о функции RemanePrimaryKey.

С Уважением,
Георгий.
Старый 23.12.2004, 21:43   #8  
AKIS-Falcon is offline
AKIS-Falcon
Ехидна
Аватар для AKIS-Falcon
 
543 / 13 (2) ++
Регистрация: 22.06.2004
Адрес: Pincourt, Montreal, Canada
Спасибо за напоминание

Было дело, пользовался ею - когда план счетов меняли.
__________________
Strictly IMHO and nothing personal.
Сугубо мое персональное мнение, безотносительно к личности оппонента.
Старый 11.02.2005, 17:07   #9  
wb is offline
wb
Участник
 
86 / 16 (1) ++
Регистрация: 26.01.2004
Адрес: Краснодар
Цитата:
Изначально опубликовано George Nordic
На всякий случай напомню о функции RemanePrimaryKey.
можите сказать что имеется ввиду?

я сделал немного по другому:

на форме Dimensions метод источника Dimensions
PHP код:
public void write()
{
    
SysDim  oldValueSysDim Dimensions.orig().Num;
    ;
    
super();
    
InventUpdateDimension_ew::run(Dimensions.DimensionCodeoldValueSysDimDimensions.Num);

метод класса InventUpdateDimension_ew
PHP код:
// w 11.02.2005 Axapta 3.0 CIS SP1
public static void run(DimensionCode _dimCodeSysDim _oldSysDimSysDim _newSysDim)
{
    
Dictionary  dictionary = new Dictionary();
    
DictTable   dictTable;
    
DictField   dictField;
    
int         ij;

    
#define.FieldId_Dimension(132)

    
void update(TableId _tableIdFieldId _fieldId)
    {
        
Query                   q = new Query();
        
QueryBuildDataSource    qbds;
        
QueryRun                qr;
        
Common                  common;
        
FieldId                 fieldId_Dimension fieldId2ext(_fieldId_dimCode 1);

        ;
        
qbds q.addDataSource(_tableId);
        
qbds.update(true);
        
qbds.addRange(fieldId_Dimension).value(strfmt('\"%1\"'_oldSysDim));
        
qr = new QueryRun(q);
        while (
qr.next())
        {
            
common qr.getNo(1);
            
common.(fieldId_Dimension) = _newSysDim;
            
common.doUpdate();
        }
    }

    ;
    
ttsbegin;
    for (
1<= dictionary.tableCnt(); i++)
    {
        
dictTable = new DictTable(dictionary.tableCnt2Id(i));
        if (!
dictTable.isTmp() && !dictTable.isSystemTable() && !dictTable.isView() && !dictTable.isMap())
        {
            for (
1<= dictTable.fieldCnt(); j++)
            {
                
dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(j));
                if (!
dictField.isSystem() && dictField.typeId() == #FieldId_Dimension)
                    
update(dictTable.id(), dictField.id());
            }
        }
    }
    
ttscommit;
    
info(strfmt('Проведена замена аналитики %1 на %2'_oldSysDim_newSysDim));

С уважением,
wb
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Label на поле типа SUM в секции FOOTER не показывается Delfins DAX: Программирование 0 22.05.2007 12:12
Ошибка: фантомное дублирующее поле типа "дата" в гриде belugin DAX: Программирование 8 14.06.2006 00:15
Ссылка на поле другого типа Gorlum DAX: Программирование 2 08.06.2005 17:27
Почему в InventJournalTrans поле linenum вещественного типа?! ATimTim DAX: Программирование 7 17.06.2004 17:35
Поле в Grid типа Window Андре DAX: Программирование 13 18.12.2003 18:22

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

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

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