При попытке редактирования записи, возникает разрушительный сбой

При попытке редактирования записей созданной мной детали, сразу возникает разрушительный сбой

Кнопки *Добавить* и *Удалить* отрабатывают без проблем.
Проверка MessageBox(Dataset.State); в обработчике выдает почему-то: 1.
На других, нормально работающих в режиме изменения записи, деталях такая-же проверка выдает 2 , т.е. dstEdit. Где могло произойти нарушение логики?

Нравится

32 комментария

Здравствуйте, Дмитрий!

Для решения данной проблемы установите debugger и отладьтесь, чтобы понимать в каком месте происходит свал.

Алла, добрый день!
В какую часть кода установить debugger ? Видимо туда, где сразу начинается выполняться код после нажатия *Изменить* ? В администраторе видно что на кнопку btnEdit обработчик btnEditOnClick выставлен, но он не обрабатывается в wnd_MyDetailGridAreaScript. A где тогда?

Ну а в обработчик кнопки *Оk* карточки редактирования датасет уже в неправильном состоянии приходит:
function btnOKOnClick(Control) {
var Dataset = dlData.Dataset ;
MessageBox(Dataset.State); // Здесь на экран выводится 1

Что означает Dataset.State == 1 ?

Алла, добрый день!
В какую часть кода установить debugger ? Видимо туда, где сразу начинается выполняться код после нажатия *Изменить* ? В администраторе видно что на кнопку btnEdit обработчик btnEditOnClick выставлен, но он не обрабатывается в wnd_MyDetailGridAreaScript. A где тогда?

Ну а в обработчик кнопки *Оk* карточки редактирования датасет уже в неправильном состоянии приходит:
function btnOKOnClick(Control) {
var Dataset = dlData.Dataset ;
MessageBox(Dataset.State); // Здесь на экран выводится 1

Что означает Dataset.State == 1 ?

Алла, добрый день!
В какую часть кода установить debugger ? Видимо туда, где сразу начинается выполняться код после нажатия *Изменить* ? В администраторе видно что на кнопку btnEdit обработчик btnEditOnClick выставлен, но он не обрабатывается в wnd_MyDetailGridAreaScript. A где тогда?

Ну а в обработчик кнопки *Оk* карточки редактирования датасет уже в неправильном состоянии приходит:
function btnOKOnClick(Control) {
var Dataset = dlData.Dataset ;
MessageBox(Dataset.State); // Здесь на экран выводится 1

Что означает Dataset.State == 1 ?

Установите debugger на обработчик OnPrepare карточки редактирования и посмотрите, в каком состоянии находится датасет.

Если для карточки редактирования обработчик OnPrepare не переопределен, тогда установите debugger в обработчик OnPrepare родительской карточки редактирования (она указана в свойстве TemplateWindowUSI самого окна карточки редактирования).

"Кудинов Дмитрий Станиславович" написал:В администраторе видно что на кнопку btnEdit обработчик btnEditOnClick выставлен, но он не обрабатывается в wnd_MyDetailGridAreaScript. A где тогда?

Аналогично вышенаписанному обработчик реализован в родительской карточке.

"Кудинов Дмитрий Станиславович" написал:Что означает Dataset.State == 1 ?

Это означает, что датасет находится в состоянии просмотра.
Для того, чтобы добавить данные в датасет, он должен находится в состоянии 2 (редактирования) или 3 (вставки).

Алла, не подскажете как от этого назойливого окна избавится ?

Каждый раз спрашивает при запуске VS, хотя галочка *Использовать ... по умолчанию* выставлена.

В справке написано:

Запуск JIT-отладки в случае возникновения ошибки
В диалоговом окне "JIT-отладка" в списке Доступные отладчики выберите пункт Новый экземпляр Visual Studio 2015 или выберите уже работающий экземпляр Visual Studio.
Чтобы автоматически использовать Visual Studio для всех будущих сбоев, выберите команду Использовать выбранный отладчик по умолчанию.
Если нужно выбрать типы кода для отладки, нажмите кнопку Выбрать отладчики вручную. Если этого не сделать, Visual Studio автоматически выбирает отладчики, подходящие для типа кода в приложении.
Нажмите кнопку ОК.

Если Visual Studio работает не так, стоит обратиться в службу поддержки Microsoft.
Также см. обсуждение похожего вопроса тут.

Все происходит в scr_BaseDBEditUtils между этими двумя функциями(см.ниже):

function OpenDatasetWithRecordID(Dataset, ID) { // здесь еще 0
Dataset.Close();
ApplyDatasetIDFilter(Dataset, ID, true);
Dataset.Open(); // здесь еще 0

А здесь уже 1 на входе:

Если на обычных деталях такого не возникает, а только на той, что создали Вы, то, скорее всего, деталь была создана неправильно. Где-то что-то не прописано или прописано неверно. Попробуйте сравнить с нормально работающими деталями.

Дмитрий,

в таком случае Вам нужно проверить, что происходит в обработчиках OnDatasetBeforeOpen и OnDatasetAfterOpen у датасета детали.

A можно самому переопределить с 1 на 2 ?
Если :
Dataset.State = 2;
тогда ошибка .

"Савельева Алла" написал: OnDatasetBeforeOpen и OnDatasetAfterOpen у датасета детали.

А куда debugger втыкать? Обработчики у датасета явно не определены.

Не нужно. Изменение состояния Dataset-а происходит автоматически при выполнении его методов.

"Зверев Александр" написал:Не нужно.

Уточните что делать не нужно. Не нужно проверять, что происходит в обработчиках OnDatasetBeforeOpen и OnDatasetAfterOpen или не нужно самому переопределять с 1 на 2 ?

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

В датасете не были проставлены галочки *Генерировать запрос на обновление* , *Редактирование*.
Александр, спасибо что обратили мое внимание на датасет!

Дмитрий, понятно. Вчера тоже думал об этих галочках, но не был уверен, что дело именно в них.

function edtContactIDOnPrepareSelectWindow(LookupDataControl, SelectWindow) {

var AccountID = Self.Attributes('ParentItemID');
if (AccountID){
var LookupDataset = LookupDataControl.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset, 'AccountID', AccountID, true); //фильтруем контактов по текущему контрагенту-родителю
LookupDataset.Attributes('DontFilter') = true;
debugger;
}
}


1.Что делает строка: LookupDataset.Attributes('DontFilter') = true; ? Для чего это?
2. Где в дебаггере VS можно посмотреть эти .Attributes ? Допустим, мне налету нужно проанализировать значение: Self.Attributes('ParentItemID')

Это какая-то доработка, в коробке «DontFilter» нигде не упоминается.
В отладчике для этой цели есть окно «Watch».

Получается что в Watch значение поля 'ParentItemID' у Self.Attributes нет ? Где значения всех этих атрибутов?

Здравствуйте, Дмитрий!

Обычно значение аттрибута 'ParentItemID' присваивается при инициализации детали.

Для примера посмотрите как инициализируются детали раздела [Контрагенты].

Инциализация происходит в окне раздела в функции RefreshDetails().

Если мы говорим о разделе [Контрагенты], то в качестве значения атрибута 'ParentItemID' присваивается ID текущей записи контрагента.

"Кудинов Дмитрий Станиславович" написал:Где значения всех этих атрибутов?

Вам нужно самостоятельно в строке окна Watch прописать строчку Self.Attributes('ParentItemID').

Допустим на датасет наложили фильтр:

ApplyDatasetFilter(CampaignDataset, 'CampaignID', CampaignID , true); // apply filter

Можно ли Watch увидеть какое число записей осталось в CampaignDataset после наложения фильтра?
Где это свойство подсмотреть?

Dataset.RecordsCount

Как в цикле получить доступ к каждой записи датасета, чтобы взять значение какого-либо поля?

Например, таким образом:

Dataset.Open();
while (!Dataset.IsEOF) {
var AccountID = Dataset('AccountID');
Dataset.GotoNext();
}
Dataset.Close();

Где можно отключить вывод *названия воздействия* в верхней части карточки редактирования воздействия?

В скрипте scr_BaseDBEditUtils есть функция SetEditWindowCaption, которая его заполняет. Нужно внести доработки, чтобы она в нужном случае ничего не делала. К примеру, в скрипте карточки воздействия на OnPrepare присваивать окну какой-то атрибут, а в этой функции его проверять.

Каким образом можно отключить подчеркивание текста в dgdtLookup колонках. Т.е. чтобы текст оставался Lookup, но без подчеркивания.

Дмитрий,

по этому вопросу открыт другой топик - вот ссылка на него:
http://www.community.terrasoft.ru/forum/topic/25026

"Савельева Алла" написал:по этому вопросу открыт другой топик - вот ссылка на него:
http://www.community.terrasoft.ru/forum/topic/25026


Это я создал новую тему, т.к. Александр справедливо заметил, что данный вопрос к текущей теме не имеет отношения.

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