У нас есть компьютеры с очень малым объемом оперативной памяти (256-512 Мб) и процессорами с частотой меньше 1 ГГц. Вчера на конференции Террасофт подсказали, что можно ускорить запуск и работу Террасофт ограничивая загрузку конкретных сервисов.
Вопрос: как можно запусить Террасофт и при этом указать конкретные сервисы для загрузки, отключив не нужные?

Terrasoft XRM 3.3.1.134 MS SQL

Обновление:
По теме есть запись в моем блоге, где я пишу о том как анализировать используемые сервисы и как можно их отключать из использования.
Ускорение работы CRM - http://community.terrasoft.ua/blogs/6011

Нравится

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

"Кошкаров Андрей" написал:с очень малым объемом оперативной памяти (256-512 Мб)

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

А так вообще интересно по поводу ограничения загрузки сервисов...

"Александр Кудряшов" написал:не удержусь от оффтопика напомнив про дешевизну оперативной памяти и простоту решения.

Там такие компьютеры, у которых можно максимум 512 Мб памяти установить и еще нужно попробовать ее найти. Это ограничение в обьеме памяти обусловлено материнской платой.

Один из моих заказчиков испольцует на кассах целероны 1Ггц и 256-512 Мб памяти DDR1. Там же крутиться террасофт. Да грузится не очень быстро, но дальнейшая работа вполне удовлетворительная.
В самом начале как правило грузятся все необходимые сервисы для дальнейшей работы. Визуальные сервисы грузятся не все а только активный раздел в его деталями.

"Евгений Либин" написал:Один из моих заказчиков испольцует на кассах целероны 1Ггц и 256-512 Мб памяти DDR1. Там же крутиться террасофт. Да грузится не очень быстро, но дальнейшая работа вполне удовлетворительная.

Ключевое слово удовлетворительная, боюсь. От последних подобных машин мы отказались, попробовав использовать модуль Звонки - карточка там не всплывала, а скорее неспешно возникала при входящем вызове... Плюс при ограниченности ресурсов памяти очень неспешная работа с Outlook, который сам по себе достаточно тяжел. А вот если в таком направлении не ходить, то да, более-менее прилично работать будет, пока менеджер вместе с Terrasoft например Firefox с парой-тройкой вкладок не запустит, он всю память и съест:)

Кстати, терминальный режим работы вполне подойдет, наподобие тонкого клиента такие машинки еще послужат

Да, согласен, всё зависит от задач.
Просто у кассиров иногда времени на обед не хватает :), не говоря о интернете и т.д.

Если нет возможности выбросить железо - то лучше из него сделать теминальные станции.

"Евгений Либин" написал:то лучше из него сделать теминальные станции.

Вот, вот, и я об этом:)

Абсолютно согласен насчет использования таких машин в качестве тонких клиентов.

"Александр Кудряшов" написал:попробовав использовать модуль Звонки - карточка там не всплывала, а скорее неспешно возникала при входящем вызове

Между прочим, тут Террасофт не виноват, например, в связке с OKtell сообщение, по которому мы можем открыть карточку приходит с задержкой.
Был опыт проектного решения, когда при старте системы кэшировались окна всех указанных в настройке разделов и их карточек редактирования, стартовала система, конечно, долго, но зато потом все бегало быстрее. Кэширование реализовать своими силами совсем не сложно.

Так это и не вина Terrasoft, просто в нашем случае при 512Мб памяти и стареньком Целероне на машине все в принципе очень медленно ворочалось... решили радикально заменой на свежий Целерон и 1Гб памяти:)

Показать все комментарии
поле
сервис
Скрипты
Разработка

Добрый день!

В БД в таблице tbl_TaskType присутствует поле Field1, но в сервисе tbl_TaskType в Администраторе Terrasoft это поле не отображается. При попытке добавить поле в сервис, отображается ошибка о повторении имени поля.
В этой колонке содержатся нужные данные, каким образом можно его подтянуть в сервис?

Нравится

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

Попробуйте сначала сохранить сервис таблицы без сохранения в БД, а потом с.

простите, не поняла:confused:

Создаете в сервисе таблицы tbl_TaskType поле Field1. Сохраняете. На вопрос "изменить таблицу в БД?" отвечаете "нет".
Переоткрываете сервис, переименовываете поле Field1. Сохраняете. На вопрос "изменить таблицу в БД?" отвечаете "да".

