Доброго дня.
Подскажите пожалуйста, не знаю как решить проблемку:
Делал автоматическую нумерацию задач и возникла необходимость пронумеровать все старые задачи (которые были созданы до автонумерации. Они имеют номер 0)
Если у меня последняя задача с номером 4000, то необходимо пронумеровать старые начиная с 4001+

Надеюсь на Вашу помощь.

Terrasoft XRM 3.3.2.43

Нравится

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

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

Выполните обновление записей в БД. Получите список всех записей в таблице tbl_Task у которых номер равен нулю, затем для каждой полученной записи выполните update.

Также, если текущее значение счётчика хранится в системной настройке, его стоит увеличить на количество перенумерованных задач.

Да, значение счетчика хранится в системной настройке.
А автоматизировать каким-либо образом можно сие действие?

Вам же надо обновить 1 раз.

Можно написать SQL-скрипт и запустить.

Cпасибо большое за помощь

Сделал следующим образом:
alter table [Table_name] drop column 'Colomn_Name'
alter table [Table_name] add 'Colomn_name' int identity

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

Добрый день! Разрабатываем новый функционал с возможностью редактирования древовидного грида.
Подскажите, пожалуйста, почему в древовидном гриде по кнопке Enter на обработчике OnAfterEdit значение DataField.ValueIsChanged == false, какие могут быть варианты? При этом в другом недревовидном гриде в этом же обработчике по Enter все работает и DataField.ValueIsChanged == true.

Нравится

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

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

Это два различных грида и у них различное поведение. Если для простого грида, нажатие на клавишу Enter означает начало редактирования записи (поля), то для древовидного грида, означает завершение редактирования поля.

Может вы знаете, что нам делать c Enter-ом в этой ситуации? - мы не можем правильно его интерпретировать, чтобы значение правильно сохранялось. Возможно ли как-то это поведение по Enter заменить таким же как и в обычном гриде? Или может посоветуете как это нажатие отлавливать и имитировать нажатие, например, стрелки (перемещение курсора), по которой как раз все работает правильно.

Можете более подробно описать "чтобы значение правильно сохранялось". Данные в автоматическом режиме сохраняются.
И зачем, что либо симулировать?

Можете написать более подробно, что хотите сделать.

У нас сохранение в ячейках всегда завязано на условие
DataField.ValueIsChanged == true, хотим сделать сделать что бы true было и по Enter тоже

В событии окна OnKeyDown напишите код:

	if (Key.Value == 13) {
		// было нажатие клавиши Enter
	}

Дальше реализовываете свою логику.

У нас в OnKeyDown нет нужных параметров: DataField.ValueIsChanged
DataField.Value и DataField.OldValue

Не советую к ним привязываться.
Лучше сохраните значение поля в переменную, а затем сравнивайте значения.
В событии OnKeyDown симулируйте поведение ValueIsChanged.

      var Field = {Value = '', ValueIsChanged = false}  
......
 
        if (Key.Value == 13) {
                // было нажатие клавиши Enter
                Field.ValueIsChanged = true;
        }
Показать все комментарии

Делаю Экспорт в 1С из ТС Накладных в Требования-Накладные.
Все нормально экспортируется. Но не могу добавить в продукты в требованиях-накладных значение "Счет учета" Там обычно стоит значение "10.01".

Первоначально импортировал из 1С в ТС "Планы Счетов" (там находится нужный Счет учета). Получил UID1C для значения "10.01".
Далее в OnBeforeRecordExport для продуктов делаю:

// План Счетов
    var PlanUID1C = 'D2F69B00-161D-4128-B15A-57B38560654B';
        var Plan = Param.Obj1C.ПланыСчетов.Хозрасчетный;
        PlanUID1C = Param.Obj1C.NewObject('УникальныйИдентификатор', PlanUID1C.replace('{', '').replace('}', ''));      
        var Plan1C = Plan.GetRef(PlanUID1C);
Select1C.Код = Plan1C;      

Но, на строке
Select1C.Код = Plan1C; выдает ошибку: "Объект не поддерживает это свойство или метод".
Подскажите, как правильно добавить Счет учета?
ТС 3.5.1, 1С 8.3

Нравится

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

Добрый день.

Проверьте существует ли метод Select1C.Код.
Убедитесь, что переменная Plan1C содержит корректное значение для метода Select1C.Код.

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

