Нужно использовать библиотеку Cryptography, нашел следущее:
new ActiveXObject("System.Security.Cryptography.MD5CryptoServiceProvider");
мд5 одна из нужных мне шифровок. но при выполнении этого кода вываливается это:

Я скачал, установил, но ошибка не пропала, где и как мне заполучить эту библиотеку?

Нравится

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

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

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

Укажите пожалуйста, какую версию Terrasoft используете, а также версию операционной системы.

Пробовал на двух серверах
1. 340120, бизнес 2011
2. 341127, 2012 R2 Datacenter
На обоих такая вот ошибка

Если просто нужно получить MD5, можно написать SQL-скрипт на уровне БД, использовать функцию HashBytes.

Ооо... Вы мне Америку открыли, даже не знал что такое есть в СКЛ, щас буду кодить:biggrin:

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

Доброго дня!
Подскажите пожалуйста, необходимо сделать выборку по групповым задачам.
Начал делать по аналогии с выборкой по "Ответственному"
Добавил 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 для изучения алгоритма работы приложения.

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

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

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

Помогите пожалуйста разобраться:

В запросе добавила параметр CreditTypeID и фильтр с тем же именем (рис. sq)
Передала значение параметру CreditTypeID (рис. sq_Parametr)
Присвоила филтру значение параметра (рис. sq_Where)
Сохранила запрос и посмотрела в Preview (рис. sq_Preview)
На рисунке видно условие where. Но когда работает запрос, в профайлере нет условия where(рис. Profiler), и данные не фильтруются.

Спасибо.

Нравится

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

Добрый день Марина!!!

вопрос. В базе данных  CreditTypeID.Type какой имеет тип? Так как называете вы параметр CreditTypeID, по логике данный параметр должен иметь тип  uniqueidentifier , а в вашем случае данный параметр имеет Числовой тип. Это не ошибка?

Не ошибка, имена параметра и условия неудачно написала, в базе данных CreditDetails.Type типа int.

Версия программы 3.2.0.90

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