Спасибо, Сергей, именно, это я имела ввиду :) По идее при такой последовательности должно восстановиться соответствие.

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

Здравствуйте!
Совсем недавно начал изучать Terrasoft XRM 3.3.2.127 MS SQL, поэтому извините заранее за возможно «ламерские» вопросы. Что изучено и прочитано: TS_AG_3.3.2, TSCRM_SDK_3.0, раздел Разработчику на Terrasoft Community, просмотрены примеры реализации модуля Account и Contacts. То ли что то пропустил, а теперь не понимаю, то ли не там смотрю, но в описаниях нигде свои ответы явно не нашел.
Интересуют следующие:
1. Как осуществить доступ к полям какой либо таблицы из другого скрипта.
var Dataset = dlData.Dataset; ?

2. Передача параметров между функциями и скриптами. Если я правильно понял это или через глобальные переменные или через объект Connector?

3. Программное заполнение значений полей другой таблицы, в частности , как например заполнить поле, являющейся ссылкой на перечисление или на другую таблицу?

3. Где можно найти описание Ваших функций из скриптов модуля Common/Library (назначение, параметры, формат, пример)

Так для примера. В Wizard создан новый раздел DocZakaz

Поля таблицы tbl_DocZakaz:

  • Code (тип строка)
  • ContactID (ссылка на справочник Contact)
  • DateZakaz (тип Дата/Время)

Нужно чтобы после нажатия на кнопку OK в окне редактирования раздела wnd_ DocZakazEdit автоматически открывалось окно создания нового проекта и автоматом заполнялись следующие поля:

  • Тип планирования(PlanningType ) сразу в 'Планировать в этом элементе'
  • Календарь (CalendarID) сразу в 'Базовый календарь'
  • Начало, план (EstimatedStartDate) = DateZakaz (из tbl_DocZakaz)

// wnd_ DocZakazEditScript

function btnOKOnClick(Control) {
    var Dataset = dlData.Dataset;
    var Value = Dataset.Values('Code');
    var ClientID=Dataset.Values('ContactID');
    var DateZakaz=Dataset.Values('DateZakaz');
    Connector.Attributes('IfZakaz')='true';
    Connector.Attributes('ZakazCode')=Value;
    Connector.Attributes('ZakazClientID')=ClientID;
    Connector.Attributes('ZakazDateZakaz')=DateZakaz;
        scr_BaseDBEdit.btnOKOnClick(Control);
        AddProjectRecord(Self, 'amiAddProject');
        Connector.Attributes('IfZakaz')='false';
}


// ds_ProjectScript

function ds_ProjectOnDatasetAfterAppend(Dataset) {
        var IsZakaz=Connector.Attributes('IfZakaz');
        if (IsZakaz=='true') {
            var Value=Connector.Attributes('ZakazCode');
            var ClientID=Connector.Attributes('ZakazClientID');  
            var DateZakaz=Connector.Attributes('ZakazDateZakaz');
            Dataset.Values('Name')=Value;
            Dataset.Values('CalendarID')='Базовый календарь';   //  вылетает ошибка OLE error 80020102
            Dataset.Values('PlanningType')='Планировать в этом элементе' ; // вылетает ошибка OLE error 80020102
            Dataset.Values('EstimatedStartDate')=DateZakaz;
            Dataset.Values('ContactID')=ClientID  // проходит        
        }
}

Что делаю не так?

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

Нравится

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

Для доступа к таблицам, как Вы уже наверное разобрались, предусмотрены три сервиса -- собственно, сервис таблицы tbl_*, сервис запроса на выборку sq_* и сервис набора данных ds_*.
Таблицы хранят данные, с помощью запросов на выборку эти данные выбираются (причем не только один к одному из таблицы, но и из других таблиц, с фильтрацией и подзапросами), а с помощью наборов данных они используются внутри системы. Для чтения/изменения данных нужно использовать сервисы датасетов (наборов данных).
Для доступа к определенному датасету нужно сначала его получить по заранее известному названию (например, получаем датасет контактов ds_Contact)

var Dataset = Services.GetNewItemByUSI('ds_Contact');

А потом уже можно использовать

if (!IsDatasetEmpty(Dataset)) {
    Dataset('Name') = 'Иванов И.И.';
}

