Цитата:
Сообщение от
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;
}