Здравствуйте.
Добавил в раздел "Задачи" новую колонку, однако при нажатии на элемент этой колонки выдает следующее предупреждение:
"Не удается найти карточку редактирования для выбранного элемента"
Я пытался сравнивать с другими колонками, на различия или может я что то упустил...но исправить так и не удалось.
Подскажите пожалуйста как исправить данную ошибку
Заранее спасибо.

Нравится

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

Возможно, справочник, на который ссылается поле, зарегистрирован неверно и в нём не указана карточка.

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

Доброго дня!
Подскажите пожалуйста, необходимо сделать выборку по групповым задачам.
Начал делать по аналогии с выборкой по "Ответственному"
Добавил Lookup Control, сделал линк на датасет "Группа контактов". Вот только теперь при выборе группы контактов никакие задачи не отображаются. Что я сделал не так? Или может я что то не доделал?
Заранее спасибо

Нравится

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

Добрый день Дмитрий!!!

вы внимательно проанализируйте как происходит Инициализация и фильтрация раздела По контакту и вам все станет ясно. Одним добавлением DatasetLink-om там не обойдешься. Плюс прошу описать какая у вас платформа и конфигурация. Чтобы вам подсказать. Если уже будет сложно разобраться как происходит стандартная фильтрация. Я готов вам по полочкам разложить рассказать как это все работает.

Буду Вам очень благодарен если расскажете

Дмитрий, в скрипте той страницы, куда добавляли лукапное поле, посмотрите, как сделано наложение фильтра по ответственному (из уже существующего поля). Вероятно, Вам надо будет сделать аналогично, написав похожий код для группы. Если уже написали код и при фильтрации исчезли все записи, значит нужно проверять, что не так в наложенном фильтре.

Александр, вот я пытался сделать по аналогии, однако при выборе в поле "Группу ответственных" ничего не происходило.
Буду дальше пытаться :)

Lookup поле работает. Я могу выбрать группу контактов.
Видимо дело в чек боксе. Поскольку после нажатия задачи не фильтруются.

Вот обработчик чек-бокса для фильтрации по "Ответственному"

function chbShowForContactOnClick(Control) {
	if ((!IsEmptyValue(edtTaskOwner.Value) || !Control.IsChecked) && 
		BaseWorkspace.WasShowed && (!TasksWorkspace.NoRefresh)) {
		TasksWorkspace.TaskOwnerIsChanged = true;
		RefreshTasks();
	}
}