Передачу параметров можно делать, кроме прочих вариантов (может подскажут более подходящие), и так, как Вы сказали.
В случае заполнения полей-справочников (в корточках редактирования возле таких полей отображается иконка-лупа, при нажатии которой отображается окно выбора значения) нужно в соответствующее поле датасета записать ID записи.
Например,

Dataset('JobID') = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}';

Как узнать нужный идентификатор? Сначала открываем датасет в администраторе, смотрим, из какого источника берутся данные для поля "Должность". В данном случае это ds_Job. Открываем последний, смотрим, из какого запроса на выборку берутся данные. В данном случае это sq_Job. Открываем его. На панели инструментов находим кнопку "Предпросмотр". Он и без того бывает полезным, но сейчас нас в нем интересует кнопка "Выполнить SQL". Внизу видим результаты выборки. По названию определяем нужный идентификатор.
Аналогично поступаем и в случае с перечислениями. Они описываются сервисами enm_* и также в датасете нужно посмотреть, из какого же перечисления для конкретного поля берется значение.

Что вы имеете в виду под описанием функций? Есть Terrasoft SDK. Есть Terrasoft Администратор, в котором можно открыть интересующий Вас скрипт из Common/Library и посмотреть, какие именно у функции параметры. Посмотреть, где используется данная функция можно, используя глобальный поиск (Инструменты - Grep search). В результатах поиска по конфигурации Вы сможете найти для себя множество примеров использования конкретной функции (как самого вызова, так и подготовки параметров).

Ваш пример можно реализовать немножко иначе. Открыть окно редактирования -- значит показать нужный сервис wnd_* с определенными параметрами. Создать новый проект -- значит получить датасет проектов, создать в нем новую запись и заполнить остальные параметры (это и будет "автоматом").
Например,

var ProjectDataset = Services.GetNewItemByUSI('ds_Project');
ProjectDataset.Append();
var NewID = Connector.GenGUID(); //генерируем новый уникальный идентификатор
ProjectDataset.ValAsGUID('ID') = NewID;
//пропиываем нужные параметры
ProjectDataset.Values('Name') = 'test_test';//Dataset('Code');   
ProjectDataset.Values('ParentProjectID') = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'; //особенность проектов -- обязательно должно быть заполнено поле ParentProjectID
ProjectDataset('CalendarID') = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'; //ID взять из sq_Calendar
ProjectDataset('PlanningType') = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'; //ID взять из enm_ProjectPlanningType
ProjectDataset('EstimatedStartDate') = Dataset('DateZakaz');
ProjectDataset('ContactID') = Dataset('ContactID'); //проходит потому что в правой части ID
ProjectDataset.Post();
ProjectDataset.Close();
var Attributes = new ActiveXObject('Scripting.Dictionary');
Attributes.Add('RecordID', NewID);
ShowEditWindowEx('wnd_ProjectEdit', Attributes);

Стоян Виталий, Terrasoft Support Team

Виталий спасибо большое!! Вот это то, как раз чего я и не допонял.
Дополнение к примеру, если вдруг кому-то сгодится

function btnOKOnClick(Control) {
      var ZakazDataset = dlData.Dataset; // текущий Dataset
      var ProjectDataset = Services.GetNewItemByUSI('ds_Project');
      ProjectDataset.Append();
      var NewID = Connector.GenGUID(); //генерируем новый уникальный идентификатор
      ProjectDataset.ValAsGUID('ID') = NewID;
        //пропиываем нужные параметры
      ProjectDataset('Name') = ZakazDataset('Code');    
      ProjectDataset('ParentProjectID') = NewID; // обязательный, тот же что и ID
      ProjectDataset('EssenceType') = 'Project'; // 'Stage' - для стадий, 'Work' - для работ
      ProjectDataset('TypeID') = '{0304A9F6-CCC5-4C37-9843-FE9F05FE4389}'; // обязательный, тип выполнения, подробнее см. tbl_ProjectType
      ProjectDataset('StateID') = '{04009A52-FB1A-4CD8-8BB4-56977EF802F7}'; // обязательный, тип состояния, подробнее см. tbl_ProjectState
      ProjectDataset('CalendarID') = '{2534EA24-891E-45E4-9AA2-D53E4D4E4760}'; //ID взять из sq_Calendar
      ProjectDataset('PlanningType') = '{5D576142-CE74-4A8D-A4D6-BE52D5C8952E}'; //ID взять из enm_ProjectPlanningType
      ProjectDataset('EstimatedStartDate') = ZakazDataset('DateZakaz'); // дата начала
      ProjectDataset('EstimatedDueDate') =ZakazDataset('DateEnd') ; // дата окончания
      ProjectDataset('HasChilds') ='1'; // обязательный, если будут у проекта подчиненные стадии и работы
      ProjectDataset('ContactID') = ZakazDataset('ContactID'); //
      ProjectDataset('OwnerID') = ZakazDataset('CreatedByID') ; // оказывается тоже обязательный иначе вообще не отображается ни у кого, возможно его можно получить и по другому но почему то Connector.CurrentUser.ContactID дает null
      ProjectDataset.Post();
      ProjectDataset.Close();
 
      var Attributes = new ActiveXObject('Scripting.Dictionary');
      Attributes.Add('RecordID', NewID);
      ShowEditWindowEx('wnd_ProjectEdit', Attributes);
    scr_BaseDBEdit.btnOKOnClick(Control);
}	

