Добрый день!
Террасофт 3.3.2 MSSQL
Стоит задача выгрузки накладной (шапки и табличной части продуктов) в формат xml

Подскажите, пожалуйста, какие методы для этого существуют.
Может быть есть какие-то примеры.

Нравится

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

Добрый день!
Маленький пример по сохранению данных в формат XML

function SaveXMLToFile() {
	var Dataset = Services.GetNewItemByUSI('ds_Account');
	Dataset.Open();
	var XMLStorage = GetNewXMLStorage();
	XMLStorage.LoadFromDataset(Dataset, 'QueryData');
	XMLStorage.SaveToFile('c:\\qq.xml');
	Dataset.Close();
}

Еще можно посмотреть примеры работой с XML в сервисе wnd_CalendarExchangeScript, начиная с функции SaveCalendarToFile

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

Настроил запрос для шаблона сообщения для отправки уведомления по e-mail.

Запрос - Счет-Продукты в Счете.

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

Пробовал разные варианты формата макросов для отображения данных Детали, но Деталь в письме так и не отображается (Продукты в Счете). Хотя как видно на скриншоте в запросе все отображается. Что некорректно?

Нравится

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

Та же проблема, обошли костылем

Так ведь шаблоны можно редактировать не вручную, а по вкладке Add-Ins в редакторе письма. Если в Аутлуке включена интеграция с Террасофтом, там есть кнопки "Макросы" и "Детали".

У меня при попытке сгенерировать макрос для детали в ячейку таблицы написало:

<#Контакты в задаче.Номер>

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

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

Добрый день!
Появилась необходимость сделать кликабельную ссылку в карточке Продажи (Террасофт 3.4.0.48.).
Создала поле, в которое пользователь вводит ссылку. К этому полю прикрепила кнопку, по нажатию на которое выполняется действие amiOpenLink. Обра

function amiOpenLinkOnExecute(ActionMenuItem, Sender) {
var URLName = dlData.Dataset.Values('TenderTarget');
URLName = (URLName != null) ? URLName : '';

 var browser = new ActiveXObject("InternetExplorer.Application");
    browser.Navigate(URLName);
    browser.Visible = true;    
}

Этот вариант решения работает хорошо, но я бы хотела открывать не строго в InternetExplorer, а в браузере по умолчанию. В Мозиле или в хроме, например. Если ссылка прикрепляется как файл, то именно это и происходит. Однако, выцепить коды какими именно открывается браузер по умолчанию у меня не получилось. Нашла на форуме строку:

 var browser = new ActiveXObject("Shell.Explorer.2");

Но она не срабатывает и выдает ошибку.

Нравится

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

используйте

System.OpenFile(URL, 1);

система сама разберется, что это URL, а не FilePath и откроет браузер по-умолчанию

"Андросов Дмитрий" написал:
System.OpenFile(URL, 1);

Спасибо! Не срабатывал этот вариант оттого, что писала для проверки в поле yandex.ru, а ссылку нужно было писать http:\yandex.ru или www.yandex.ru.

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

Поставлена следующая задача:

Карточка Аудит деталь Объекты (в текущем элементе) поле
В зависимости от Тип объекта:
- поле Контрагент, если выбран тип объект проверки Контрагент;
- поле Подразделение, если выбран тип объекта проверки Подразделение;
- поле Объект-процесс, если выбран тип объекта проверки Процесс
Первой выводим запись с «Текущее»=Истина

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

Нравится

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

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

Возникла хотелка сохранять файлы из соответствующей детали не поштучно, а кучей - все выделенные. Вариант https://community.terrasoft.ru/forum/topic/7719 не помог, видимо из-за разницы в платформах.
Как правильно реализовать на ServiceDesk 3.х?

Нравится

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

Должно работать на SD 3.x.
Почему у вас не получилось? Какие то ошибки? Предоставьте, пожалуйста, более подробную информацию.

Никаких ошибок, но и действий никаких не происходит. Оно должно отработать на Файлы - Операции - Сохранить в файл?

По идее да. Но нужно выделить через Ctrl несколько файлов на детали. Если будет выделен один - один и сохранится.