Подскажите пожалуйста как мне адаптировать этот код для моего чекбокса (

function chbShowForContactGroupOnClick(Control) {
 
}

Судя по строке:

TasksWorkspace.TaskOwnerIsChanged = true;

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

Как я понял все происходит именно здесь

function ApplyContactFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var Grid = BaseWorkspace.Grid;
	var IsGridPageActive = pcData.ActivePage.Name == pgGridData.Name;
	var MyTasksIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.MyTaskView.Name);	
    var ForControlIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.ForControlView.Name);
	chbShowForContact.IsEnabled = (!MyTasksIsActive);
	edtTaskOwner.IsEnabled = chbShowForContact.IsEnabled;
	fgShowTasksBody.IsEnabled = chbShowForContact.IsEnabled;
	var TaskOwnerID = edtTaskOwner.Value;
	var EmptyContact = IsEmptyGUID(TaskOwnerID) || (!chbShowForContact.IsChecked);
	var IDs = GetContactsFilterArray();
	if ((!IsGridPageActive) && (IDs.length == 0)) {
		if (ShowConfirmationDialog(
			"Действие может занять некоторое время. Продолжить?") != mrYes) {
			TasksWorkspace.NoRefresh = true;
			chbShowForContact.IsChecked = true;
			TasksWorkspace.NoRefresh = false;
			IDs.push(edtTaskOwner.Value);
		}
	}
	var ShowForContact = ((IDs.length > 0) || (!EmptyContact));
	if (EmptyContact) {
		TaskOwnerID = Connector.CurrentUser.ContactID;
	}
	if (IsGridPageActive) {
		SetAttribute(BaseWorkspace.GridWindow, 'OwnerID', TaskOwnerID);
		if (MyTasksIsActive) {
			EnableDatasetFilters(Dataset, true, 'MyTasks');
			return;
		}
		if (ForControlIsActive) {
			EnableDatasetFilters(Dataset, true, 'ForControl');
			if (IDs.length > 1) {
				EnableDatasetFilters(Dataset, false, 'CreatedByID');
				ApplyDatasetIncludeFilter(Dataset, 'CreatedByIDs', IDs, true);
			} else {
				EnableDatasetFilters(Dataset, false, 'CreatedByIDs');
				ApplyDatasetFilter(Dataset, 'CreatedByID', TaskOwnerID,
					ShowForContact);
			}
			SetAttribute(Self, 'ContactsFilterArray', IDs);
			return;
		}
	} else {
		var ScheduleControl = 
			wndSchedulerArea.Window.ComponentsByName('ScheduleControl');
		SetAttribute(TasksWorkspace.SchedulerWindow, 'OwnerID', TaskOwnerID);
		ApplyDatasetFilter(Dataset, 'ShowInScheduler', true, true);   			
	}
	if (ShowForContact) {
		if (IDs.length == 1) {
			SetContactWhite(IDs[0]);
		}
		SetAttribute(Self, 'ContactsFilterArray', IDs);
		BaseFilters = Dataset.SelectQuery.Items(0).Filters.Items(0);
		var Filter = BaseFilters.ItemsByCode('ContactIDs');
		if (!Assigned(Filter)) {
			Filter = BaseFilters.Items(0).ItemsByCode('ContactIDs');
		}
		var Parameters = Dataset.SelectQuery.Parameters;
		var TeamFilter = Filter.ItemsByCode('tcTeam');
		var SubSelectFilter = TeamFilter.TestExpression
			.ExpressionSelectQuery.Items(0).Filters;
		var OwnerIDsFilter = Filter.ItemsByCode('tcOwnerIDs');
		var ContactIDsFilter = Filter.ItemsByCode('tcContactIDs');
		var SubContactIDsFilter = SubSelectFilter.ItemsByCode('tcContactIDs');
		ApplyIncludeFilter(OwnerIDsFilter, IDs, true, null, Parameters);
        ApplyIncludeFilter(ContactIDsFilter, IDs, true, null, Parameters);
        ApplyIncludeFilter(SubContactIDsFilter, IDs, true, null, Parameters);
		TeamFilter.IsEnabled = true;
		Filter.IsEnabled = true;
	}            	
	var IsSchedulerPageActive = (pcData.ActivePage.Name == pgScheduler.Name);
	if (IsSchedulerPageActive) {
		if (TasksWorkspace.TaskOwnerIsChanged) {
			if (ShowForContact) {
				if (TaskOwnerID == Connector.CurrentUser.ContactID) {
					SetTimeZone(ScheduleControl, TaskOwnerID, true);
					ScheduleControl.ShowAdditionalTimeZone = false;
				} else {
					SetTimeZone(ScheduleControl, TaskOwnerID, false);
				}
			} else { 
				ScheduleControl.ShowAdditionalTimeZone = false;
			}
			TasksWorkspace.TaskOwnerIsChanged = false;
		}
	}
}

Осталось понять, что нужно поправлять для моей задачи

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

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

А не подскажете как это сделать? А то я что то не понимать :exclaim:

Создаете свою функцию, в которой будет включаться/отключаться фильтр. Затем вызываете созданную Вами функцию, из функции ApplyTasksWorkspaceFilter.
Пример:

function MyTaskFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var MyFilterName = 'MyFilter';
	var Value = edtMyLookup.Value;
	if (!IsEmptyValue(Value)) {
		ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
	} else {
		EnableDatasetFilters(Dataset, false, MyFilterName);
	}
}
 
function ApplyTasksWorkspaceFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	ApplyStandardWorkspaceFilter(); 
	var Grid = BaseWorkspace.Grid;
	var IsCycleView = (Grid.ActiveView.Name == 'dgvCycleTasks') && 
			!(pcData.ActivePage.Name == pgScheduler.Name)
	EnableDatasetFilters(Dataset, IsCycleView, 'IsCycle');
	if ((chbShowForPeriod.IsChecked) ||
		(pcData.ActivePage.Name == pgScheduler.Name)) {
		var FromDate = 
			TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('From');
		var ToDate = TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('To');
		ApplyTaskDateFilter(Dataset, FromDate, ToDate);
		if (TasksWorkspace.SchedulerWindow == null) {
			TasksWorkspace.SchedulerWindow = wndSchedulerArea.Window;
		}
		SetScheduleAreaTimePeriod(FromDate, ToDate);
	}
	ApplyDatasetGroupIDFilter(BaseWorkspace.GroupsDataset,	Dataset);
	ApplyContactFilter();
 
	MyTaskFilter();
} 
 
