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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.08.2009, 02:35   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
aosvalidateinsert - зачем нужен
есть серия методов на таблице, начиная с 4ки , aosvalidate* - зачем они нужны ? я так понимаю, что для проверки прав , но когда мне как девелоперу они могут пригодиться не совсем четко себе представляю
Старый 12.08.2009, 10:26   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Вот:
Цитата:
Сообщение от Inside Microsoft Dynamix Ax 4.0
The difference between the two sets of methods is that the validateField, validateWrite and validateDelete methods are invoked only from rich client and web client forms or if called directly from X++ code; aosValidateInsert, aosValidateUpdate and aosValidateDelete are invoked implicity from the insert, update and delete base version methods, respectively, and the aosValidateRead method is invoked when the application retrieves records from the database
__________________
Zhirenkov Vitaly
Старый 12.08.2009, 10:47   #3  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Спасибо! Тот есть ксли какие-то проверки железно должны происходить при вставке записи, то эти проверки лучше запихнуть в aosvalidate*?
Есть ли сейчас способ вызвать validateField для каждого поля записи(мне нужно проверить , что все поля-ссылки имеют значение , существующее уже в таблице, на которую они ссылаюся). Можно отнаследовать sysConsistencyCheck.Но, может, появились уже кие-то другие способы вызвать эту проверку? (по идее Ax сама это же делает при сохранении записи в форме вручную)
Старый 12.08.2009, 10:52   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от IKA Посмотреть сообщение
Спасибо! Тот есть ксли какие-то проверки железно должны происходить при вставке записи, то эти проверки лучше запихнуть в aosvalidate*?
логично...
Цитата:
Сообщение от IKA Посмотреть сообщение
Есть ли сейчас способ вызвать validateField для каждого поля записи(мне нужно проверить , что все поля-ссылки имеют значение , существующее уже в таблице, на которую они ссылаюся). Можно отнаследовать sysConsistencyCheck.Но, может, появились уже кие-то другие способы вызвать эту проверку? (по идее Ax сама это же делает при сохранении записи в форме вручную)
Пройтись по всем полям (через dictTable) и вызвать validateField для "всех" полей...
Аксапта сама этого не делает - она вызывает validateField только при изменении поля конкретного, а никак не при сохранении записи. При сохранении записи вручную на форме вызывается только validateWrite.
__________________
Zhirenkov Vitaly
Старый 12.08.2009, 11:15   #5  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Еще про эти методы и про весь framework можно почитать в документе "Microsoft Dynamics AX 4.0 Writing Secure X++ Code".
__________________
Андрей.
Старый 13.08.2009, 00:34   #6  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
А чем лучше пользоваться - sysconsitencycheck* или (перебирать поля и вызывать validateField)?
Старый 13.08.2009, 12:02   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от IKA Посмотреть сообщение
А чем лучше пользоваться - sysconsitencycheck* или (перебирать поля и вызывать validateField)?
Риторический вопрос?

SysConsistencyCheck.kernelCheckRecord()
__________________
Zhirenkov Vitaly
Старый 13.08.2009, 13:37   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от IKA Посмотреть сообщение
Тот есть ксли какие-то проверки железно должны происходить при вставке записи, то эти проверки лучше запихнуть в aosvalidate*? мне нужно проверить , что все поля-ссылки имеют значение , существующее уже в таблице, на которую они ссылаюся
Цитата:
Сообщение от IKA Посмотреть сообщение
А чем лучше пользоваться - sysconsitencycheck* или (перебирать поля и вызывать validateField)?
На мой взгляд, не надо приплетать сюда механизм проверки целостности - он совсем для других сценариев использования предназначен. Вообще, складывается впечатление, что у вас одна часть приложения "не доверяет" другой части, из-за чего вы хотите приделать проверки как можно "ближе" к таблицам. Обычно не доверяют лишь тому, что вводит пользователь, - для этого и пишутся многочисленные проверки на validateField(), во многом для этого же пишется validateWrite(), хотя в нем могут проверяться отнюдь не все поля, но дополнительно могут проверяться какие-то взаимосвязи между их значениями. А если запись создана из кода, то обычно считается, что данные в ее полях взяты не с потолка; в любом случае, вам никто не мешает вызвать из кода validateWrite(), а в него уже прописать все необходимые проверки. Опять же, затем вам может понадобиться работать с записями таблицы без дополнительных проверок (скажем, когда все данные уже проверены в другом месте, и нужно лишь быстро совершить какие-то групповые операции) - если "зашить" проверки слишком жестко, к примеру, в insert()/update(), то в таких сценариях они будут лишь попусту тормозить работу, в том числе таких предусмотренных в ядре средств, как insert_recordset, update_recordset, RecordInsertList.