Выяснил, что не проходит проверка
if (Dat('ItemTypeID') != ft_File) {
continue;
}
и оно улетает на следующий круг цикла

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

Dat('ItemTypeID')

при сохранении именно файла, и если это значение не совпадает с ft_File - замените.

Не пойму, как заполучить Dat('ItemTypeID'). Инструкция Log.Write(1, Dat('ItemTypeID')) падает на ошибке типов

Какой у вас отладчик стоит?

Боюсь, что никакого, потому и ковыряю через запись в лог :-) Или что-то подтянулось при установке ServiceDesk, но не знаю как это запустить.

Есть возможность поставить Visual Studio? Думаю, все ровно пригодится, если будете дорабатывать конфигурацию в будущем.

Если поставите, то перед строкой
if (Dat('ItemTypeID') != ft_File) {

наберите

debugger;

и посмотрите что же все таки в Dat('ItemTypeID').

пс: перед этим не забудьте включить в реестре отладчик:

HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings

JitDebug = 1

переустановил SreviceDesk с предлагаемыми дебаггерами. Теперь на точке "debugger;" открывается microsoft script debugger. Как в нём значение переменной посмотреть?

Здравствуйте.
Посмотрите, пожалуйста, рекомендации по использованию "debugger", перейдя по ссылке: file:///C:/Windows/help/debug/SDbug.htm

Александр, спасибо за подсказку!
Dat('ItemTypeID')=null после Dat.Open()!
Почему? IDs[i] не пуст и вполне реальный.

Андрей, Dataset.RecordsCount возвращает 1?
Если да - значит либо колонка как-то по другому называется, либо действительно у вас в колонке "Тип файла" пусто. Может вы их как-то нестандартно заливали?

пс: чтобы наверняка, выполните SELECT на сервере.

Что-то вроде (покажет все файлы для контрагента горсовет)

SELECT ItemTypeID from tbl_Files
where FileID in (select FileID from tbl_FileInAccount where AccountID in (select ID from tbl_Account where Name = 'ОАО Горсовет'))

А null там потому, что Dat открывается пустым. А пустой он потому, что в sq_FileInItem есть связка
INNER JOIN
[dbo].[tbl_FileInAccount] AS [FileInItem] ON [FileInItem].[FileID] = [tbl_Files].[ID]
На каком-то этапе [dbo].[tbl_FileInAccount] должно было подмениться на [dbo].[tbl_FileInIncident]?
Собственно, по тексту заменил
var Dat = Services.GetNewItemByUSI('ds_FileInItem');
на
var Dat = Services.GetNewItemByUSI('ds_FileInIncident');
И счастье получил. Но ведь это не правильно. При сохранении файлов из задачи или ещё откуда-то косяк будет.

Андрей, в более новых версиях уже есть массовое сохранение. Вот коробочная функция:

function SaveToFile(){
	var Dataset = FilesDetailGridArea.Dataset;
	var SelectedIDs = grdData.SelectedIDs;
	if (SelectedIDs.Count == 0) {
		return;
	}
	var Message;
	var InitialDir = EmptyStr;
	var FileName = System.CreateObject('TSObjectLibrary.Value');
	if (SelectedIDs.Count > 1) {
		var WindowCaption = "Сохранить файлы";
		var DirectoryName = System.CreateObject('TSObjectLibrary.Value');
		if (!(System.SelectDirectory(WindowCaption, InitialDir, 
			DirectoryName))) {
			return;	
		}
		var SavedFilesCount = 0;
		Dataset.DisableEvents();
		for (var i = 0; i < SelectedIDs.Count; i++) {
			var RecordID = SelectedIDs(i);
			Dataset.Locate('ID', RecordID);
			var FileType = GetFieldValueFromDisabledField(Dataset, 'ItemTypeID');
			FileName.Value =
				GetFieldValueFromDisabledField(Dataset, 'Link');
			if (!SaveToFileByFileType(Dataset, RecordID, FileName, 
				DirectoryName.Value, FileType)) {
				continue;
			}	
			SavedFilesCount++;
		}
		Dataset.EnableEvents();
		Message = FormatStr(FilesSavedMessage, SavedFilesCount, 
			SelectedIDs.Count);
		ShowInformationDialog(Message);
	} else {
		FileName.Value =
			GetFieldValueFromDisabledField(Dataset, 'Link');
		if (!SaveToFileByFileType(Dataset, FilesDetailGridArea.RecordID, 
			FileName, '', FilesDetailGridArea.FileType)) {
			return;
		}	
		if (FilesDetailGridArea.FileType != ft_File) {
			return;
		}
		Message = FormatStr(OpenFileForEditMessage,	FileName.Value);
		if (ShowConfirmationDialog(Message) == mrYes) {
			if (!OpenFileWithFullAccess(FileName.Value, true, ft_File)) {
				return;
			}
		}
	}
}
 
function SaveToFileByFileType(Dataset, RecordID, FileName, FilePath, FileType) {
	if (!FilePath) {
		FilePath = '';
	}	
	switch(FileType) {
		case ft_File:
			var FileExtension = '.' + ExtractFileExtension(FileName.Value);
			var FileFilterValue = '*' + FileExtension;
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			if (FilePath != '') {
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var File = LoadFileFromDatabase(RecordID, 
				FileName.Value, false);	    
			if (!File) {
				return false;
			}
			break;
		case ft_Link:
		case ft_FolderLink:
			var FileExtension = 'lnk';
			var FileFilterValue = '*lnk';
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			var DestinationFileName = FileName.Value;
			FileName.Value = ExtractFileNameWithoutExtension(FileName.Value);
			if (FilePath != '') {
				FileName.Value += '.' + FileExtension;
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var LinkCaption = ExtractFileNameWithoutExtension(FileName.Value);
			System.CreateFileLink(DestinationFileName, '', 
				LinkCaption, ExtractFilePath(FileName.Value));
			break;
		case ft_URL:
			var FileExtension = 'url';
			var FileFilterValue = '*url';
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			var URLPath = new String(FileName.Value);
			var Index = URLPath.indexOf('://') == -1 ? 0 : 
				URLPath.indexOf('://') + 3;
			var URLFileName = URLPath.substr(Index, URLPath.length);
			Index = URLFileName.indexOf('/') == -1 ? URLFileName.length : 
				URLFileName.indexOf('/');
			URLFileName = new String(URLFileName.substr(0, Index));
			FileName.Value = URLFileName;
			if (FilePath != '') {
				FileName.Value += '.' + FileExtension;
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var URLFileStream = new ActiveXObject('ADODB.Stream');
			URLFileStream.Type = 2;
			URLFileStream.Mode = 3;
			URLFileStream.Open();
			URLFileStream.WriteText("[InternetShortcut]",1);
			URLFileStream.WriteText("URL=" + URLPath,1);
			URLFileStream.Position = 0;
			URLFileStream.SaveToFile(FileName.Value, 2);
			URLFileStream.Close();
			URLFileStream = null;	
			break;	
	}	
	return true;
}

Дмитрий, это был суперский вариант!
Не понятыми остались строки

                Message = FormatStr(FilesSavedMessage, SavedFilesCount, 
                        SelectedIDs.Count);
                ShowInformationDialog(Message);

на них вылетало в дебагер. Прикрыл эти строчки и всё работает!

В этих строках просто выводится сообщение пользователю сколько файлов сохранено. Можете заменить эти 2 строки на:

ShowInformationDialog('Операция завершена. Файлов сохранено: ' + SavedFilesCount);

Да, без завершающего окошка как-то скучно.
В общем, спасибо всем, вопрос изначальный можно считать решенным.
И всё-таки интересно, жесткая привязка tbl_FileInAccount в общей выборке sq_FileInItem - это ошибка, или так задумано?

Так задумано. Она действительно меняется "на лету" в зависимости от раздела, но в инструкции, на которую вы дали ссылку, этот момент не учтен.

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

Как запретить выделять несколько записей в гриде, с помощью ctrl или shift?

Нравится

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

Здравствуйте. Нет, к сожалению это функционал визуального компонента (ядро). Можно только дописать пост обработку - к примеру в базовом реестре (wnd_BaseGridArea) для компонента grdData обработать OnClick или другие доступные события.
А бизнес задача какая?

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

Здравствуйте.
Нужна помощь, в реализации следующего функционала:
В разделе Счета формируется отчет, и сохраняется в БД на деталь "Файлы в продажах", ID нового файла есть. Нужно открыть новый файл (и подписаться на его изменение) из детали "Файлы в продажах" находясь в разделе Счета, т.е. сразу после формирования и сохранения отчета не переходя в другой раздел.
С открытием проблем нет (wnd_FilesDetailGridArea.grdData.grdDataOnDblClick - тут все понятно), но подписаться не получается нужно "находиться" в scr_FilesGridArea (fnFiles.SubscribeFileEvents(FileName, RecordID);).
Получается нужно послать сообщение детали в другом разделе и обработать в нем код аналогичный grdDataOnDblClick, но как получить wnd_FilesDetailGridArea из другого раздела и в случае если его еще не разу не открывали проинициализировать раздел и деталь?

Возможно есть более простое решение, подскажите.
Спасибо.

Terrasoft CRM 3.4.0.130

Нравится

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

делал что-то похожее, подписывался из совсем другого места так:

var Self = Services.GetNewItemByUSI('wnd_FilesDetailGridArea');
	var fnFiles = Self.ComponentsByName('fnFiles');
	fnFiles.UnsubscribeFileEvents(FileID);
	fnFiles.SubscribeFileEvents(FileName, FileID);	
Показать все комментарии

Можно ли закрыть Администратору доступ к определенным записям грида, как обычным Пользователям?

Нравится

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

Добрый день!

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

Можно конечно и фильтрик какой на грид приделать, чтобы всегда для администратора применялся... тем более в 3ке это не проблема - новый GridView с фильтром и код, чтобы его включал несчастному ограниченному админу. Но это как то идеологически неверно.
Менять надо такого администратора, которому доверия нет :wink:

"Alex GF" написал:Можно ли закрыть Администратору доступ к определенным записям грида, как обычным Пользователям?

надо понимать, что он сможет это дело отключить (теоретически)
"Александр Кудряшов" написал:фильтрик какой на грид приделать

лучше делать фильтр на датасет (чтобы в справочнике тоже не отображалось)

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

Кто-то знает этот запрос (для чего он, зачем и можно ли оптимизировать):

exec sp_executesql N'SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[vw_Account] AS [vw_Account]
WHERE(EXISTS
        (SELECT
                [vw_Contact].[ID] AS [ID]
        FROM
                [dbo].[vw_Contact] AS [vw_Contact]
        WHERE([vw_Contact].[AccountID] = [vw_Account].[ID] AND
                EXISTS
                (SELECT
                        [tbl_AdminUnit].[ID] AS [ID]
                FROM
                        [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit]
                WHERE([tbl_AdminUnit].[UserContactID] = [vw_Contact].[ID] AND
                        [tbl_AdminUnit].[UserIsEnabled] = @P1)))))
ORDER BY
        2 ASC'
,N'@P1 int',1

Нравится

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

Угадайка?

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

Можно exists убрать и условие ядреное, через inner join как мне кажется... только надо ли?

"Александр Кудряшов" написал:Можно exists убрать

Спасибо, Александр!
К сожалеюнию, пока нельзя убрать, так как не знаю откуда оно формируется. Но когда узнаю, то постараюсь сделать поле "IsUserAccount", в которое запихивать 1 при создании нового юзера с новым юзерКонтрагентом. тада выборка будет проще

SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[vw_Account] AS [vw_Account]
WHERE IsUserAccount IS NOT NULL

Мне кажется отработает раз в 100 быстрее

SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[[tbl_AdminUnit] AS [[tbl_AdminUnit]
inner join [vw_Contact] on [tbl_AdminUnit].[UserContactID] = [vw_Contact].[ID]
inner join [vw_Account] on [vw_Contact].[AccountID] = [vw_Account].[ID]
 
WHERE [tbl_AdminUnit].[UserIsEnabled] = @P1
 
ORDER BY
        2 ASC',N'@P1 int',1

формируется именно из системы, где-то сервис запроса есть, можно его переписать...

а что реально долго работает и тормозит систему???

ps почитал изыскания пытливых умов - вроде как exists в такой ситуации даже быстрее inner'а отработает

затер сообщение. был неправ :lol:

"AlexLS" написал:в которое запихивать 1 при создании нового юзера с новым юзерКонтрагентом

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

"Андросов Дмитрий" написал:не правильно - надо это поле перезаписывать при изменении признака Активен любого пользователя, привязанного к этому контрагенту и выставлять в 0, если активных пользователей не осталось

Дмитрий, спасибо за ответ! Остается малое - выяснить откуда этот зловещий код выполняется!

"Александр Кудряшов" написал:а что реально долго работает и тормозит систему???

к сожалению из "самых страшных" в нашей терре он на 5 месте (остальные прорабатываю), а по частоте выполнения лидирует! То есть суммарный дюрейшен у юзеров зашкаливает!!!

а вообще это похоже на запрос для какого-то справочника типа "Контрагенты ответсвенных"
поищите UserIsEnabled с помощью GREP (у меня есть только в wnd_LicenseManagerScript, но там не то)
вот для сравнения запрос для справочника Ответсвенный (поиск по имени)

exec sp_executesql N'SELECT TOP 2
	[tbl_Contact].[ID] AS [ID],
	[tbl_Contact].[Name] AS [Name]
FROM
	[dbo].[vw_Contact] AS [tbl_Contact]
INNER JOIN
	[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[UserContactID] = [tbl_Contact].[ID]
WHERE([tbl_AdminUnit].[UserIsEnabled] = @P1 AND
	[tbl_Contact].[Name] LIKE @P2 + ''%'')
ORDER BY
	1 ASC',N'@P1 int,@P2 nvarchar(4000)',1,N'слепо'

"Андросов Дмитрий" написал:но там не то

Я вот тоже не нашел :)
Похожие запросы есть в Users, LicenseManager, но вот точно такого же не было

"Андросов Дмитрий" написал:поищите UserIsEnabled с помощью GREP

к сожалению эта штука ищет только в scr_
а вот в sq_ увы...

"Александр Кудряшов" написал:Похожие запросы есть в Users, LicenseManager, но вот точно такого же не было

хехех. еще бы уметь его находить...

этот запрос выполняется перед function wnd_MainOnPrepare(Window). Как я понимаю, его и ядро юзает...

Выполняется он при старте перед:

exec sp_executesql N'SELECT
	[tbl_SystemSetting].[ID] AS [ID],
	[tbl_SystemSetting].[Code] AS [Code],
	[tbl_SystemSetting].[ValueTypeID] AS [ValueTypeID],
	[tbl_SystemSetting].[StringValue] AS [StringValue],
	[tbl_SystemSetting].[FloatValue] AS [FloatValue],
	[tbl_SystemSetting].[IntegerValue] AS [IntegerValue],
	[tbl_SystemSetting].[BooleanValue] AS [BooleanValue],
	[tbl_SystemSetting].[DateTimeValue] AS [DateTimeValue],
	[tbl_SystemSetting].[DictionaryRecordID] AS [DictionaryRecordID],
	[tbl_SystemSetting].[EnumItemID] AS [EnumItemID],
	[tbl_SystemSetting].[IsCaching] AS [IsCaching]
FROM
	[dbo].[tbl_SystemSetting] AS [tbl_SystemSetting]
WHERE([tbl_SystemSetting].[Code] = @P1)',N'@P1 nvarchar(4000)',N'UpdateActiveSessionPeriod'

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

"Александр Кудряшов" написал:

Так это... раз уж во все тяжкие (с)

Дебаггер в scr_Main и по шагам идем, ждем появления в профайлере заветных строчек


Александр, а есть код выполняющийся перед wnd_MainOnPrepare?

"AlexLS" написал:а есть код выполняющийся перед wnd_MainOnPrepare?

Это уже пограничная область знаний, тут То Самое Ядро может что-то вызывать. Это за пределами моих знаний:smile:
Там раньше окно авторизации и проверка лицензии как раз идет, окно авторизации вроде бы в конфигурации от греха подальше спрятали

"Александр Кудряшов" написал:Там раньше окно авторизации и проверка лицензии как раз идет

она и есть, наверняка, проверка лицензии... Где еще может понадобиться контрагент пользователя? А значит ничего с этим не сделаете. Вам стоит по этому вопросу обращаться напрямую в тех поддержку, причем желательно сразу на кого-нибудь из старожилов с третьей линии выходить :wink: Но, как правило, по всем вопросам, связанным с лицензиями все заканчивается заявлением, что механизм лицензирования закрыт и сакрален :lol:

"Александр Кудряшов" написал:тут То Самое Ядро может что-то вызывать

Александр, вот мне кажется что ядро вызывает банальный sq_ который и поправили под собственные нужды не задумываясь, что оно где-то глобально юзается!!!

Кстати, оно же (запрос) вызывается и Outlook'ом...

"Андросов Дмитрий" написал:по всем вопросам, связанным с лицензиями все заканчивается заявлением, что механизм лицензирования закрыт и сакрален

Дмитрий, мне кажется что лицензии врядли вьюхой проверять будут, скорее всего обращались бы напрямую к tbl_Account и, так же кажется, что разработчики Террасофта, все-таки не настолько ... (тут каждый сам себе додумает), чтобы такой идиотский код. Хотя, возможно, и у них есть отдельные личности, к примеру разработчики лицензирования :smile:
В принципе, в недалекой перспективе, предполагаем переход на TSv7 и эта тайна может так и остаться не разрешенной, хотя кто знает, может на смену мне прийдут новые :biggrin: с этим же вопросом!

Кстати, очередной банальный (уж простите) вопрос: если выгрузить все сервисы в файлы и потом какой-нить утилиткой "поиск текста в xml" пройтись, тогда шансы на поиск увеличатся?

"AlexLS" написал:чтобы такой идиотский код

Ход абсолютно верен.
У простых пользователей НЕТ доступа к tbl_Account, а есть доступ только к vw_Account.
И проверка лицензии не то, ради чего стоит ломать имеющийся движок обращения к данным.

"Александр Кудряшов" написал:И проверка лицензии не то, ради чего стоит ломать имеющийся движок обращения к данным.

Да, может и так... поискал в sq_ по слову "UserIsEnabled" нашлось в sq_AdminUnit, sq_Contact, sq_ContactInTask, sq_User

Судя по Grep-поиску в скриптах и нахождению етого слова в wnd_LicenseManagerScript ... закрываю тему, благо ясно что этот код зашит

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

Настроил возможность открывать файл в гриде
Для события OnLookupColumnClick grdData нужного грида сделал:

function grdDataOnLookupColumnClick(DataGrid, DataGridColumn, Shift) {  debugger;
        var Dataset = dlData.Dataset;
        Dataset.DisableEvents();
        try {
                Record = GetDatasetFieldValue(Dataset, 'Record');
                var wsh = new ActiveXObject("WScript.Shell");
                wsh.Run(Record, 0, false);
        } catch(error) {
                ShowWarningDialog(error.name + ": " + error.message);
        } finally {
                Dataset.EnableEvents();
        }
}

для колонки colRecord установил свойство LookupType в dgcltLookup.

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

Нравится

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

Так надо посмотреть что там в случае Записи или Клиента в параметре DataGridColumn передается, и по условию ваш код применять

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

"Андросов Дмитрий" написал:один обработчик для клика по всем lookup-колонкам

Так можно же

if (DataGridColumn.Name == 'colRecord')

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

scr_BaseGridArea.grdDataOnLookupColumnClick(DataGrid, DataGridColumn, Shift);

Да, так и сделал.

"Александр Кудряшов" написал:Так можно же

но обработчик-то один :wink:

"Андросов Дмитрий" написал:но обработчик-то один

Да оно понятно, что один :wink:
Главное параметр работает в вызове, мог же и не срабатывать :redface:

Идея понравилась, решила использовать.
Но у меня при открытии ссылки выдается просто окно "Error:"
Это происходит только при нажатии на новую созданную колонку.
Я создавала строковое поле, и заполняла его так: \\server\папка\имя_файла.jpeg
Доступ к этому ресурсу в сети у меня есть.

"Тихенко Виктория" написал:\\server\папка\имя_файла.jpeg

Тут скорее всего должны быть заменены одинарные слэши двойными везде...

Поменяла на двойные, не помогло. Так же выскакивает "Error:"

Можно попробовать в консоли посмотреть, что же там происходит и куда идет обращение

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