......
 
 
function edtMyLookupOnChange(LookupControl) {
	RefreshTasks();
}

Cпасибо огромное!

Сделал фильтр по примеру, теперь при выборе группы ответственных в поле выдает ошибку "Исключение брошено и не поймано"
В чем может быть причина? подскажите пожалуйста

Вам необходимо выполнить пошаговую отладку кода, с помощью Microsoft Script Debugger или Microsoft Visual Studio.

Пример отладки кода приведен в статье.

Если честно, я так и не понял в чем причина ;(
после отладки перенаправляет на эту функцию:

У Вас исключение происходит скорее всего в функции ApplyContactGroupFilter.
Необходимо установить debugger в ApplyContactGroupFilter.

Пример кода:

function MyTaskFilter() {
        debugger;
        var Dataset = BaseWorkspace.GridDataset;
        var MyFilterName = 'MyFilter';
        var Value = edtMyLookup.Value;
        if (!IsEmptyValue(Value)) {
                ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
        } else {
                EnableDatasetFilters(Dataset, false, MyFilterName);
        }
}

После чего отладит код, проверяя каждый объект на содержание значения с провалом в функции (горячая клавиша F11)

Одна задача выполнена, но появилась новая проблема...
После фильтрации, при нажатии на "Группу ответственных" в колонке, выдает ошибку: "Не удается найти карточку редактирования для выбранного элемента". А поскольку помимо фильтрации по групповым задачам необходима фильтрация по каждому ответственному, который входит в эту группу, хочу спросить как можно ли реализовать открытие карточки "Группа ответственных"?
(По такому принципу: отфильтровал по группе, посмотрел кто входит в группу, отфильтровал по ответственному №1, №2...)

Если пройдетесь по коду конфигурации, то сможете найти как это реализовано для других колонок.
Советую обратить внимание на источник данных (Dataset) раздела, а также использовать Microsoft Visual Studio для изучения алгоритма работы приложения.

А не подскажете какие изменения нужно добавить в фильтре, если мне необходимо отобразить задачи не только пользователя, но также задачи всех групп, в которые входит этот пользователь?
Или это вообще не в фильтре нужно делать?

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

Добрый день, подскажите пожалуйста...
Если при создании задачи выбираю группу ответственных, во вкладке "Все задачи" группа не отображается.
Как это можно исправить?
Заранее спасибо

Нравится

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

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

Если это поле в карточке редактирования задачи, тогда нужно проверить есть ли оно в списке скрытых колонок. Если в списке скрытых колонок его нет, тогда Вы можете добавить его в грид задачи в TSAdmin.

Если это поле не в карточке редактирования задачи, тогда уточните, пожалуйста, где Вы выбираете группу ответственных(покажите скриншот).

Выбираю в карточке редактирования. А где я могу посмотреть список скрытых колонок?

В правом вехнем углу грида есть плюсик, нажимаете на него и у Вас отображается список скрытых колонок.

Спасибо, удалось добавить колонку.
В моем случае, в карточке редактирования задачи, если выбирается поле "Ответственный" , то поле "Группа ответственных" становится недоступным и наоборот.
Хотелось бы чтобы все отображалось в одной колонке (выбрал ответственного, в гриде в колонке "Ответственный" отобразился ответственный. Выбрал группу ответственных, в гриде в колонке "Ответственный" отобразилась группа ответственных), можно ли это реализовать?

Дмитрий, можно добавить (в tbl, sq, ds и страницу реестра) третью колонку, текстовую.
И при изменении ответственного или группы заполнять это поле нужным названием или именем.
Логику заполнения можно реализовать как на триггере, так и на датасете или карточке.

Ещё вариант реализации — добавить в сервис sq колонку типа Custom SQL, где будет кусок SQL-кода, получающий то или другое значение при помощи оператора CASE. Затем добавить такую же колонку в ds и страницу реестра. Но тут нужно проверять, будет ли такое работать корректно, поскольку у этих полей есть свои ограничения, может не работать фильтрация.

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

Здравствуйте, подскажите пожалуйста
Имеется поле "Фактическое время" (после выполнения задачи считает сколько часов было потрачено на задачу). Поле является "Text Data Control"
И имеется drop-down список с коэффициентом (от 0.1 до 2.0)
Мне необходимо при выборе коэффициента реализовать автоматическое умножение этого коэффициента на "Фактическое время" и результат занести в поле "Количество часов".

Надеюсь на вашу помощь. Заранее спасибо

Нравится

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

Добрый день Дмитрий!!!

ну я думаю подход у вас должен быть очень простым. Получаем текущее затраченное время, я думаю вы его уже знаете. Переводим полученное время в Минуты, в Секунды, в Миллисекунды, в ту единицу измерения в которой вам будет удобно считать. После конвертации из вида Часы.Минуты.Секунды к примеру в Секунды, умножаем полученный результат на выбранный Коэффициент и полученный результат конвертируем обратно к виду Часы.Минуты.Секунды.

Спасибо за помощь, а то, что поле с затраченным временем является "Text Data control" это ничего страшного? :)

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