Только вот еще вопрос.

  • Перед присваиванием, например ProjectDataset('EstimatedStartDate') = ZakazDataset('DateZakaz') нужно ли проверять, заполнен ли ZakazDataset('DateZakaz') чем нибудь, или пусто. В Delphi если переменной присваеваем не заполненое значение из таблицы он вывливается в ошибку Access... А в Terrasoft так можно делать, или надо проверять каждую переменную?

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

В Террасофте ошибка возникнет, если Вы пишете нулевое значение в поле ID, будет "несоответствие типа".
Проверку делать желательно. Есть функция IsEmptyValue скрипта scr_Utils.
Писать в идеальном случае лучше так:

if (!IsEmptyValue(ZakazDataset('DateZakaz'))) {
    ProjectDataset('EstimatedStartDate') = ZakazDataset('DateZakaz')
}

Ну и конечно перед этим нужно перевести датасет в режим редактирования ProjectDataset.Edit(), а потом подтвердить ProjectDataset.Post()

Стоян Виталий, Terrasoft Support Team

Показать все комментарии
Microsoft Office Excel не установлен в системе
Интеграция и импорт данных
Разработка

При переустановке TS CRM версии 3.3.0.49 MS SQL 2008 на новый сервер MS 2008 х64. Устанавливали все как и на старом сервере(2003) сначала Офис 2003, потом CRM. CRM упорно "не видит", что в системе установлен Офис. Как можно заставить CRM "увидеть" Офис?

Нравится

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

Запустите файл TSMSOfficeLibraryConfigurator.exe (он находится рядом с приложением в папке Bin) и отметьте нужные офисные приложения.

Стоян Виталий, Terrasoft Support Team

У меня та же ошибка. Как ее можно исправить?

С помощью TSMSOfficeConfig.exe убирал галочки с продуктов Excel, Word и Outlook, затем ставил обратно. Не помогло...

Windows Server 2008 R2 Standard
Конфигурация XRM 3.4.1.130
Бинарники 3.4.1.165
MS Office 2007

у меня та же ошибка

С помощью TSMSOfficeConfig.exe убирал галочки с продуктов Excel, Word и Outlook, затем ставил обратно. Не помогло...

win 7 pro sp1
64разряда
конфигурация
CRM 3.4.0.152
MS Office 2013

Здравствуйте.
Какая битность MS Office?

Здравствуйте.
Проверьте, что бы в конфигурации была указана поддержка 2013-го MS Office. В одном из сервисов scr_MSOfficeConsts или scr_MSOfficeUtils должна быть строка вида:
var SupportedMSOfficeVersionArray = new Array('14.0', '12.0', '11.0', '10.0', '9.0');
в скобках указаны версии поддерживаемых офисных пакетов. У 2013-го код - 15.0. Если такого кода там нет, а его, скорее всего, нет - добавьте, сохраните изменения и проверьте возможность интеграции.
Второй момент - это проверить не попала ли надстройка Террасофт в отключенные модули в Outlook (Файл\Параметры\Надстройки\Управление:Отключенные объекты).

Спасибо проблему решили

ну а если она в отключенных объектах и включить ее нельзя, расположение пустое, но в папку библиотека есть

