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

Есть перечень Сервисов, упакованных в Сервисные договора. Создаём Инцидент, выбираем Контрагента - автоматически подставляется соответствующий основной Сервисный договор. Далее выбираем Сервис из списка доступных согласно Пакета сервисов в данном Сервисном договоре. И вот тут мне нужно автоматически выставить нужный Тип инцидента. Условно говоря, в моём бизнес-процессе Тип инцидента - это группировка Сервисов по сути: IT, организационное, техническое и т.п. Соответственно, по Типу инцидент пойдёт в решение в разные подразделения.

Подскажите, пожалуйста, где нужно поковыряться для реализации? Начну с того, что в справочнике Сервисов добавлю выбор Типа инцидента, которому этот Сервис соответствует. Далее надо в окне редактирования Инцидента при смене Сервиса подставлять Тип инцидента. Как это сделать?

Нравится

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

Это можно сделать либо в скрипте карточки в обработчике dlDataOnDatasetDataChange, либо в скрипте датасета на SelfOnDatasetDataChange.

Итак.

В Сервисы через штатный механизм добавил справочник Типов инцидента. Заполнил справочник.

В sq_Incident добавил поле ServiceIncidentTypeID из уже подцепленной tbl_ITService.IncidentTypeID

Прописал это поле в ds_Incident

Теперь в скрипт. Пошел по первому пути.

function dlDataOnDatasetDataChange(DataField) {

    DataChange(DataField);

    SmartLookupOnDataChange(DataField);

}

Проваливаюсь в DataChange, нахожу там обработку изменения ITServiceID

    if (Name == 'ITServiceID') {

       // получаем ID типа инцидента по сервису

        var iIncidentTypeID = Dataset.Values('ServiceIncidentTypeID');

        // меняем тип инцидента

        Dataset.Values('IncidentTypeID') =iIncidentTypeID;

        ProcessChangeITServiceID(Dataset);

        return;

    }

Не падает, но при изменении Сервиса контрол Тип инцидента оказывается пустым. На каком шаге мог ошибиться?

Попробуйте отладиться, чтобы на каждом шаге видеть значения переменных. Вообще, для получения значения tbl_ITService.IncidentTypeID проще было бы не добавлять поле в sq и ds инцидента, а воспользоваться функцией GetDatasetFieldValueByID('ds_ITService', ITServiceID, 'IncidentTypeID');

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

Добрый день.

Во вложенном файле карта заказа, как она должна выглядеть по заданию. Подсветка групп (в окне слева - "напитки", "чипсы") нарисована в графическом редакторе. Сейчас этого нет, в этом и заключается задание. Список групп может быть длинным. Клиенты могут сами начать заказ снизу или из середины. Идти по группам по порядку не получается. Иногда операторы упускают какие-то группы, и продажи теряются. Надо подкрасить группы, по которым прошлись при набивании заказа. У Вас  это стандартная конфигурация - группы и записи, входящие в группу. Я подумал, что может быть что-то похожее (по событиям в окне с записями группы меняется вид записей в окне групп) уже есть. Если это так, не могли бы Вы дать мне ссылку?

Прикрепленные файлы

Нравится

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

Дерево групп — это обычный DataTreeGrid со своей логикой, реализованной в скрипте scr_Groups окна wnd_Groups. Окраску можно сделать в обработчике функции grdDataOnGetRowDrawInfo, передав изнутри значение в параметр Color. Сейчас там только выбирается иконка папки. Как работают со цветом, видно в скрипте scr_TasksGridArea реестра задач.

То есть Вам будет нужно либо модифицировать scr_Groups, либо создать своё окно, унаследованное от него, и в его скрипте сделать нужную логику в grdDataOnGetRowDrawInfo (не забыв вызвать базовую). И в окне для групп использовать его.

PS: Йог жив, перс-абр, Чудо!surprise

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

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

Есть два поля "Категории", "Суб-категории". Оба типа LookupControl и оба wnd_MultiSelectData.

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

Если после того как выбраны суб-категории, удалить одно из значений категории, и снова открыть суб-категории, фильтр работает, но остаются прежние выбранные значения(в TargetDataset).

Вопрос: Как удалить значения из TargetDataset (в MultiSelectData) ?

Изображение удалено.

Нравится

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

Видимо, нужно делать что-то похожее на логику страницы wnd_ReportCurrentSituation и такой же wnd_ReportFinanceResult. Там тоже два мультилукапа и фильтрация значений одного по другому.

Зверев Александр,

Я не нашла ни wnd_ReportCurrentSituation,  ни wnd_ReportFinanceResult. Версия Terrasoft 3.2.0.90

Есть какие-то другие примеры? Или, если Вам не сложно, можете отправить фрагмент кода ?

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

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

Мне нужно раскрасить ячейки разным цветом. Последняя колонка во вложенном файле cellDraw. У меня такое получилось в окне заказа (см. второе вложение).

