Как создать преднастроечную страницу. Дайте, пожалуйста, ссылку на руководство по созданию преднастроечных страниц.

Нравится

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

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

Обучающее видео по созданию страниц доступно по ссылке

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

1. В WebApp.Loader\Web.config найти запись по ключу "useFileContent" и установить
useFileContent="true"
2. В ConnectionString.config найти запись по ключу "clientUnitContentPath" и установить путь выгрузки JScript файлов:
name="clientUnitContentPath" connectionString="C:\Projects\JS_Code"
3.Перейти в конфигурацию, выбрать из меню "Действие" пункт "Обновить клиентские модули из базы данных"
4. Внесити изменения в JScript файлы, например используя IDE для работы с такими файлами
5. Для фиксации результата выбрать из меню "Действие" пункт "Зафиксировать клиентские модули в базе данных"

Нравится

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

Коллеги, нужен совет!

Имеем COM Visible класс на C# .Net 3.5, в котором имеется массив значений
Из-под админки Terrasoft на debbuger я могу видить структуру этого массива и значения.... а вот доступ получить не удается
Как-то так: Instant.Items(1) или так Instant.Items[1] - ошибка и все тут!

Как описать этот массив в C#, что бы достучаться до него из JScript ?

Спасибо!

Нравится

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

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

А так?
Что бы получить доступ, добавьте Set аксессор.

public class Test
{
    /// <summary>
    /// String array field instance.
    /// </summary>
    string[] _elements = { "one", "two", "three" };
 
    /// <summary>
    /// String array property getter.
    /// </summary>
    public string[] Elements
    {
	get { return _elements; }
    }
 
    /// <summary>
    /// String array indexer.
    /// </summary>
    public string this[int index]
    {
	get { return _elements[ index] ; }
    }
}

Дмитрий, спасибо!

Вот этого нам и не хватало:

public string this[int index]
    {
        get { return _elements[ index] ; }
    }

:smile:

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

Часто для вывода в отчёте денежной суммы дробное число нужно оформить нужным образом, с разделением на нгултрумы и чертумы (или, скажем, рубли и копейки), также с пробелом или запятой между группами разрядов. Предлагается многофункциональная функция для осуществления такого форматирования.

function FormatFloat(Value, DecimalMark, ThousandSeparator, Prefix, Postfix, NoZero){
        DecimalMark = IsNull(DecimalMark, ',');
        ThousandSeparator = IsNull(ThousandSeparator, ' ');
        Prefix = IsNull(Prefix, '');
        Postfix = IsNull(Postfix, '');
        var Minus = (Math.abs(Value) != Value) ? ' - ' : '';
        Value = Math.abs(Value);
        var Result = '';
        var Cop = Math.round((Value - Math.floor(Value))*100);
        if (Cop.toString().length > 1 || !!NoZero) {
                Result = Result + DecimalMark + Cop.toString();
        } else {
                Result = Result + DecimalMark + '0' + Cop.toString();
        }
        var IsFirstIteration = true;
       
        while (true) {  
                var Thousand = Math.floor(Value) - Math.floor(Value / 1000) * 1000;
                if (IsFirstIteration) {
                        Result = Thousand + Result;
                        IsFirstIteration = false;
                } else {
                        Result = Thousand + ThousandSeparator + Result;        
                }
               
                Value = Math.floor(Value / 1000);
                if (Value == 0) {
                        return Prefix +Minus + Result + Postfix;
                } else {
                        if (Thousand 10) {
                                Result = '00' + Result;
                        } else
                                if (Thousand 100) {
                                        Result = '0' + Result;                         
                                }
                }
               
        }              
}

Параметры:

Value — исходное дробное число.
DecimalMark — десятичная запятая, точка или название валюты на её месте.
ThousandSeparator — пробел или запятая между единицами, тысячами, миллионами и т.д.
Prefix — название валюты перед числом.
Postfix — название валюты или разменной монеты после числа.
NoZero — если true, то 1 копейка, иначе — 01 копейка.

Примеры использования:

FormatFloat(-12345.67)//- 12 345,67
FormatFloat(1000003.62, ' руб. ', null, null, ' коп.')// 1 000 003 руб. 62 коп.

Также сходную задачу решает "коробочная" функция AmountToStr (скрипт scr_ConvertUtils), переводящая число в его написание словами. А если нужно ещё и склонять слово (1 копейка, 2 копейки,5 копеек), можно использовать соответствующий механизм.

Нравится

Поделиться

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

