Исключение OLE error 80020102

Salud, amigos!

Версия: 3.3.2.222
Класс исключения: EOleException
Сообщение об ошибке: OLE error 80020102
Прошу объяснить мне не образованному человеку причину этой ошибки
Возникает на коде:

...
Dataset('SomeName') = 0;    // (*)
...

Поле 'SomeName' - типа Boolean. Исключение выбрасывается не всегда, а только на некоторых записях.
При том перед присвоением:
Вывод -
MessageBox(Dataset.ValAsStr('SomeName'));

Отрабатывает корректно, но повторюсь иногда - после строчки кода (*) выбрасывает исключение [Object Error].

Буду очень признателен за руку помощи.

Нравится

11 комментариев

Чтобы увидеть настоящую причину ошибки, надо установить отладчик.

Исключение выбрасывает строка *.

function RecalcPartableDiscounts(){  
    if (Self.State == dstEdit){               
        var UpdateQuery = GetSingleItemByCode('uq_SetOrderPartableParams');
        var Parameters = UpdateQuery.Parameters;
        Parameters('ID').Value = Self('ID');    
        Parameters('HasClientCard').Value = Self('HasClientCard');
        Parameters('SourceID').Value = Self('SourceID');
        Parameters('IsComplaintDiscount').Value = Self('IsComplaintDiscount');
        UpdateQuery.Execute(); (*)
        RecalcOrderPartableDiscounts(Self('ID'));
        CalcOrderLotsAmount(Self);
	}
}

А как выглядит uq_SetOrderPartableParams? И что именно пишет при возникновении исключения?

Исключение в принципе, всё то же, что и в названии темы. После установки отладчика, проследил стек вызовов, и дошёл до этого метода.

Егор, предоставьте, пожалуйста, более подробную информацию по uq_SetOrderPartableParams

Что выполняется в пользовательском запросе?

Напрашивается вопрос.
С каким Dataset взаимодействует UpdateQuery, и как можно определить тот самый Dataset? (По логике все Наборы данных которые могут иметь отношение к Запросу на обновление (в моём случае) отмечены CheckBox'ом Генерировать запрос на обновление.)
Вывод Assigned(Dataset.UpdateQuery.Caption) выдаёт false.
Прошу пояснить механизм работы конвейера, и прядок и принципы обработки данных.
С уважением
Ваш коллега.

"Резвов Роман" написал:Егор, предоставьте, пожалуйста, более подробную информацию по uq_SetOrderPartableParams

Что именно необходимо?
Я человек новый, пока всех тонкостей и особенностей сервисов не знаю, буду благодарен за более исчерпывающую информацию.

Егор, доброго времени суток.

UQ - это сервис который отсылает UPDATE запрос к базе, без всяких там датасетов и так далее.
По поводу ошибки, значение параметров нужно устанавливать так:

SetParameterValue(Parameters, 'ID', ID);

а

GetSingleItemByCode('uq_SetOrderPartableParams');

лучше заменить на

Services.GetNewItemByUSI('uq_SetOrderPartableParams');

И проверьте чтобы совпадал тип параметра с типом колонки в БД.

Удачи!

Дмитрий, и все участники обсуждения, выражаю огромную благодарность. Вы мне очень помогли. Проблема выявлена.
И заключалась в неверных типах значений сервиса UpdateQuery, которые не совпадали с типами в таблице БД.
Буду дальше выравнивать ситуацию после своих предшественников, и совершенствовать своё понимание системы, ещё раз всем огромное спасибо.
P.S.

"Олейник Дмитрий" написал:GetSingleItemByCode('uq_SetOrderPartableParams');
лучше заменить на

Services.GetNewItemByUSI('uq_SetOrderPartableParams');


У меня дилетантский вопрос:
До этого момента ломал голову и думал что лучше. Пришёл к выводу что как раз первый вариант с тем аргументированием что функция более гибкая, и позволяет, при использовании единого кода (второй параметр) каждый раз не создавать новый экземпляр сервиса, а ссылаться на уже созданный.
Возможно моё недопонимание двух методов связано с отсутствием опыта использования в соответствующих особых ситуациях.
Так в общем собственно вопрос =)
Почему лучше?

Это совет из опыта. Так будет большая вероятность избежать утечек памяти.

Учту на будущее, благодарю!

С уважением,
Ваш коллега

Показать все комментарии