Проблема при создании карточки редактирования детали

Здравствуйте,

Столкнулся с проблемой при создании карточки редактирования детали.
Грид в окошке деталей все изображает правильно. После нажатия на "Изменить" карточка заполняется правильно. Все чекбоксы проставлены как следует. Нажимаю на любой чекбокс - программа вылетает. Причину вроде бы нашел - Dataset not in edit or insert mode. Попробовал сделать то, что мне нужно вручную. Поставил точку останова, в окне Immediate стал вводить команды и получил то же самое.

var TSOTDataset = Services.GetNewItemByUSI('ds_TSOTasks');

var Filters = TSOTDataset.SelectQuery.Items(0).Filters;

var Parameters = TSOTDataset.SelectQuery.Parameters;

Filters.ItemsByCode('ID').IsEnabled = true;

ApplyDatasetFilter(TSOTDataset, 'ID', '6CA45774-34EB-4A9F-BFE7-2E7DFE471653', true);

TSOTDataset.Open();

TSOTDataset.Edit();

TSOTDataset.Values('Weak') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('OP') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Season') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Relief') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Diary') = 0;
Dataset not in edit or insert mode
TSOTDataset.State = 2

Попробовал поменять TSOTDataset.State, она вроде связана с edit or insert mode
Но ничего не получилось. Напрашивается мысль, что не сделал какую-то установку. Но есть одна деталь. До того, как добавил в карточку LookupDataControl, связанный с tbi_Department, редактирование работало. Как из этой ситуации выбраться?

Нравится

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

Добрый день!
TSOTDataset.State - не редактируемое свойство. Для того чтобы перевести датасет в редактируемое состояние нужно вызвать метод его объекта: Dataset.Edit() - это состояние соответствуею системной константе dstEdit. Перед этим он должен быть открыт: Dataset.Open() - dstBrowse.

Все возможные состояния перечислены в scr_SysEnums:

// Constants for enum _DatasetStateEnum
dstInactive = 0x00000000;
dstBrowse = 0x00000001;
dstEdit = 0x00000002;
dstInsert = 0x00000003;
dstCalcFields = 0x00000004;

По ошибке, которая возникают у Вас могут понадобится сервисы детали и радела.
Нужно проверить как инициализируется деталь в wnd_ContactWorkspaceScript, и что в скрипте грида детали. Для примера посмотрите, пожалуйста, как организована деталь "Отрасль контрагента".

Добрый день,

Попробовал сделать как в "Отрасль контрагента". Та же ошибка, что и раньше - Terrasoft has stopped working. Close the program. services.zip
В прикрепленном файле сервисы, сделал совсем просто - 1 поле, и фильтры в запросе упростил. Но все-равно та же ошибка. Похоже, что в dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost программа не попадает.

Посмотрела сервисы. Рекомендую изменить функции инициализации и обновления детали таким образом:

function InitializeContactAttempt4Detail() {
 ContactsWorkspace.ContactAttempt4Window = wndAttempt4Detail.Window;
 SetAttribute(ContactsWorkspace.ContactAttempt4Window,'DatasetUSI','ds_Attempt4');
 SetAttribute(ContactsWorkspace.ContactAttempt4Window,'EditWindowUSI', 'wnd_Attempt4Edit'); 
//добавлена строка
 SetAttribute(ContactsWorkspace.ContactAttempt4Window, 'ParentItemFieldName', 'ContactID');
//
  var DetailWindow = ContactsWorkspace.ContactAttempt4Window;
  DetailWindow.Prepare();
  ContactsWorkspace.ContactAttempt4Dataset = DetailWindow.ComponentsByName('dlData').Dataset;
}
 
function RefreshContactAttempt4Detail() { 
 if (ContactsWorkspace.InitializeDocumentsFlag !=true ) {
     InitializeContactAttempt4Detail();
     ContactsWorkspace.InitializeDocumentsFlag = true;
        }
        //ContactsWorkspace.ContactAttempt4Dataset.Open();
//добавлен блок кода
 var ContactID = BaseWorkspace.GridDataset.ValAsGUID('ID');
 SetAttribute(ContactsWorkspace.ContactAttempt4Window, 'ParentItemID', ContactID);
 RefreshDetailData(BaseWorkspace.GridDataset, 'ID', ContactsWorkspace.ContactAttempt4Dataset, 'ContactID');  
//		           
}

Обратите внимание, у Вас в функции ActualizeTSO скрипта scr_Attempt4Edit применяется фильтр:

ApplyDatasetFilter(TSODataset, 'IsDiary', 1, true);

Но фильтра с названием IsDiary в запросе sq_Attempt4 нет.

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