Здравствуйте. Я вместе с группой опытных программистов разрабатываю редактор скриптов Terrasoft CRM, который на данный момент включает в себя такие возможности как автодополнение, полная подсветка синтаксиса и еще несколько функций необходимых полноценному редактору. Предположительная стоимость продукта - $ 199 за одну лицензию. Интересно знать Ваше мнение по разрабатываемому продукту. Что бы Вы хотели видеть в данном редакторе, готовы ли Вы или Ваша компания купить данный продукт для удобства разработки и, как следствие, роста Вашей продуктивности работы?

Нравится

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

Скрины в студию!

Хотелось бы увидеть демонстрацию функциональных возможностей в видео формате.

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

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

Уточните, чего именно вам не хватает в редакторе скрипта в TSAdmin? Возможно это уже будет в новой версии 3.4.1.

Планируется редактор только скриптов, без других типов объектов?
А не рассматривали вариантов в виде плагина к навороченной IDE вроде MSVS?

Уточните, чего именно вам не хватает в редакторе скрипта в TSAdmin? Возможно это уже будет в новой версии 3.4.1.

Хотелось бы подсветку выделенного слова и его совпадение в функции.

Константин, так сейчас выглядит мой дизайнер скрипта в TSAdmin (версия 3.4.1.62):

Все похожие слова при выделении или при поиске слова выделяются.

Вот настройки дизайнера скриптов в TSAdmin (можно выбрать цвет фона, размер и цвет шрифта, цвет выделения похожих слов и т.д.):
Окно опций

Интересно, продукт вышел?

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

Простенькая функция, с помощью которой можно получить более читаемые сообщения с числами.

function PluralForm (n, FormArray) {
        if (n%100 > 10 && n%100 20) return FormArray[2];
        switch (n % 10) {
                case 1:return FormArray[0];
                case 2:
                case 3:
                case 4:return FormArray[1];
                default:return FormArray[2];
        }
}

Тестовый пример:

function Main() {
        var Arr =new Array('кочерга', 'кочерги', 'кочерёг');
        for (var i = 1; i = 1000; i++) {
                Log.Write(0, i + ' ' + PluralForm (i, Arr));
        }                      
}

Фрагмент выводимых результатов (нажимаем F9 и смотрим журнал по Ctrl+Alt+L):

[12.07.18 23.48.08.418] 1 кочерга
[12.07.18 23.48.08.418] 2 кочерги
[12.07.18 23.48.08.418] 3 кочерги
[12.07.18 23.48.08.418] 4 кочерги
[12.07.18 23.48.08.418] 5 кочерёг
[12.07.18 23.48.08.418] 6 кочерёг
[12.07.18 23.48.08.418] 7 кочерёг
[12.07.18 23.48.08.418] 8 кочерёг
[12.07.18 23.48.08.418] 9 кочерёг
[12.07.18 23.48.08.418] 10 кочерёг

В идеале стоит для 0 предусмотреть отдельную логику, чтобы не писать "0 кочерёг", а сообщить, скажем, что "Ни одной кочерги нет".

Нравится

Поделиться

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

Периодически, разрабатывая конфигурации, сталкиваемся с проблемами дробного числа в Jscript'е. Пример проблемы, на скриншоте:

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

Нравится

Поделиться

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

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

В данном примере, система проверяет достаточно ли в данной партии продукта для отгрузки. Нужно: 0,6 единиц.
Доступно: 1,7 - 1,1 = 0,5999999999999999999

Выводит сообщение, что НЕ достаточно товаров на складе для отгрузки :confused:

--
www.it-sfera.com.ua

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

0.6 - (1.7 - 1,1) > eps

где еps достаточно малая ненулеавя величина. Берем eps = 1e-10. Пишем функцию сравнения

function IsGreat(a, b){
    return ((a - b) > eps)
}

ну и остальные функции сравнения чисел.

Когда начинал писать, идея казалась бредом, а сейчас даже нравится начинается :)

Я бы еще (a-b) по модулю взял, иначе работать не будет.

Идея интересная :biggrin:
Попробуем!

--
www.it-sfera.com.ua

"Попов Александр" написал:Я бы еще (a-b) по модулю взял, иначе работать не будет.

На самом деле для IsGreat работать будет - попробуйте на приведенном примере :) А вот для IsEqual и IsGreatOrEqual действительно нужен модуль.

Спасибо за уточнение! Но, цитата не моя :wink:

--
www.it-sfera.com.ua

Вы еще скажите что и мопед не Ваш :)
Сорри, Акелла промахнулся :)

С кем не бывает?!

--
www.it-sfera.com.ua

"Виталий Ковалишин aka samael" написал:С кем не бывает?!

