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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2007, 11:41   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Проверки заполненных значений в связанных таблицах.
При импорте часто возникает необходимость проверки заполненных значений в связанных таблицах. Кодом то можно всё что угодно закинуть. А если инфа идёт из внешнего источника. На корректность вообще глупо рассчитывать. Искал специальный метод не нашёл. Пришлось написать.
X++:
Static boolean CheckValidateField(Common _table)
{
    DictTable       dictTable = new DictTable(_table.TableId);
    DictField       dictField;
    int             fieldCount = dictTable.fieldCnt();
    int             i;
    int             x;
    boolean         ret;
    ;
    ret = true;
    for (i = 1; i <= fieldCount; i++)
    {
        dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(i));
        x=dictField.id();
        if(!dictField.isSystem() && (dictField.baseType() == Types::String || dictField.baseType() == Types::Integer) && _table.(x))
        {
            if (!_table.validateField(x))
                ret = false;
        }
    }
    return ret;
}
Если кто знает стандартный метод и поделиться где он лежит, буду благодарен.

Последний раз редактировалось miklenew; 25.12.2007 в 13:50.
Старый 25.12.2007, 12:10   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Проверок побольше сделайте.
Такие комбинации не всегда проходят:
X++:
dictField = new DictField;
Вам не кажется, что в методе не хватает информативности?

Что-то в этом роде:
X++:
            if (!_table.validateField(x))
            {
                sysinfo = new SysInfoAction_TableField(_table, x);
                if( dictField.arraySize() > 1)
                    info(strfmt("Field %1.%2[%3] with RecId = %4 not valid", dict.tableName(_table.TableId), dictField.name(), dictField.arraySize(), _table.RecId), "", sysinfo);
                else
                    info(strfmt("Field %1.%2 with RecId = %3 not valid", dict.tableName(_table.TableId), dictField.name(), _table.RecId), "", sysinfo);
                ret = false;
            }
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 25.12.2007, 12:30   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Проверок побольше сделайте.
Такие комбинации не всегда проходят:
X++:
dictField = new DictField;
Вам не кажется, что в методе не хватает информативности?
Те ошибки которые генерит система достаточны.
На счёт не всегда проходят согласен. Подправил место
X++:
if(!dictField.isSystem())
надо
X++:
if(!dictField.isSystem() && dictField.baseType() == Types::String && _table.(x))
Старый 25.12.2007, 12:39   #4  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
X++:
dictField.baseType() == Types::String
А почему?
А если условие на интовое поле (например).

X++:
     .
У меня много ошибок на которые система ничего не говорит.

X++:
dictTable = new DictTable(_table.TableId);
Я имел ввиду, что это не факт, что всегда dictField = !null после такой строчки.
А если он будет null - сами понимаете....

PS Про "не найдено в связанном справочнике..." система действительно сама ворчит.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0

Последний раз редактировалось Alex_KD; 25.12.2007 в 12:41. Причина: логика хромает...=)
За это сообщение автора поблагодарили: miklenew (1).
Старый 25.12.2007, 12:48   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
А почему?
А если условие на интовое поле (например).
Интовое и связываться будет по интовому.
Место конечно узкое.
Но найдите в системе, чтоб интовое поле было ключевым. Если так можно сказать. Я таких не видел.
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
У меня много ошибок на которые система ничего не говорит.
Я лишь проверяю есть ли это значение в связанной таблице. Остальные ошибки это другие методы.
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Я имел ввиду, что это не факт, что всегда dictField = !null после такой строчки.
А если он будет null - сами понимаете....
Пример?
Старый 25.12.2007, 13:14   #6  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от miklenew Посмотреть сообщение
При импорте часто возникает необходимость проверки заполненных значений в связанных таблицах. Кодом то можно всё что угодно закинуть. А если инфа идёт из внешнего источника. На корректность вообще глупо рассчитывать. Искал специальный метод не нашёл. Пришлось написать.
Как проверить целостность данных

Не подобная ли проблема и у вас? Если подобная, то решение в сообщении gl00mie в этой теме.
Старый 25.12.2007, 13:20   #7  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Например:
X++:
dictTable = new DictTable(0);
Цитата:
Я таких не видел.
Есть парочку (список неполный):

Info Сообщение (13:14:05) CustPaymSchedLine.ParentRecID
Info Сообщение (13:14:05) LedgerBudget.ExpandId
Info Сообщение (13:14:05) LedgerClosingTrans.OffsetAccountRecId
Info Сообщение (13:14:05) LedgerKeyTrans.PeriodStart
Info Сообщение (13:14:05) LedgerPeriod.PeriodStart
Info Сообщение (13:14:05) LedgerPeriod.PeriodEnd
Info Сообщение (13:14:05) ProdTable.GanttColorId
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 25.12.2007, 13:37   #8  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от petr Посмотреть сообщение
Как проверить целостность данных

Не подобная ли проблема и у вас? Если подобная, то решение в сообщении gl00mie в этой теме.
В самом методе не разбирался может и то, может даже лучше, но использовать не удобно. Класс надо создавть, а он ещё и абстрактный.
Static метод лучше закинул себе его в глобал. Ещё не раз пригодиться.
Старый 25.12.2007, 13:39   #9  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Например:

Есть парочку (список неполный):
Info Сообщение (13:14:05) CustPaymSchedLine.ParentRecID
Info Сообщение (13:14:05) LedgerBudget.ExpandId
Info Сообщение (13:14:05) LedgerClosingTrans.OffsetAccountRecId
Info Сообщение (13:14:05) LedgerKeyTrans.PeriodStart
Info Сообщение (13:14:05) LedgerPeriod.PeriodStart
Info Сообщение (13:14:05) LedgerPeriod.PeriodEnd
Info Сообщение (13:14:05) ProdTable.GanttColorId
На счёт int убедил. На счёт даты и DictTable(0) нет.
Подправил метод.
Старый 25.12.2007, 13:55   #10  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Я бы перестраховался
Но дело ваше.

На счет класса - validateWrite вызывает помимо validateField.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 25.12.2007, 14:22   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Посмотрите классы, которые начинаются на Ax
Они делают все проверки, которые вы хотите, проверяя при заполнении поля его допустимость, и потом вызывая validateWrite перед непосредственным сохранением записи.

Да и вообще может просто получиться этими классами воспользоваться вместо написания своего?
Старый 25.12.2007, 14:40   #12  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Посмотрите классы, которые начинаются на Ax
Они делают все проверки, которые вы хотите, проверяя при заполнении поля его допустимость, и потом вызывая validateWrite перед непосредственным сохранением записи.

Да и вообще может просто получиться этими классами воспользоваться вместо написания своего?
Классы интересные, но AxInternalBase абстрактный остальные под конкретные таблицы написаны.
Методы все мне не нужны, мне нужна проверка именно на то что я написал не больше не меньше.
Теги
relation, законченный пример, импорт данных, как правильно, проверка целостности, таблица

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление поля с определённым типом во всех таблицах. Corel DAX: Программирование 1 20.12.2008 13:37
Замена inventDimId во всех таблицах fialka DAX: База знаний и проекты 7 20.08.2007 16:29
Как сохранять размер связанных форм? BlueRose DAX: Программирование 2 15.06.2006 17:06
Осторожнее с CTRL+S на таблицах mit DAX: Администрирование 7 25.07.2005 19:09
Группы пользователей в настройке Проверки для Названий журналов Oz DAX: Функционал 2 09.06.2004 17:51
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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