можете привести пример окна (принскрин окна в Terrasoft, а также принскрин окна в Администраторе).
Также укажите тип drop-down компонента и компонентов которые будут задействованы в операции по вычислению "Количества часов".

drop-down сделал через enm

Уточните, какой именно Enum:

  • EnumDataControl
  • EnumControl

Прошу прощения, не так понял Вас
EnumDataControl

В датасете (dlData) окна на события dlDataOnDatasetDataChange пишите код:

var DataFieldName = DataField.Name;
if (DataFieldName == 'Имя Вашего поля в компоненте EnumDataControl') {
	var Val = преобразовываете значение поля [Фактическое время] в цифровое значение;
	var Res = Val * (1 * DataField.ValAsEnumItem.Code);
	[Количество часов] = Res;
}

Где-то приблизительно должен получиться такой код, при условии, что Enum такого вида:

Павел, спасибо большое за помощь! Сейчас попробую

Павел, а может быть Вы мне еще подскажете принцип вычитания 2-ух дат?
Или где это можно подсмотреть :)

Посмотрите на сайтах:

В итоге получилось так:

//Коэффициент занятости
case ('CoefficientID'):
	if (DataFieldName == 'CoefficientID') {
	var theDateStart = new Date(Date.parse(Dataset.ValAsDateTime('ActualStartDate')));
    	var theDateFinish = new Date(Date.parse(Dataset.ValAsDateTime('ActualFinishDate')));
 
        var oneHour=1000*60*60;
	var Val = ((theDateFinish - theDateStart) / oneHour);
 
        var Res = (Val * (1 * DataField.ValAsEnumItem.Code));
    	Res = Res.toFixed(2);
	Dataset.Values('RealHours') = Res;
 
        }		
break;	 

У Вас лишний if, его можно убрать, т.к. case как раз выполняет роль if. Получилась лишняя проверка.

Ой, спасибо. Сейчас уберем :wink:

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

Ув. Форумчане, подскажите пожалуйста как реализовать автоматическую подпись в описание задачи по аналогии (рис.1)
вот сюда: (рис. 2)
Заранее спасибо :smile:

Нравится

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

Добрый день Дмитрий!!!

подсмотрите в схему "wnd_DescriptionScript" именно там описан функционал для детали "Описание" любого раздела. Сама деталь называется "wnd_Description"

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

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

function CopyRight(RecordID, NewRecordID) {

//      debugger;

        var Dataset = Services.GetNewItemByUSI('ds_Cashflow');
        ApplyDatasetIDFilter(Dataset, NewRecordID, true);
        Dataset.Open();
        Dataset.GotoFirst();
                                                         
               
var DoumentsRightsDataset = Services.GetNewItemByUSI('ds_CashflowRight');
                ApplyDatasetFilter(DoumentsRightsDataset, 'RecordID', Dataset.Values('ID'), true);
               
                DoumentsRightsDataset.Open();
                DoumentsRightsDataset.GotoFirst();
                while(!DoumentsRightsDataset.IsEOF)
                {
                        DoumentsRightsDataset.Delete();
                }
               
                DoumentsRightsDataset.Close();
                                           
                var CanRead = true;
                var CanWrite = true;
                var CanDelete = true;
                var CanChangeAccess = true;
                                                           
ProcessGiveRecordRightsToContact(Dataset, Connector.CurrentUser.ContactID, CanRead, CanWrite, CanDelete, CanChangeAccess);                                                         
                                                           
        Dataset.Close();  
          }

