Цитата:
Сообщение от
Владимир Максимов
Если передан параметр (parmXXX), то он инициализирует значение объекта на форме диалога и он же будет сохранен, если пользователь его не изменит.
Т.е. мало того, что вводятся дублирующие параметры, так ещё и принимается, что если что-то пусто, то оно не инициализировано. Нет, это не выход и это уже здесь обсуждалось. И с тем, что это что-то упростит я не согласен.
Цитата:
Сообщение от
Владимир Максимов
С Query - чуть сложнее, но тоже не особо. Ведь в любом случае должен быть метод по его созданию. Вот в этом методе и анализировать значение параметра.
В том то и дело, что такой метод есть. Только не забываем, что этот query как правило выводится в диалоге и может быть там изменён. А значит, нужно этот метод вызвать после того как новые parm-параметры заданы, но перед тем как они будут упакованы и отправлены клиентскому объекту (мне пришёл в голову только вариант переопределить prompt и перез super() вызвать.) Либо вызывать при каждом unpack, что добавляет два лишних перестроения этого запроса (даже больше, если это будет пакетным заданием). В моем варианте это делается один раз.
Вот мой вариант с Query. Здесь initQuery тот самый метод, что строит запрос (на основе переданного в качестве параметра).
X++:
public boolean unpack(container packedClass)
{
Version version = runbase::getVersion(packedClass);
container packedQuery;
Query query;
container params = [#ParamsList];
switch (version)
{
case #CurrentVersion:
[version, #CurrentList, packedQuery] = packedClass;
if (packedQuery && SysQuery::isPackedOk(packedQuery))
query = new Query(packedQuery);
if (! query)
throw error("Ошибка");
if (inPrompt && inGetSaveLast)
{
[#ParamsList] = params;
queryRun = new QueryRun(this.initQuery(query));
}
else
queryRun = new QueryRun(query);
break;
default:
return false;
}
return true;
}