Этот вопрос мне адресован? :)

Я же не со зла! :)

--
www.it-sfera.com.ua

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

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

Мельникова Екатерина на эту тему даже создала идею: community.terrasoft.ua/node/3032.
Главная идея - дерево может находится в двух режимах - дерево и список. При работе с деревом фильтрация невозможно. При работе со списком - мы можем осуществлять поиск нужной нам записи, и при переключении обратно в режим дерева мы позиционируемся на найденной записи.

Основа - режим переключения из дерева в список. В приведенном примере переключение между деревом и списком осуществляется по горячей клавише Ctrl-Q. Включение / отключение фильтра осуществляются по горячей клавише Ctrl-S.

Открываем окно с DataTreeGrid (в данном примере отображены все папки из директория "Program Files", Вы можете загрузить подобную структуру по кнопке "Загрузить папки из директория"):
Дерево для поиска

Допустим, в дереве Вам необходимо найти библиотеку картинок программы Skype. В поле ввода быстрого фильтра набираем текст "Skype" и нажатием Ctrl-S включаем бытрый фильтр, который будет включен при переходе в режим отображения список.
Ввод параметров быстрого фильтра

Переключение просмотра в режим "Список" нажатием Ctrl-Q, после чего можно выбрать необходимую запись:
Переключение в режим

После того, как Вы нашли искомую запись - переключаемся в режим просмотра "Дерево" (Ctrl-Q):
Переключение в режим дерево и позиционирование на найденной записи

Пример сервисов для работы быстрого фильтра в дереве Вы можете найти в присоединенном архиве TreeQuickFilter_Example.rar.

Основные моменты реализации:

Переключение режима "Дерево / Список" осуществляется подстановкой значения свойства "ParentDataFieldName" компонента DataTreeGrid поля "ParentID" если мы хотим видеть дерево или "ID", если нам нуже список (в данном случае возможно переключение без перезапроса данных в базе данных):

function SwitchTreeListViewType() {
        var ParentDataFieldName = grdData.ParentDataFieldName;
        if (ParentDataFieldName == 'ParentID') {
                grdData.ParentDataFieldName = 'ID';
                cbQuickFilter.IsEnabled = true;
        } else {
                grdData.ParentDataFieldName = 'ParentID';
                cbQuickFilter.IsEnabled = false;
        }
        UpdateQuickFilter();
}

Выбор директория для загрузки в таблицу структуры папок:

function LoadFoldersFromDirectory() {
        var FolderNameObject = System.CreateObject('TSObjectLibrary.Value');
        if ((System.SelectDirectory("Выберите папку", '', FolderNameObject))) {
                var FolderName = FolderNameObject.Value;
                var Dataset = dlData.Dataset;
                LoadDirectoryItemsFromFolder(FolderName, Dataset);
        }
}

Загрузка структуры директория осуществляется с помощью рекурсивной функции:

function LoadDirectoryItemsToDataset(Path, Dataset, ParentID) {
        try {
                var Folder = FileSearchGridArea.FSO.GetFolder(Path);
                var Folders = new Enumerator(Folder.SubFolders);
                for (Folders.moveFirst(); !Folders.atEnd(); Folders.moveNext()) {
                        var Item = Folders.item();
                        var Name = Item.Name;
                        var Path = Item.Path;
                        var ID = AddFolderToDataset(Dataset, ParentID, Name, Path);
                        LoadDirectoryItemsToDataset(Path, Dataset, ID);
                }
        } catch(e) {
                ShowErrorDialog(e.message);
        }
}

Обработка горячих клавиш осуществляется в событии OnKeyDown DataTreeGrid:

function DoKeyDown(Control, Key, Shift) {
        var CtrlDown = (Shift & 4) > 0;
        if (CtrlDown) {
                var QKeyCode = 81;
                if (Key.Value == QKeyCode) {
                        SwitchTreeListViewType();
                }
                var SKeyCode = 83;
                if (Key.Value == SKeyCode) {
                        cbQuickFilter.IsChecked = !cbQuickFilter.IsChecked;
                }
        }
}

Данный вариант работы с деревом имеет свои ограничения:

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

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

Используйте на здоровье.

Нравится

Поделиться

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

Автору - спасибо!
Разработчикам - быстрый фильтр в ядре для компоненты DataTreeGrid!

--
γνῶθι σεαυτόν

А в чем сложности при организации подгрузки узлов дерева по требованию? И с большими объемами бы тогда работалось нормально.

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

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

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

Спасибо. Пригодилось!

Мне тоже пригодилось. Спасибо :smile:

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