Цитата:
Сообщение от ZVV Посмотреть сообщение
Цитата:
Сообщение от IKA Посмотреть сообщение
А чем лучше пользоваться - sysconsitencycheck* или (перебирать поля и вызывать validateField)?
Риторический вопрос?
SysConsistencyCheck.kernelCheckRecord()
В самом начале этого метода есть такая проверка:
X++:
if (! common.recId)
    return;
В связи с этим он не годится для проверок перед вставкой новой записи.

PS. Если есть острое желание проверять все поля подряд, то можно в Global завести метод наподобие такого:
X++:
static boolean DEV_validateAllRecordFields( Common  _common, 
                                            boolean _verbose = false, 
                                            boolean _stopOnFirstError = true
                                          )
{
    DictTable   dictTable;
    DictField   dictField;
    FieldId     fieldId;
    boolean     ret = true;
    ArrayIdx    i;

    boolean validateSingleField(FieldId _fieldExtId)
    {
        if (!_common.validateField(_fieldExtId))
        {
            if (_verbose)
                warning(strfmt(@"Ошибка в поле '%1' таблицы '%2' (значение '%3')",
                                fieldid2pname(dictTable.id(), _fieldExtId), 
                                dictTable.label(), 
                                _common.(fieldId)
                       ));
            return false;
        }
        return true;
    }    
    ;
    dictTable = new DictTable(_common.tableId);
    if (!dictTable)
        return false;
    fieldId = dictTable.fieldNext(0);
    while (fieldId && !isSysId(fieldId) )
    {
        dictField = new DictField(_common.tableId, fieldId);
        if (dictField.arraySize() > 1)
        {
            for (i = 1; i <= dictField.arraySize(); i++)
            {
                if (!validateSingleField(fieldId2Ext(fieldId, i)))
                {
                    ret = false;
                    if (_stopOnFirstError)
                        break;
                }
            }
        }
        else
        {
            if (!validateSingleField(fieldId2Ext(fieldId, i)))
            {
                ret = false;
                if (_stopOnFirstError)
                    break;
            }
        }
        fieldId = dictTable.fieldNext(fieldId);
    }
    return ret;
}

Последний раз редактировалось gl00mie; 13.08.2009 в 15:22. Причина: исправил пример кода
За это сообщение автора поблагодарили: Dron AKA andy (2), ZVV (2), IKA (1).
Старый 14.08.2009, 01:17   #9  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
спасибо за разъяснения. у нас импорт из внешнего источника. Есть таблица промежуточная (с "грязными данными"), в ней около 100 полей ( многие из которых являются FK на другую таблицу), из этой таблицы данные будут импортироваться в "рабочие" таблицы. Хочется минимальными усилиями проверить на корректность заполния всех ссылочные поля (что в таблице , на которую они ссылаются, данные такие существуют) и предотвратить попадание грязных данных в систему.
Старый 14.08.2009, 08:42   #10  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от IKA Посмотреть сообщение
спасибо за разъяснения. у нас импорт из внешнего источника. Есть таблица промежуточная (с "грязными данными"), в ней около 100 полей ( многие из которых являются FK на другую таблицу), из этой таблицы данные будут импортироваться в "рабочие" таблицы. Хочется минимальными усилиями проверить на корректность заполния всех ссылочные поля (что в таблице , на которую они ссылаются, данные такие существуют) и предотвратить попадание грязных данных в систему.
ну так поверяйте значения в вашей процедуре импорта, для этого существуют экзисты таблиц
Теги
aos, validate, как правильно, crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Зачем нужен уникальный index, содержащий RecId? S.Kuskov DAX: Программирование 63 20.07.2011 11:30
Главная книга / Запросы / Аудит (TransactionLog) Зачем и кому он нужен? ta_and DAX: Функционал 18 24.09.2008 10:14
ALEG: Что такое Мастер конфигурирования и зачем он нужен Blog bot DAX Blogs 0 28.10.2006 16:10
зачем нужен WebTarget? yooshi DAX: Программирование 0 11.11.2005 14:22
Зачем таблице нужен релэйшн на саму себя? Artild DAX: Программирование 2 21.07.2003 11:52

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

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

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