DataField
IsReadOnly
onDatasetDataChange
Скрипты
Разработка

Buenas tardes, amigos!

Господа, прошу руку помощи в следующем, непонятном мне моменте.

Существует окно, в нём есть список и memo поле.
При инициализации окна, полю memo устанавливается свойство IsReadOnly = true;
При изменении пункта в списке (на какой то определённый) устанавливается свойство memo.IsReadOnly = false, но само поле в окне остаётся недоступным.

Где здесь собака зарыта?

С уважением
Ваш коллега.

Нравится

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

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

Наталья, при выводе значения свойства через MessageBox указываются ожидаемые значения. Но в самом окне изменения не происходят (поле как было только для чтения (окрашено в серый цвет) так и осталось).

Код события Prepare окна

// Подразумевается
// Если пользователь принадлежит группе, и поле Dataset - StatusComplaintID равно конкретному определённому значению, то блок frame group формы становится активным для этих пользователей.
// Вывод MessageBox - true - ..., true - ...
function wnd_ComplaintEditOnPrepare(Window) {
    ...
    if ( Dataset('StatusComplaintID') == compstatAnalized && IsContactIDInUserGroup(Connector.CurrentUser.ContactID, AdmUnitSupervisorCallGroup) ) { // Специалистам ГКС 2 линия могут осуществлять доразбор рекламации
    fgComplaintAnalysis.IsEnabled = true;
    //edtAppDescription.IsEnabled = false; пытался обыграть с отключением поля, но не могу дойти до него загрузив сервис в другом файле =) (пока просто не знаю как получить доступ к полю)
    var dsApplication = dlApplication.Dataset;
    dsApplication.Open();
    dsApplication.DataFields.ItemsByName('Description').IsReadOnly = true;		
    MessageBox(dsApplication.DataFields.ItemsByName('Description').IsReadOnly + " - свойство IsReadOnly\n" + dsApplication.DataFields.ItemsByName('Description').IsEnabled + " - свойство IsEnabled");
    }	
}

Далее событие DatasetDataChange

// Подразумевается
// Если в окошке в списке выбрали Статус с конкретным значением - то снимается свойство IsReadOnly, при любом другом значении вновь устанавливается.
function ds_ComplaintOnDatasetDataChange(DataField) {
    ...
    var Name = DataField.Name;
    var Value = DataField.Value;
    ...
    switch (Name) {
    ....
    case 'StatusComplaintID':
    var dsApplication = Services.GetNewItemByUSI('ds_ApplicationToNP');
    if (Value == compstatAppInNP) {
	dsApplication.DataFields.ItemsByName('Description').IsReadOnly = false;
	MessageBox(dsApplication.DataFields.ItemsByName('Description').IsReadOnly + " - свойство IsReadOnly\n" + dsApplication.DataFields.ItemsByName('Description').IsEnabled + " - свойство IsEnabled");
    } else {
        dsApplication.DataFields.ItemsByName('Description').IsReadOnly = true;
	MessageBox(dsApplication.DataFields.ItemsByName('Description').IsReadOnly + " - свойство IsReadOnly\n" + dsApplication.DataFields.ItemsByName('Description').IsEnabled + " - свойство IsEnabled");
    }				
}

* Под Application подразумевается заявка
* Под ApplicationToNP - заявка в смежное (neighbour) подразделение
Это не приложение =)

Свойства устанавливаются, но ожидаемого эффекта в самом окне не происходит
В Dataset у данного поля checkbox "только для чтения" - снят.
Возможно я чего то не знаю, прошу подсказать =)

Егор, добрый день.

Вы, наверное, запутались в двух (соснах)свойствах - IsReadOnly и IsEnabled. Первое свойство - это свойство DataField'а датасета, второе - это свойство контрола в карточке:

myControl.DataField.IsReadOnly = true;
myControl.IsEnabled = true;

В Вашем случае:

OnPrepare(Window) {
 
 
myMemo.DataField.IsReadOnly = true;
//myMemo.IsEnabled = false;
}
 
 
DataChange(DataField) {
 
if(DataField.Name == 'myListDataField' && !IsEmptyValue(DataField.Value)) {
myMemo.DataField.IsReadOnly = false;
//myMemo.IsEnabled = true;
}

Yegor, обратите внимание:
1. Как написал Дмитрий, у DataField'а нет свойства IsEnabled. Эта запись некорректна:

dsApplication.DataFields.ItemsByName('Description').IsEnabled

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

var dsApplication = dlApplication.Dataset;

Про свойства контрола я тоже помню, но в данном случае я его не использовал. (По совету Натальи проверил свойство IsEnabled как раз DataField'a)

Но всё равно при изменении свойства при смене пункта списка, поле не становится доступным для редактирования (возможно надо как то обновить окно, но подобных событий я не нашёл)

Если формально то пытаюсь достигнуть следующего
К примеру
есть список с языками

  • Русский
  • Английский

и есть два поля с текстом (оба недоступны для редактирования)
При выборе из списка пункт Русский соответствующее поле с текстом становится доступным для редактирования (сразу же), аналогично при выборе другого, поле блокируется, а с другого блокировка снимается. (Может быть пример не самый лучший, но суть описывает)
Возможно ли что то подобное сделать с окном в TerraSoft?
Повторюсь что при срабатывании DataChange свойство изменяется, но эффект не наблюдается.

"Бондарь Наталия" написал:Как написал Дмитрий, у DataField'а нет свойства IsEnabled. Эта запись некорректна:
dsApplication.DataFields.ItemsByName('Description').IsEnabled

Возьму на веру (Надо тогда SDK подправить) Вот вырезка на которую ссылался.
Свойство IDataField::IsEnabled

Признак активности поля.
IDL
__property VARIANT_BOOL IsEnabled;
Описание
Содержит значение "True", если поле набора данных является активным. Иначе содержит значение "False".

Если свойство содержит значение "False", то поле не участвует в формировании запросов, и значение данного поля получить и изменить нельзя.

С новым экземпляром скорее всего причина =) только сразу вопрос дилетантский) из скрипта датасета будет виден dlApplication???

"Litvyakov Yegor Vladimirovich" написал:из скрипта датасета будет виден dlApplication

Из скрипта датасета - нет. Для получения датасета используйте запись вида:

var dsApplication= DataField.ParentDataFields.ParentDataset;

"Litvyakov Yegor Vladimirovich" написал:Возьму на веру (Надо тогда SDK подправить) Вот вырезка на которую ссылался.

Вы правы, свойство IsEnabled у DataField действительно есть, немного ошиблась.
Но отвечает не за возможность редактирования поля, а за активность поля датасета (будет ли поле участвовать в формировании запроса).

В посте №1 я писала о свойстве IsEnabled контрола.

Упс :biggrin: точно.
Да и самая главная проблема. У DataField родительский Dataset не тот который нужен.
(При изменении поля одного датасета, надо разблокировать поле другого)
В такой ситуации я до существующего нужного Dataset'a не доберусь??? Или это возможно использую функцию GetSingleItemByCode?

Егор, вы все усложняете.
На OnPrepare заблокируйте нужные Вам контролы (или датафилды, тут по желанию) одной строкой.
А на датачендже просто в условии if(DataField.Name == 'myDropDownDataField') разблокируйте его опять таки одной строкой.
Тут я писал пример

А почему не создать обработчик события OnDatasetDataChange для компонента DatasetLink карточки?
В результате Вы сможете прописать ту же логику только обращаясь к компонентам DatasetLink (в данном случае к dlApplication).

Прописал то же самое что и выше, только в событии компонента DatasetLink, как предложила Наталия

"Бондарь Наталия" написал:А почему не создать обработчик события OnDatasetDataChange для компонента DatasetLink карточки?

В данном случае как раз получается без "танцев с бубном" получить Dataset не создавая новый экземпляр.

Наталия, Дмитрий, спасибо большое за помощь! Вы мне очень помогли в решении задачи и понимании системы =) (осталось куча вопросов, но куча разрешилась :mrgreen:)

С уважением
Егор

Показать все комментарии
FastReport
Windows 8
Технические вопросы
Разработка

Добрый день!
Столкнулся со странным поведением отчетов Fastreport на Windows 8.
Прикрепляю две картинки (вторая этот же отчет на Windows 7).
Кто-нибудь сталкивался с подобным? и как с этим можно бороться?

Нравится

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

