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

Столкнулся с проблемой при создании карточки редактирования детали.
Грид в окошке деталей все изображает правильно. После нажатия на "Изменить" карточка заполняется правильно. Все чекбоксы проставлены как следует. Нажимаю на любой чекбокс - программа вылетает. Причину вроде бы нашел - 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 нет.

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

Полезным оказался нескольким пользователям функционал радеатирования записи детали по, скажем, контрагенту, из его карточки редактирования. Реализация не сложная, много времни не заберет ;)

Покажу на примере карточки контрагента, и Детали[Платежные реквизиты].
Предположим, в карточке контрагента нужно иметь выбрать одну из записей датели с платежными реквизитами.

Начнем с сервисов раздела контрагенты:

  1. Запускаем Terrasoft Administrator, неходим и открываем в нем сервис Accounts\General\Main Grid\tbl_Account
  2. Добавляем в него новое поле типа GUID, AccountINNID2_tbl_account_1.png
  3. Добавляем связь по вторичному ключу для этого поля (Relation)
    3_tbl_account_1.png
    3_tbl_account_2.png
    Сохраняем сервис tbl_Account с обновлением структуры таблицы в БД.
  4. Находим и открываем сервис Accounts\General\Main Grid\sq_Account, добавьте в него выборку поля AccountINNID
    4_sq_account_1.png
  5. После того как в выборку будет добавленно поле AccountINNID в Select, привязываем к ней через Join таблицу tbl_AccountBillingInfo
    5_sq_account_1.png
    Настраиваем привязку по полям tbl_AccountBillingInfo.ID = tbl_Account.AccountINNID
    5_sq_account_2.png
  6. Затем добавляем в Select выборку поля INN из таблицы tbl_AccountBillingInfo и задаем ему псевдоним (Alias) = AccountINN
    6_sq_account_1.png
  7. Теперь можно добавить поле AccountINNID справочного типа LookupDataField в Датасет Accounts\General\Main Grid\ds_Account, связав его с датасетом ds_AccountBillingInfo, и указав поле для отображения AccountINN
    7_sq_account_1.png
  8. Открываем сервис карточки редактирования контрагента, wnd_AccountEdit, добавьте в него поле типа LookupDataControl связав его с полем AccountINNID датасета
    8_wnd_account_1.png
  9. Для этого же поля, перейдя на закладку События задаем обработчик события OnPrepareSelectWindow:
    9_wnd_account_1.png
    В тело обработчика вставляем код:
    function edtAccountINNOnPrepareSelectWindow(LookupDataControl, SelectWindow) {

        var LookupDataset = LookupDataControl.DataField.LookupDataset;
        ApplyDatasetFilter(LookupDataset, 'AccountID', dlData.Dataset('ID'), true);

        SelectWindow.Attributes('DisplayFieldNames') = 'Name;INN';
        SelectWindow.Attributes('SearchFieldNames') = 'INN';
        SelectWindow.Attributes('KeyFieldName') = 'ID';
        SelectWindow.Attributes('KeyValue') = null;
        SelectWindow.Attributes('SearchFieldName') = 'INN';

        var DefaultValues = GetNewDictionary();
        DefaultValues.Add('AccountID', dlData.Dataset('ID'));
        DefaultValues.Add('INN', null);
        SelectWindow.Attributes('DefaultValues') = DefaultValues;
        LookupDataset.Attributes('EditWindowUSI') = 'wnd_AccountBillingInfoEdit';

    }
  10. При необходимости вывести поле Account INN в реестр контрагентов, включите его в сервисе wnd_AccountGridArea
    13_wnd_account_1.png

После того как все вышеописанное будет проделано, сохранено и перезагружено клиентское приложение, в карточке контрагента, появится lookup контрол, позволяющий выбирать, устанавливать, управлять платежными реквизитами контрагента прямо из его карточки редактирования.
14_result_1.png
14_result_2.png
14_result_3.png
14_result_4.png
В случае необходимости сделать поле INN обязательным для всех типов реквизитов, отвяжите его в настройках пользовательских полей от всех типов записей:
Файл :: Настройки :: Пользовательские поля:
14_result_5.png
И добавьте его вручную на форму редактирования платежных реквизитов в сервисе Accounts\Details\Billing Information\wnd_AccountBillingInfoEdit как строковое.
14_result_6.png

Нравится

Поделиться

1 комментарий

Спасибо, Павел !!! побольше бы таких уроков ! Супер!

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