Предполагаю, что удаление прав может быть лишним. Надеюсь на помощь профессионалов.

Нравится

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

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

Ниже замечания по реализованной Вами функции.

1. Вам не нужен датасет ds_Cashflow. Вы же в функцию уже передаете ID записи, откуда хотите копировать права (RecordID), и ID записи, куда хотите копировать (NewRecordID).
2. Перед открытием датасета ds_CashflowRight для установки фильтра используйте переменную RecordID:
ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
3. Вам нужен ещё один экземпляр датасета ds_CashflowRight, куда Вы будете добавлять нужные записи. Например, назовем его NewCashflowRightDataset.
var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
4. Удалять записи из CashflowRightsDataset, действительно, не нужно.
5. В цикле while нужно реализовать такой код:
NewCashflowRightDataset.Append();
NewCashflowRightDataset('ID') = Connector.GenGUID();
NewCashflowRightDataset('RecordID') = NewRecordID;
NewCashflowRightDataset('CanRead') = DocumentRightsDataset('CanRead');
NewCashflowRightDataset('CanWrite') = DocumentRightsDataset('CanWrite');
NewCashflowRightDataset('CanDelete') = DocumentRightsDataset('CanDelete');
NewCashflowRightDataset('CanChangeAccess') = DocumentRightsDataset('CanChangeAccess');
NewCashflowRightDataset.Post();
DocumentRightsDataset.GotoNext();
6. То, что ниже while не нужно. После цикла нужно закрыть оба датасета.

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

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

Копирование прав работает, но есть маленький нюанс:

Не подскажете как исправить? :)

Нужно в код, где Вы копируете права добавить ещё такую строчку:

NewCashflowRightDataset('AdminUnitID') = DocumentRightsDataset('AdminUnitID');

Cпасибо! Все работает.

А не подскажете еще каким способом можно удалить пользователей по умолчанию. Поскольку они добавляются после копирования.

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

Реализовал след. образом:

function CopyRight(RecordID, NewRecordID) {
 
//debugger;
 
 
	var CashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
	var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(NewCashflowRightDataset, 'RecordID', NewRecordID, true);           
	NewCashflowRightDataset.Open();
	NewCashflowRightDataset.GotoFirst();
	//Чистим датасет от прав по умолчанию
                while(!NewCashflowRightDataset.IsEOF)
                {
                        NewCashflowRightDataset.Delete();
                }
    NewCashflowRightDataset.Close();
    NewCashflowRightDataset.Open();
	CashflowRightDataset.Open();
	CashflowRightDataset.GotoFirst();
	while(!CashflowRightDataset.IsEOF)
	{
		NewCashflowRightDataset.Append();
		NewCashflowRightDataset('ID') = Connector.GenGUID();
		NewCashflowRightDataset('RecordID') = NewRecordID;
		NewCashflowRightDataset('CanRead') = CashflowRightDataset('CanRead');
		NewCashflowRightDataset('CanWrite') = CashflowRightDataset('CanWrite');
		NewCashflowRightDataset('CanDelete') = CashflowRightDataset('CanDelete');
		NewCashflowRightDataset('CanChangeAccess') = CashflowRightDataset('CanChangeAccess');
		NewCashflowRightDataset('AdminUnitID') = CashflowRightDataset('AdminUnitID');
		NewCashflowRightDataset.Post();
		CashflowRightDataset.GotoNext();
	}
	CashflowRightDataset.Close();
	NewCashflowRightDataset.Close();
}

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

В Вашем коде есть ошибка.

Чтобы удалить все записи нужно после NewCashflowRightDataset.Delete(); выполнить NewCashflowRightDataset.GotoNext().

И ещё после цикла, где идет удаление закрывать не нужно. Эта строка лишняя:
NewCashflowRightDataset.Close();

Спасибо, сейчас подправлю :)

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

Здравствуйте! Подскажите пожалуйста, как можно увидеть SQL-запрос при выполнении

ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled);

т.е. не данные о запросе, как например

?SelectQuery
{...}
Caption: "sq_RMCGrid"
CoClassGUID: "{2E5AFA6A-F672-4BAA-891C-6E699C6D36E3}"
Columns: {...}
Connector: {...}
Description: ""

а сам запрос, чтобы работать с этим запросом в Microsoft SQL-редакторе.

Спасибо большое!!!

Нравится

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