function dgOfferingOrderOnGetCellDrawInfo(DataGrid, Column, Color) {   

    if(dgvOfferingOrder.Items(Column).DataFieldName == "OutOfTerms"  && dgvOfferingOrder.Items(Column).DataField.IsEnabled == true) {       

       var DataFieldValue = dgvOfferingOrder.Items(Column).DataField.Value;

       if (DataFieldValue == 1)

         Color.Value = clRed;

       if (DataFieldValue == 2)

         Color.Value = clGreen; 

       if (DataFieldValue == 3)

         Color.Value = clYellow; 

    }

    if(dgvOfferingOrder.Items(Column).DataFieldName == "RecomendedQuantity"  && dgvOfferingOrder.Items(Column).DataField.IsEnabled == true) {

                       Color.Value = clSkyBlue;

    }

}

В разделе контрагентов попробовал сделать по подобию. Событие  OnGetCellDrawInfo там есть. Но ничего не происходит. Думал, что-то неправильно в условиях. Но проверил точкоц останова, программа туда даже не попадает:

function grdDataOnGetCellDrawInfo(DataGrid, Column, Color) {

      debugger; // ???????????????????????????????????

  if(System.GetLocalComputerName() == 'PEUWUD14431') {

           debugger;

    if(gvAll.Items(Column).DataFieldName == "Category"  && gvAll.Items(Column).DataField.IsEnabled == true) {       

       var DataFieldValue = gvAll.Items(Column).DataField.Value;

       if (DataFieldValue == 'I')

         Color.Value = clRed;

       if (DataFieldValue == 'II')

         Color.Value = clGreen; 

       if (DataFieldValue == 'III')

         Color.Value = clYellow; 

       if (DataFieldValue == 'IV')

         Color.Value = clBlue; 

    }

  }

}

Буду признателен, если поможете советом.

 

С уважением,

Владлен Зенюков

Прикрепленные файлы

Нравится

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

Возможно, в свойствах грида просто не включены в дизайнере HasCustomDraw и HasCustomCellDraw. Сравните с тем, что в гриде на той странице, где работает.

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

Версия ТС - 3.4.0.191



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

Подскажите пожалуйста, мне нужно реализовать отправку почты из террасофта. Для работы с текстом письма использую компонент RichDataControl. Проблема в том, что я не могу корректно преобразовать его в html (нужно сохранить форматирование). Может быть есть готовые решения или хотя бы наброски? Без разницы на js или sql.

Нужно все провернуть без использования MS Outlook и (желательно) без ms word на компьютере. Изучала https://community.terrasoft.ua/questions/pole-opisanie-na-e-mail и https://community.terrasoft.ua/questions/rtf-v-html, вопрос решить не смогла :( Также находила сырую процедуру для такой конвертации на ms sql, пробовала дорабатывать, но оформление текста по большей части все равно теряется, предполагаю чтобы прописать туда все возможные варианты - понадобится много времени (могу ошибаться, сильно далеко не копала).

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

Нравится

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

В последних версиях ядра 3.4.1 добавили поддержку выгрузки детали описания в HTML. Для этого нужны новые файлы и добавление параметра в настройках RunSettings.xml. После этого в JS-коде содержимое в HTML получают так:

var HTMLTemplateBegin = '<html lang="ru" encoding="UTF-8"?><head><title data-cke-title=""></title> '+
	'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>' +
	'<meta http-equiv="Content-Style-Type" content="text/css"/></head>' +
	'<body contenteditable="true" class="cke_editable cke_editable_themed cke_contents_ltr cke_show_borders" spellcheck="true"><div>';
var HTMLTemplateEnd = '</div></body></html>';
Body = HTMLTemplateBegin + edtDescription.GetHTMLBody() + HTMLTemplateEnd;
Body = Body.replace(/[\n\r]/g, '');// удаление _x000D_ в MS Office - http://stackoverflow.com/questions/36167807/access-newline-becoming-x000d

 

 

Зверев Александр,

ругается на строку edtDescription.GetHTMLBody() и в коде, и в форме для конвертации на кнопку "Конвертировать". Пишет что объект не поддерживает свойство или метод. В окне Save As - строка с выбором HTML не появилась

 

Значит, в Вашей версии ещё не было поддержки. Она появилась только в 3.4.1.

а как-нибудь возможно именно этот метод внедрить в нашу версию? Либо другие варианты решения... Где-то на форуме читала про htmlbody..

Нет, нужно обновляться. Либо сами чисто программно формируйте нужный HTML, а шаблоны верстайте отдельно.

Зверев Александр,

Подскажите пожалуйста, что нужно для обновления? Переход платный? Также заинтересовал вопрос - https://community.terrasoft.ru/questions/svaz-s-microsoft-office-2013. В 3.4.1 поддерживается 64х битный офис. Там про бинарники тоже писали, но ссылки на них нет (отправляли на почту задавшему вопрос) 

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