Здравствуйте, Валентин!

С подобной проблемой еще не сталкивались. Для первичного анализа сложившейся ситуации, необходимо локализовать проблему, а именно прошу, Вас, уточнить следующую информацию - воспроизводится ли еще данная ошибка на других отчетах Fastreport в Win 8? Если ошибка повторяется, то проблема в OS, если же нет - тогда сам отчет является проблемным. Если воспроизводится только на одном отчете, прошу прислать его сервисы для анализа.

Приятного дня!

Эта ошибка у меня воспроизводится на 2 компьютерах с установленной ОС Windows 8 и 8.1.
Она присутствует только в тех отчетах где используется компонент TfrxRichView. Добавляю сервисы отчетов.

Валентин, спасибо за уточняющую информацию. Мы протестируем работу отчетов на OS Win 8 и сообщим результат.

Приятного дня!

Здравствуйте, Валентин.

Проблему воспроизвести удалось.

Обращение передано в департамент разработки для анализа и возможного исправления.

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

Здравствуйте, Валентин!

Ошибка связана с таблицей, которая используется в компоненте TfrxRichView.

Если убрать таблицу из данного компонента, то отчет под Windows 8 формируется корректно.

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

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

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

А что за таблица?

Здравствуйте, Валентин.

Например:

[URL=http://fastpic.ru/][IMG]http://i66.fastpic.ru/big/2014/0714/6e/80378b6d…]

и

[URL=http://fastpic.ru/][IMG]http://i67.fastpic.ru/big/2014/0714/51/0068493e…]

Вероятнее всего, эти таблицы были скопированы из Word или Excel.

Попробуйте добавить нужные данные в отчет вручную:

[URL=http://fastpic.ru/][IMG]http://i65.fastpic.ru/big/2014/0714/b5/383b9ae6…]

Т.е. вы имеете ввиду форматирование а не какую-то определенную таблицу БД?

Валентин, да.

Я имею ввиду, что данные таблицы были, вероятно, скопированы Вами из Excel, Word в элемент RichText отчета.

Windows 8, по какой-то причине, некорректно воспринимает теги таблицы.

Потому в данный момент решением является использовать в элементе RichText не таблицу, а просто форматирование элементов.

Для корректного отображения отчета под Windows 8 подобных таблиц быть не должно.

Я понял, спасибо, попробую...

Показать все комментарии
Бизнес-процессы
Разработка

Добрый день!
TS 3.4.0.180

Пытаюсь передать параметры диаграммы подпроцесса в основной процесс. Но данные не передаются. Как решить эту проблему? Сервисы прилагаю.

Нравится

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

Здравствуйте, Андрей!

Необходимо в основной диаграмме настроить связь параметра диаграммы с параметром в подпроцессе:

http://i64.fastpic.ru/big/2014/0625/dd/abab82b4af16e17773f739dbf3a6d2dd.png

А затем получать значение параметра в скрипте диаграммы процесса можно, например, так:

function Item3OnAfterComplete(SubProcessItem, ItemDataset) {
	var mypr = SubProcessItem.ParentItems.ParentDiagram.Parameters.ItemsbyName('mypr').Value;
}

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

Здравствуйте, Андрей.

Можно, через ParameterMap.

Пример есть в функции:

function SaveDatasetFields(DiagramItem, Prefix, Dataset) {
	ClearParametersMapByLikeName(DiagramItem, Prefix);
	var Records = Dataset.Attributes('Records');
	for (var i = 0; i < Records.length; i++) {
		var Record = Records[i];
		ParameterMap = DiagramItem.ParametersMap.CreateItem();
		ParameterMap.ItemParameterName = Prefix + '_' + Record.FieldName;
		ParameterMap.Data = Record.FieldName;
		ParameterMap.ItemType = Record.MapType;
 
		if (Record.ParameterName) {
			ParameterMap.DiagramParameterName = Record.ParameterName;
		} else {
			switch (Record.ParamType) {
				case wptString:
				case wptLookup:
				case wptEnum:
					ParameterMap.Value = Record.StringValue;
					break;
				case wptInteger:
					ParameterMap.Value = Record.IntegerValue;
					break;
				case wptFloat:
					ParameterMap.Value = Record.FloatValue;
					break;
				case wptBool:
					ParameterMap.Value = Record.BoolValue;
					break;
				case wptDateTime:
					ParameterMap.Value = Record.DateTimeValue;
					break;
 
			default:
					ParameterMap.Value = Record.Value;
			}
		}
		ParameterMap.IsAdditional = true;
		DiagramItem.ParametersMap.AddItem(ParameterMap);
	}
}

Можно ли для связи параметров использовать эту функцию из scr_workflowutils?

function WFConnectParams

Андрей, да можно.

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

Подскажите, пожалуйста, функцию которая по значению поля Subject вытащит ID письма из таблицы tbl_MailMessasge

Спасибо

Нравится

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

Сергей, такой функции не увидела в конфигурации.
Вы можете решить задачу следующим образом:
- добавьте в sq_MailMessage фильтр по полю Subject;
- затем в коде получайте ID письма применением фильтра по полю Subject:

Например:

var DatasetMailMessage = Services.GetNewItemByUSI('ds_MailMessage');
ApplyDatasetFilter(DatasetMailMessage, 'Subject', SubjectValue, true);
DatasetMailMessage.Open();
var ID = DatasetMailMessage('ID');
DatasetMailMessage.Close();

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

Наталия, спасибо, все вышло. Для корректного выбора почты добавил еще фильтр по дате создания письма (у меня она совпадает с датой отправки).

wnd_OpportunityDependenceGridAriaScript
 
function grdDataOnDblClick(Control) {
	//TODO
 
    var Dataset = Control.DatasetLink.Dataset;
    var RecordType = GetFieldValueFromDisabledField(Dataset, 'RecordType');
    var RecordDate = GetFieldValueFromDisabledField(Dataset, 'CreatedOn');
    var RecordText = GetFieldValueFromDisabledField(Dataset, 'Name');
	if (RecordType == 'wnd_MailWorkspace') {
		var DatasetMailMessage = Services.GetNewItemByUSI('ds_MailMessage');
		ApplyDatasetFilter(DatasetMailMessage, 'Subject', RecordText, true);
		ApplyDatasetFilter(DatasetMailMessage, 'SendDate', RecordDate, true);
		DatasetMailMessage.Open();
		var ID = DatasetMailMessage('ID');
		scr_MailUtils.ShowMailMessage(ID)
		DatasetMailMessage.Close();
	}
}
Показать все комментарии

Добрый день!
Подскажите, пожалуйста, почему может не отрабатывать условие в элементе бизнес-процесса "Выбор"?
От этого элемента отходят 2 ветки с кодами NotAccept, Accept. Но ни по одной ветке процесс дальше не идет. В скрипт OnDecision заходит, ResultLinkCodes заполняю.

function Item4OnDecision(DecisionItem, IsComplete, ResultLinkCodes) {
        var LastTaskResultID = WFGetParamValue(DecisionItem.ParentItems.ParentDiagram, 'LastTaskResultID');
        if (LastTaskResultID == tr_OfferNotReceived) {
                ResultLinkCodes.Value = 'NotAccept';
        } else {
            ResultLinkCodes.Value = 'Accept';
        }
}

Нравится

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

Не получается пустить процесс по ветке K1. По ветке K2 процесс идет нормально.

Вопрос снят, стоял ProcessImmediately = false

Опоздал с ответом =(

Показать все комментарии
Кэш
3.x
Технические вопросы
Разработка

Добрый день
Подскажите, пожалуйста
Можно ли как-то очистить дисковый кэш террасофта не через батник, а из клиента?!

Нравится

3 комментария
Close()
IWindow
Скрипты
Разработка

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

Можно ли как-то закрыть окно в момент его инициализации?
Т.е. делаю я, скажем, OnPrepare() и в нем понимаю, что "передумал"
Передумав, хочу закрыть окно даже не показывая пользователю
Как бы это реализовать?!
У меня, почему-то, все-равно даже после .Close() закрывается форма и открывается снова по методу .Show(), хотя я его не вызываю нигде

Нравится

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

я, кажется, понял .... сам дурак
все же, делается Show() дальше по тексту
правда не мной, а двиглом (похоже)

Можно на OnShow событии передумать и вызвать .Close();

"Олейник Дмитрий" написал:Можно на OnShow событии передумать и вызвать .Close();

Пишет, что нельзя на OnShow и OnHide менять закрывать окно или менять его видимость

"0x8000ffff - TSDskWindowLibrary.DskWindow: Cannot change Visible in OnShow or OnHide"

Если на OnPrepare сделать .Close() то форма снова не должна открываться. Мигнет карточка на секунду просто. Но если это неудобно, то можно до открытия карточки отменять обработку даблклика/нажатия кнопки.

Показать все комментарии
excel
изображение
Отчёты
Разработка

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

Столкнулся с проблемой: заказчику необходим Excel-отчет. Отчет готов, но в его шапке необходимо разместить логотип компании. Само изображение считывается из БД, записывается в stream примерно вот так:

var ImageStream = new ActiveXObject('ADODB.Stream');
ImageStream.Open();
Image.SaveToStream(ImageStream);

И теперь самое главное, каким образом поместить изображение в WorkBook.ActiveSheet? Находил способы считывания файла с ФС, но это накладывает свои неудобства - не у всех есть какая либо папка, или может быть закрыт доступ к ней.

Нравится

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

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

Здравствуйте, напрямую поместить изображение в WorkBook.ActiveSheet из БД возможности нет. Вариант решения - сохранять файл изображения во временную папку, а затем, использовать его.

Показать все комментарии
Технические вопросы
Разработка

Подскажите как можно реализовать?

Нравится

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

Скриншот лучшего качества

Татьяна, чтобы добавить колонку Вам необходимо:
- в Terrasoft Administrator открыть сервис окна реестра записей (например, wnd_ContractsGridArea);
- выделить представление dgvData. Вызвать команду контекстного меню «Определить колонки»;
- для нужного поля установить признак доступности

 	 /system/files/definecolumns.png

Спасибо за ответ,Наталия! и ещё один вопрос. колонка под названием "Description" должна иметь название "Описание". не могу отыскать то место,где определяется название.заранее спасибо.

Татьяна, заголовок поля задается в датасете (свойство Caption поля датасета).

Наталия,Спасибо!А можно ли "описание" подогнать под "макет"? Чтобы оно шло не отдельной колонкой, а подколонкой "Макета"?

Татьяна, не совсем поняла о каком макете идет речь? Проиллюстрируйте, пожалуйста, скриншотами.

"описание" под "макет"

Татьяна, чтобы Описание отображалось сгруппированным по макету необходимо у поля [Описание] в датасете заполнить свойство "Multiline Caption" подобным образом:

/system/files/14-07-2014_10-59-38.png

Где до символа | нужно прописать Макет, после - Описание.

Проверьте, чтоб у компонента grdData (в окне реестра записей) было установлено свойство IsMultiLineHeader равным true.
Если все установлено корректно, однако двойной заголовок не формируется, вложите сервисы окна + tbl, sq, ds.
Дополнительно сообщите версию приложения.

Двойной заголовок не формируется. Свойство IsMultiLineHeader = true. Версия 3.4.1.153. "вложите сервисы окна + tbl, sq, ds" каким образом?

Татьяна, проверила на версии 3.4.1 - множественный заголовок формируется корректно (скриншоты вложила).
Чтобы выгрузить сервис необходимо выполнить следующие действия:
- Выделить сервис в дереве сервисов приложения Terrasoft Administrator.
- Вызвать команду контекстного меню «Сохранить в файл».

Все заработало. Спасибо большое за помощь

Показать все комментарии
Бизнес-процессы
Разработка

Здравствуйте,
У нас в системе террасофт что-то слетело. Создаем договор, давим отправить на визирование, он выдает ошибку: Визы не созданы. В справочнике результатов типов визирования нет значения по умолчанию.
От любого пользователя, с любыми правами.
Помогите исправить, объясните как это сделать?
До вчера все исправно уходило по всей иерархии от начальников отделов и до директоров.

Нравится

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

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

Андрей, причина предупреждения - в справочнике [Результаты визирований] не определен результат визирования по умолчанию.
Чтобы исправить ситуацию Вам необходимо:
- Перейти в раздел [Справочники].
- Найти справочник [Результаты визирований].
- Для одного из результатов заполнить поле "По умолчанию".

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

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