Здравствуйте.
В таком случае, это вопрос не приложения а, скорее, MS Office или безопасности ОС.

Показать все комментарии
Интеграция и импорт данных
Разработка

Добрый день! Появилась потребность перенести некоторые функции xrm на веб. Была создана веб форма для загрузки файлов сначала на веб сервер а потом вставки его в блоб поле детали файлы в договоре. Появилась проблема что в php запрос строиться в виде текстовой переменной и когда туда вставялешь прочитанный Бинарный файл.
Вот кусок кода может кто сталкивался помогите.

function insert_file_contract($FilePath,$filename,$contract_id){
    /*$fp      = fopen($FilePath, 'r');
    $FileData = fread($fp, filesize($FilePath));
    $FileData = addslashes($FileData);
    fclose($fp);
   
    if(!get_magic_quotes_gpc())
    {
        $fileName = addslashes($fileName);
    }*/

   
    $FileData = addslashes(fread(fopen($FilePath, "rb"), filesize($FilePath)));
    ///echo $FileData;
    $itemtype_id = '39A5B367-4A7A-473E-8F74-26977CB6DB67';
    $file_id = guid();
    ///echo $file_id;
    $tsql = "insert into tbl_files(id,Link,FileData,ItemTypeID,DocumentType) values('".$file_id."','".$filename."','".iconv('UTF-8','cp1251',$FileData)."','".
            $itemtype_id."',0)";
    $result_files = mssql_query($tsql);
    if ($result_files != null){
        if (($contract_id !='')&&($contract_id != null)){
            $filein_ivoice_sql = "insert into tbl_FileInContract (ID,FileID,ContractID) values(NEWID(),'".$file_id."','".$contract_id."')";
            /////echo $filein_ivoice_sql;
            $result_files_contract = mssql_query($filein_ivoice_sql);
        }
    }
       
    unlink($FilePath);
}

Нравится

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

Запись в BLOB-поля производится с помощью специальных функций.
Например, здесь в рамках Террасофта можно реализовать поставленную задачу через потоки.
Так как у Вас веб-форма, то нужно использовать соответствующие функции работы с BLOB. Напрямую через запрос у Вас не получится.
Данный вопрос выходит за рамки Террасофта, а более касается особенностей работы с большими объемами данных посредством php

Стоян Виталий, Terrasoft Support Team

Спасибо решил вопрос с помощью хранимой процедуры и функций вызова хранимок в php

Показать все комментарии
Параметр в пользовательском SQL-фильтре
Фильтры
Разработка

Help!!! Для построения отчета, нужно добавить фильтрацию, причем все путем конфигурирования в сервисе типа sq_ (ни каких scr_), создаю нужный мне пользовательский SQL-фильтр с текстом:
[tbl_Opportunity].[ChannelID] = (SELECT [DepartmentID] From [tbl_Contact] where [tbl_Contact].[ID]=:DefDepartmentID)
где :DefDepartmentID я так обращаюсь к созданному мной параметру DefDepartmentID типа "функция" значение "Кoнтaкт тeкyщeгo пoльзoвaтeля", запускаю на использование отчет - отчет пуст, смотрю в профайлере как система видит заданный мной параметр:
,@P1 varchar(1)',NULL
вообщем не правильно видимо я к параметру обратился, подскажите как правильно в данном случае переписать код?

Нравится

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

Здравствуйте. Попробуйте создать вместо sql-фильтра обычный Фильтр сравнения (Compare filter), только в качестве правого операнда выбрать Value subquery (подзапрос):

Блин, ваша картинка не отображается, выбрал Value subquery (подзапрос), не пойму где этот подзапрос создать?

Нет туплю уже вижу, сейчас буду пробывать. Спасибо.

Отлично, помогло, спасибо, сам бы ни когда такое волшебное слово Value subquery не увидел.

Вот опять задача похожая, все тоже самое как и раньше,но теперь нужно поставить фильтр типа IN, т.е WHERE [tbl_Opportunity].[ChannelID] IN (SELECT [DepartmentID] From [Terrasoft332_Develop].[dbo].[tbl_ContactDepartment] where [tbl_Contact].[ID]= "Параметр (Кoнтaкт тeкyщeгo пoльзoвaтeля)"), то есть оказалось что у них еще на закладке детали прячутся Департаменты, соответственно, есть ли аналогичный механизм для Фильтра типа IN = подзапрос?