Зверев Александр,

Спасибо!

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

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

Как добавить новое поле в справочник, который не имеет окна редактирования?

Добавила в tbl, sq и ds. В справочнике этого поля не видно.

Изображение удалено.

Нравится

2 комментария
Лучший ответ

Марина, добрый день.

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

С редактированием сложнее. Создайте новое окно, унаследуйте его от wnd_SingleFieldEdit, в dlData нового окна впишите свой датасет и добавьте свое поле в окне. Затем выберите новое окно в настройке справочников в качестве окна редактирования. Enjoy.

Марина, добрый день.

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

С редактированием сложнее. Создайте новое окно, унаследуйте его от wnd_SingleFieldEdit, в dlData нового окна впишите свой датасет и добавьте свое поле в окне. Затем выберите новое окно в настройке справочников в качестве окна редактирования. Enjoy.

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

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

Добрый день!

Решил настроить встроенный WebServices, все сделал по руководству от террасофт версия 3.4

Удаленный комп по http://имя_сервера:порт/soap/IServer все прекрсно видит. А создаешь новое соединение через WebServices указываю Server URL http://имя_сервера:порт/soap/IServer затем кликаю выбрать конфигурацию и не выпадает ничего. Если руками пропишу название конфигурации то тогда выдает ошибку: error opening configuration. разрушительный сбой

Подскажите что я делаю не так?

Нравится

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

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

Вообще, механизм веб-сервисов 3.Х используют очень редко. Возможно, в современных ОС что-то и не сработает. Если есть возможность, лучше работать на удалённом компьютере по RDP.

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

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

Имеется TerrasoftCRM 3.3.2.245. Я правильно понимаю, что компонент FastReportPreviewer предназначен для вывода отчета FastReport в окно? Есть какие-нибудь примеры работы с ним?

Нравится

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

Стандартные FR-отчёты показываются в окне wnd_BaseFastReportPreview, там используется этот компонент. А функции открытия этого окна с загрузкой в него нужного отчёта и выбранных записей раздела можно увидеть в scr_ReportUtils.

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

Добрый день!

Подскажите, как решить данный вопрос:

Есть деталь, сформированная на объекте на базе VIEW. Этот VIEW берет данные из другой системы, следовательно, не имеет Id в формате GUID. Для соответствия форматов, подставляется некий Id, но он повторяется для всех записей. 

В таком виде всё работает отлично.

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

Нравится

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

Ничего не мешает сделать во view уникальный Id на основе значения других колонок.

select  cast(HashBytes('MD5', 'hello'+'world') as uniqueidentifier)

 

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

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

При определенном действии(отправка визы для заявки), надо открыть для редактирования конкретное поле всех поручителей(Физ. лица), находящихся в данной заявке. 

Это поле по умолчанию "только для чтения".

Т.е. пользователь должен открыть карточку Физ.лица и редактировать конкретное поле.



Поэтому, в событии OnPrepare(Window) Физ.лица

пишу: 

При "некотором условии"

{

    var ContactDataset = dlContact.Dataset;

    ContactDataset.DataFields('поле').IsReadOnly = false;

}



Но, чтобы получить это "условиие", я пробегаю по всем поручителям заявки, оттуда открываю датасет Физ.лица

while (!warrantorsDataset.IsEOF)

{

    var ContactDataset = GetSingleItemByCode('ds_Contact');

    ContactDataset.Close();

    ApplyDatasetFilter(ContactDataset, 'ID',warrantorsDataFields.ItemsByName('ContactID').Value, true);

    ContactDataset.Open();

    И здесь надо добавить какое-то свойство(Property) на ContactDataset, или глобальную переменную, чтобы она существовала также в скрипте "Физ. лиц"

}

Как можно добавить Property или глобальную переменную ?

Спасибо.

 

Нравится

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

Обычно для глобальных переменных используют Connector.Attributes('какой-то текст'). Например, см., как в конфигурации заполняют и считывают Connector.Attributes('MainWindow').

Но сам подход решения изначального вопроса довольно странный. Зачем перебирать в цикле и кучу раз закрывать, фильтровать и открывать датасет, если можно создать сервис sq, который получает на вход параметры и одним SQL-запросом получает нужный результат. Или даже без sq, а просто в скрипте при помощи Connector.DBEngine.ExecuteCustomSQL запускать кусок SQL-кода или вызов хранимки и получать ответ.

 

Конечно Вы правы, Александр.

Датасет открываю в надежде добавить какое-то свойство для конкретного физ лица.

Но так не получилось.

А что можно в скрипте при помощи Connector.DBEngine.ExecuteCustomSQL запускать кусок SQL-кода, и получить несколько строк ответа ?

Для нескольких строк можно работать с помощью sq и ds, созданных специально под Ваш запрос.

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