function RefreshWorkspace() {

var GridDataset = BaseWorkspace.GridDataset;
if (!GridDataset) {
return;
}
try {
GridDataset.Close();
GridDataset.Open(); // здесь profiler захватывает запрос(без фильтра)

Попробовала так:
написала в скрипте грида, который должен фильтроваться

function dlDataOnDatasetBeforeOpen(Dataset, DoOpen)
{
ApplyDatasetFilter(Dataset, 'CreditDetailType', 52, true);
}

но фильтр все еще не работает

после моей фильтрации работает следующая функция написанная в scr_ContactCreditWorkspace

function dlContactCreditOnDatasetBeforeOpen(Dataset) {
var IsInSingleRowMode = GetIsInSingleRowMode();
if (IsInSingleRowMode != true) {
ApplyStandardWorkspaceFilter();
}
}

и грид не фильтруется. Но если писать мой фильтр прямо в этой функции, после ApplyStandardWorkspaceFilter()

function dlContactCreditOnDatasetBeforeOpen(Dataset) {
var IsInSingleRowMode = GetIsInSingleRowMode();
if (IsInSingleRowMode != true) {
ApplyStandardWorkspaceFilter();
ApplyDatasetFilter(Dataset, 'CreditDetailType', 52, true);
}
}
то работает.

Вопрос, можно ли так писать?

Добрый день Марина!!!

да так можно включать преднастроенные фильтры в SQL запросе. Молодцы что разобрались сами.

Спасибо Михаил.

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

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

Нравится

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

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

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

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

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

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

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

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

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

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

Добрый день!
Подскажите, необходимо сделать импорт в BPM через excel, по стандарту они идут на русском языке,есть ли возможность настроить на en.
Экспорт происходит посредством API.

Нравится

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

Пожалуйста, уточните версию продукта.

версия 7.8,пробывали импортировать посредством API но отказались от этой идеи
здорово если можно было настроить заголовки столбцов на en

Добрый день Илья!!!

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

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

Илья а кто мешает вам после получения данных и сохранения в Эксель формате, открыть Эксель и переименовать столбцы. Вы же данную процедуру если и выполняете то не каждый день, а если данная процедура выполняется у вас каждый день, и формат к примеру файла у вас одинаковый, и вы не желаете пользоваться стандартным методом Импорта данных, то я бы рекомендовал создать Модальное окно + Бизнес-процесс в котором бы у вас выполнялся Импорт. Процедура импорта описывается в бизнес-процессе на языке C#.

Но лучше конечно использовать стандартный импорт, разработанный командой Террасофт.

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

Доброго времени суток!

При создании поля, не был добавлен пункт "Отслеживать изменения". Поле заполнялось, а когда понадобилось отслеживать изменения не удается добавить в datagrid данное поле. В таблице (tbl_TestLog) данное поле есть и изменения записываются, но в datagrid не отображаются. Подскажите что делать?

Проделывал все несколько раз и из клиента и из ts admin, снимал и устанавливал признак "Отслеживать изменения". Так же из таблицы tbl_TestLog удалял данное поля и проделывал вышеперечисленные действия, но результат нулевой.

Версия продукта 3.3.2

Заранее спасибо.

Нравится

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

Здравствуйте, Евгений!

1. Уточните, пожалуйста, где Вы смотрите, что не был добавлен пункт [Отслеживать изменения]?
2. Каким образом Вы создавали поле?
3. Полное название Вашей версии (после 3.3.2 ещё есть цифры).
4. Продемонстрируйте проблему с помощью скриншотов.

Добрый день Евгений!!!

в разделе "Журнал изменений БД" есть действие (Вызывается из меню "Действия") - "Настройка журнала изменений БД". Нажав на данное действие открывается окно:

Нажав в данном окне "Добавить" и выбрав требуемую таблицу. Появляется окно:

В появившемся окне "Добавление таблицы" - отмечаем галочками по каким полям "Отслеживать изменения", а какие поля "Отображать в реестре". Вот как раз галочка "Отображать в реестре" и говорит о том, что вы увидите данное поле в Гриде "Журнал изменений БД". Так как можно вести отслеживание изменения по 10 полям, а видеть я хочу для анализа только 5 полей в реестре.

Версия 3.3.2.311.

Поле добавлял с помощью Terrasoft Administrator, а после заполнения поля данными, поставил пункт "Отслеживать изменения" в Terrasoft Administrator.

Пункта "Отображать в реестре"(скриншот 2) нету.

Стоит только переименовать поле, в Журнале изменений сразу же появляется.

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

к сожалению скриншота нет, чтобы понять о чем идет речь.
Рекомендую ознакомиться с документацией по настройке логирования изменений, смт. на странице 147, глава [Логирование изменений].

Первые три скриншота это пример того как не отображается.

Последние три скриншота, это после изменения названия поля в таблице контактов.

Для устранения этой проблемы необходимо в функции BuildChangesLogWindow сервиса scr_DatabaseLogUtils заменить код

			if ((TableField.SQLName.search(/ID$/ig) > -1) &&
				(TableField.SQLDataType != sdtEnum)) {	// Enums accepted
				continue;
			}

на

			if (((TableField.SQLDataType == sdtGUID) ||
				(TableField.SQLDataType == sdtIdentity)) &&
				(TableField.SQLDataType != sdtEnum)) {  // Enums accepted
				continue;
			}

Павел, спасибо огромное, вы меня спасли

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

Здравствуйте, подскажите пожалуйста
Имеется поле "Фактическое время" (после выполнения задачи считает сколько часов было потрачено на задачу). Поле является "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"

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

Здравствуйте.
Подскажите пожалуйста, есть ли документация (help), где описано какое событие окна или датасета за что отвечает и когда вызывается, последовательность их выполнения ?

Например, function dlDataOnDatasetBeforePost(Dataset, DoPost) работает когда нажимаю на кнопку "OK" документа.

Спасибо.

Нравится

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

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

Да есть, ссылка для ознакомления с событиями Dataset.

dlDataOnDatasetBeforePost - срабатывает не только в момент нажатия на кнопку [Ok], а перед попыткой отправить данные в базу для ее последующей вставки в таблицу,в момент вызова метода из кода:

Dataset.Post();

что на самом деле и происходит в момент нажатия на кнопку.

Если по какой либо причине, необходимо отменить событие post, то в событии dlDataOnDatasetBeforePost необходимо написать код:

DoPost.Value = false;

Здравствуйте Павел. Спасибо !

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

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

Нравится

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

Первое, что пришло в голову - для пользователей поле TextEdit вместо старого (или что там у вас, без привязки к датасету) на карточке, по ОК чтение содержимого поля, вызов хранимой процедуры (сначала предложил функцию, но возвращать нечего наверное ей:)) с параметрами (RecordID, EditValue) на сервере, которая пишет от имени db_owner что надо и куда надо.
Плюс понятное дело заполнение поля на событии onPrepare окна

Либо сделайте действие в контекстное меню грида с подъемом диалогового окна с одним единственным полем для ввода значения, а далее аналогично

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

"Радчук Виталий Владимирович" написал:по дебагеру прошелся записало и сохранило

правильно, на уровне сервисов TS как бы сохраняется, но у пользователя не прав на запись на уровне сервера в таблицу, вот это надо и обходить - процедурой, где запрос выполняется от другого имени

что то типа такого в коде
CREATE PROCEDURE [dbo].[tsp_NevermindRightsManagement]
WITH EXECUTE AS 'dbo'

не забудьте права пользователям на выполнение процедуры дать

Все получилось, спасибо

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