Алексей,
фильтр типа IN успешно заменяется на фильтр типа Exists путем добавления в запрос этого exists фильтра вроде:

... AND [tbl_Contact].DepartmentID = [tbl_Opportunity].[ChannelID]

Спасибо, получилось с Exists правдо пришлось попариться в начале чтоб правильно все заработало.

"Жуков Алексей Иванович" написал:

Блин, ваша картинка не отображается, выбрал Value subquery (подзапрос), не пойму где этот подзапрос создать?


Походу у меня с глазами все гораздо хуже :-( Как добавить подзапрос к сравнению?

Выбрать в списке полей самый последний пункт Value subquery.

Глюк какой-то пока sq запрос не переоткрыл подзапрос не появлялся...

Валентин Петрович, исправлено в последних версиях (начиная с 3.4.1)

все ясно
у меня 3.4.0
спасибо

Показать все комментарии
Установка и Администрирование
Разработка

Здравствуйте.Меня интересует как можно скрыть или удалить ненужнок поле в Terrasoft XRM?Например при добавлении инцидента как можно удалить или скрыть поле Serial Number?Ответьте пожалуйста как можно быстрее...Приведите пожалуйста если можно пример...как конкретно это можно сделать?спасибо.Очень жду вашего ответа!

Нравится

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

Запустите TSAdmin. найдите сервис окна "wnd_IncidentEdit" в дереве сервисов слева. Откройте его. Выберите на открытом окне не нужный Вам контрол (в Вашем случае номер). В инспекторе свойств (левый нижний угол) найдите свойство IsVisible и установите ему False. Сохраните и закройте сервис.
Но будьте осторожны: по неопытности в TSAdmin можно случайно испортить функционал.

Большое спасибо,Сергей! Могли бы вы кинуть официальную ссылочку на руководство где можно это прочитать более конкретно? Так как в руководстве по администрированию системы я такого не нашел...((

Уже не надо спасибо!

Возник еще вопросик: Некоторые поля при заполнении анкеты-обязательны:как можно сделать так чтобы эти поля были бы необязательны???.....спасибо!

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

Спасибо за ответ,Сергей!
Но можно подробнее? Что значит свойство каждого вопроса?а как открыть вопрос анкеты для редактирования?)

Раздел "Опросы". Деталь "Вопросы"(внизу справа).

раздела опросы не нашел(( извините мое непонимание...но можно ли пошагово обьяснить?спасибо

"Алекс Васильев Викторович" написал:Некоторые поля при заполнении анкеты-обязательны

А где ж анкеты то тогда у вас используются?

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

Вот в проектах убирать календарь крайне не рекомендую. На нем много функционала завязано.

"Алекс Васильев Викторович" написал:раздела опросы не нашел(( извините мое непонимание...но можно ли пошагово обьяснить?спасибо

Вкладка маркетинг - раздел опросы.

А вообще рекомендую пройти курс обучения по функционалу. Эффективнее будет.

Я не понимаю при чем тут маркетинг?
Может быть я неправильно как то выразился?
Мне нужно, чтобы при добавлении нового проекта во вкладке проекты, нужно чтобы поле например состояние было бы не обязательно для заполнения? На данный момент оно обязательно, так как помечено красным цветом...я же не хочу чтобы оно было обязательным для заполнения...вооот..как мне это сделать?)спасибо!
А при чем здесь вкладка маркетинг?
Спасибо!

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

И еще в сервисе tbl_Project с поля StateID аналогичную галку снять придется

Огромное спасибо все получилось...

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

Есть фильтр типа 'IN', как в скрипте его правильно включить?
Фильтр - AccountSiteParentID

Нравится

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

Посмотрите в scr_DB, там должна быть функция
ApplyDatasetIncludeFilter

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

В качестве параметра передается Array. Вам нужно просто результаты выборки записать в Array.

хм... а выполнить в том виде в котором я его создал (с подзапросом) не получится?

и получается этот подзапрос можно вообще выбросить?

Не посмотрел изначально на прикрепленный файл. Я думал у Вас значения для фильтра отдельным запросом выбираются.
Вот кусок функции ApplyQueryIncludeFilter из scr_DB (Как писал выше Валерий). Только здесь вырезана очистка старых и заполнение новыми значениями выражения.

for (var i = 0; i < Filters.Count; i++) {
		Filter = Filters.Items(i);
		if  ((Filter.Code == FilterCode) && (Filter.FilterType == ftInclude)){
			Filter.IsEnabled = Enabled;
 
		}
	}

спсб...

Как создать в сервисе вот такой фильтр INCLUDE:

[tbl_Site].[ID] in (select tbl_RolesUrFace.SiteID from tbl_RolesUrFace)

так может нельзя сделать такой IN фильтр?

Попробуйте реалзиовать через Exists Filter с условием по ID.

exists (SELECT tbl_RolesUrFace.SiteID FROM tbl_RolesUrFace) where [tbl_Site].[ID] = ***

А как включить фильтр типа Exists?

Либо галочку возле него поставить:
1
Либо через ApplyDatasetFilter.

1
Вам необходима функция EnableDatasetFilters (scr_DB)

Данная функция использует такие параметры:
EnableDatasetFilters(Dataset, Enabled, FilterCodes)
- Dataset - экземпляр нужного датасета;
- Enabled - если Вам нужно включить фильтр, то Enabled = true, выключить= false;
- FilterCodes - название фильтра, который нужно включить (название пишите в одинарных кавычках).

Пример, если включать фильтр с карточки

var Dataset = dlData.Dataset;
EnableDatasetFilters(Dataset, true, 'AccountExist');
RefreshDataset(Dataset);

Если попробывать использовать функцию ApplyDatasetFilter получите ошибку "Exception thrown and not caught" на

function CheckAssigned(Object, ObjectName) {
	if (!Assigned(Object)) {
		var ErrorMgs = FormatStr(ObjectNotAssignedError, ObjectName);
		throw ErrorMgs;
	}
}

Гакало Игорь, ну вы же понимаете, что это не выход...
Яворский Алексей, спсб...

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

Вот два сервиса, датасет прикручен к LookupDataControl, LookupDataControl.DataFieldName = 'ID'. При выполнении такого кода:

ApplyDatasetFilter(LookupDataControl.DatasetLink.Dataset, 'ParentSiteID', ParentSiteID, true);
LookupDataControl.DatasetLink.Dataset.Open();

в окно поиска этого LookupDataControl-а вываливаются все контрагенты из таблицы tbl_Account. Профайлером смотрел - запрос выполняется правильный. LookupDataControl.DatasetLink.Dataset.RecordsCount - имеет правильное значение. Почему же в окне поиска грузятся все контрагенты? Что я делаю не так?

Нравится

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

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

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

Стоян Виталий, Terrasoft Support Team

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

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

"Глова Сергей" написал:можно чуть поподробнее? Просто код, который Вы предоставили обычно выполняют на OnPrepareSelectWindow и без открытия датасета.

я мало что понимаю в Террасофт-е, возможно Вы и правы... меня до сих пор удивляет, что после изменения условия датасет не нужно переоткрывать, хотя подозреваю (ибо руководства для программистов наверное мы не дождемся), что ядро системы как-то само реагирует на эти изменения... ну да ладно...
в данном случае мне просто нужно было чтобы в LookupDataControl загружались данные из таблицы контрагентов, но не все, а отобранные по условию. И данные по условию отбирались (как я и писал - "Dataset.RecordsCount - имеет правильное значение"), но LookupDataControl почему-то загружался всеми записями. Механизм такой - на форме, в другом LookupDataControl-е (у него другой датасет), я выбираю контрагента, в его обработчике события на изменение данных я получаю нужный мне идентификатор и использую его как параметр для фильтра другого датасета, условно говоря - выбираю все объекты подчиненные выбранному, для этого и вставлен приведенный выше код. Вот вобщем-то и всё, ничего сложного, но логика работы LookupDataControl-а мне не понятна...

Показать все комментарии
java security
Онлайн демо
Технические вопросы
Разработка

Пытаюсь запустить онлайн демо.
Выдает ошибку:
java.security.AccessControlException: access denied (java.util.PropertyPermission user.language write)

Пробовал и IE и Mozilla Firefox. Установлена Java Plug-in 1.6.0_23.
Дайте наводку то хоть что делать?

Нравится

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

Дело в Java клиенте.
Варианта два:
или заходим в панель управления и загрузив апплет Java смотрим вкладку Advanced-Security;
или его переустанавливаем с вычисткой возможных остатков настроек в реестре.

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