На данный момент у нас Terrasoft 3.3.2.307 SQL сервер 2008 10.0.6000.29 SP4 Standard Edition (64-bit). Планируем обновить SQL-сервер до версии 2014.
Вопрос: для приложения\баз Terrasoft надо какие-нибудь манипуляции делать, может какие то подводные камни есть и нужна определенная последовательность действий?
Создан справочник. Открываю справочник, выбираю данные, сохраняю "ОК". После повторного открытия справочника-открывается только прежний выбранный продукт. Приходится перезагружать TS. Что нужно прописать в function dlDataOnDatasetDataChange(DataField), чтобы не происходило "залипание"?
Добрый день!Версия 3.4.1.142
В разделе "Продажи" (я переименовал в Накладные), созданы стандартные луповидные справочники Продукт и Документ. При первом открытии всё подгружается, при повторном - открывается только ранее открываемый. В файле на 10 листе отмечен алгоритм синим цветом
Если Вам нужно получить значения из датасета ds_Offering по полю ID, то делать это нужно по-другому - брать нужно не LookupDataset, а отдельный экземпляр датасета, который можно получить следующим образом:
var Dataset = GetSingleItemByCode('ds_Offering', 'OfferingDataset')
Для него и нужно применять фильтры и получать нужные значения.
Также для понимания того, почему может возникать такая ситуация, рекомендую отладиться и посмотреть, какие данные поступают на вход и что вы получаете на выходе.
Доброе время суток, Алла! Большое спасибо, что написали.
Вы мне очень помогли!!!
Я "чайник" в программировании, но методом тыка, проб и ошибок - немного получается. Обычно копирую уже созданные алгоритмы и подставляю в разные разделы.
Есть ещё один вопрос!
-На основании Инцидента создаю Документ.
-При открытии Инцидента в полях справочника Документ и справочника Состояние Документа дублируются значения созданного Документа.
-При изменении состояния Документа, автоматически меняется показатели в Инциденте scr_DocumentEdit :
//-------------------------//-----------------------//------------------------
function btnOKOnClick(Control) {
var Dataset = BaseDBEdit.Dataset;
if (CheckItemNumberDuplicate('Document', Dataset, 'DocumentNumber', "Документ")) {
//-------------------------------Подгрузка данных Документа в Инцидент !!!
var IncNumber = Dataset.Values('IncidentID');
var DocumentID = Dataset.Values('ID');
var DocumentStateID = Dataset.Values('StateID');
}
var IncDataset = Services.GetNewItemByUSI('ds_Incident');
if (!IsEmptyValue(IncNumber)){
ApplyDatasetFilter(IncDataset, 'ID', IncNumber, true);
IncDataset.Open();
IncDataset.Edit();
-Повторил данный код в wnd_IncidentEditScript :
//------------------------//-------------------------//------------- //1
function btnOKOnClick(Control) {
var Dataset = BaseDBEdit.Dataset;
if (CheckItemNumberDuplicate('Incident', Dataset, 'IncidentNumber', "Инцидент")){ // !!!
//------------------------Подгрузка данных Инцидента в Документ !!!
var DocNumber = Dataset.Values('DocumentID');
var Incident = Dataset.Values('ID');
var IncidentStatus = Dataset.Values('StatusID');
}
var DocDataset = Services.GetNewItemByUSI('ds_Document');
if (!IsEmptyValue(DocNumber)){
ApplyDatasetFilter(DocDataset, 'ID', DocNumber, true);
DocDataset.Open();
DocDataset.Edit();
DocDataset.Values('IncidentID') = Incident;
DocDataset.Values('IncidentStatusID') = IncidentStatus;
DocDataset.Post();
DocDataset.Close();
}
//------------------------------------------------------------
- но действий не происходит...
Мне не совсем понятно, какую именно задачу Вы хотите решить такой реализацией.
Если нужно, чтобы при изменении состояния документа изменялись значения в карточке редактирования инцидента, то реализовывать ничего специально не нужно. В запросе на выборку в таблице tbl_Incident нужно указать, что поле состояние документа, выбирается из той же таблицы, что и сам документ.
После сохранения карточки документа значения автоматически подтянутся при открытии карточки инцидента.
Аналогично для инцидента.
Получается, что вы неправильно построили запросы на выборку.
Добрый день! На протяжении примерно пары лет у нас наблюдаются зависания системы с последующей необходимостью "убивать" процесс, ранее ваши коллеги советовали чистить кэш - проблема стала проявляться реже, но все же осталась (не критично), но последнее время стала снова проявляться чаще, а так же увеличилось время обработки процессов системы именно клиентом у некоторых пользователей (прямую зависимость найти не удалось). Может ли быть связана эта проблема с переходом пользователей на Win 7 64x с Win 7 32x? Возможно у вас появились обновленные бинарные файлы после 3.3.2.307, которые могли бы помочь, или же имеются другие версии, которые объективно лучше работают на Windows 7 64x? Спасибо!
Причины возникновения проблемы могут быть самые разные. Для генерации решения нужно определить её источник (база данных, аппаратное обеспечение сервера или клиентские места). В момент возникновения замедлений проверить у всех ли пользователей это происходит одновременно. Если «да», то обратить внимание на сервер, в частности, на загрузку ЦП и оперативной памяти. Если там всё в порядке, тогда нужно моделировать ситуацию и в это время с помощью утилиты «SQL Server Profiler» пробовать отследить проблемные запросы к базе для возможности их оптимизации. Следующий этап – это проанализировать зависит ли замедление от пользователя, админ\не админ (играют ли роль права доступа). На скорость работы (время отклика системы), также, может влиять количество колонок, которые отображаются в реестре записей (желательно лишние спрятать), наличие сортировки по каким-то из полей реестра (убрать сортировку можно зажав Ctrl и кликнув по полю).
Со временем может быть нарушена структура индексов базы данных (создаются для ускорения выборки данных). Их можно перестроить при помощи скрипта Reindex.rar (во вложении). Рекомендации по выполнению скрипта – во вложении. После выполнения скрипта создаётся хранимая процедура «sp_reindex_all_tables». Её нужно запустить на выполнение. В зависимости от количества индексов, размера базы данных и ресурсов сервера выполнение данной процедуры может занять достаточно продолжительное время при этом нагружая сервер. В связи с этим, если вы будете пересоздавать индексы, рекомендую запускать процесс, когда пользователи не работают с системой. Перед этим обязательно создайте резервную копию базы данных.
Если у вас есть проектные решения стоит обратить внимание и на этот момент. Возможно есть нюансы реализации дополнительной логики.
Последние бинарные файлы версии 3.3.2.313. Для их получения Вы можете обратиться в службу поддержки.
Однако, не уверенна, что одно только обновление файлов решит проблему.
Разбираться с данной ситуацией нужно комплексно, так как причины могут быть самые разнообразные.
Алла сказала верно, что причины возникновения могут быть самые разные. Но раз вы пользуетесь Клиент-Серверным приложением, версии 3.3.2, то я бы обратил внимание в каких именно бизнес-процессах происходит зависание, в каких именно разделах происходит зависание, в каких именно деталях происходит зависание. И уже после этого стал анализировать в первую очередь SQL запросы, что работают в разделе, деталях, карточках редактирования в бизнес-процессах. ведь неправильно составленные и оптимизированный SQL запросы дают в первую очередь такой эффект. В бизнес-процессах я бы чтобы найти ошибку или зависание в первую очередь произвел бы оптимизацию, путем деления больших процессов на более мелкие, чтобы именно в каждой маленькой сущности искать уже проблемы. Если нужна помощь советом более подробно пишите, буду рад вам помочь.
Причины действительно могут быть разные, но в данной ситуации у нас следующие факты и на большинстве рабочих мест кейсы отрабатывают в два раза дольше:
При сравнении рабочего места быстрого и медленного был проведен следующий анализ:
- Запросы на сервере отрабатывают быстро
- Время обработки запросов на сервер в одних и тех же кейсах для разных рабочих мест примерно одинаковое и не зависит от конкретного времени (очень редко зависит от определенного времени в течении дня)
- Сервер мониторили - ЦП оперативки с большим запасом
- Для надежности кэш почистили на всех рабочих местах
- Проверяли под одним и тем же пользователем Terrasoft на разных рабочих местах, давали пользователю права локального админа на рабочее место, запускали Terrasoft от имени администратора.
- Проводили полную установку Terrasoft и пользовательскую.
- Рабочие места где происходит разница во времени не зависят от места расположения комнаты в офисе, сети и операционной системы (у нас либо Win 7 64 либо 32)
- Не зависит от железа компьютера, на более медленных машинках (на пример 4 гб, в место 8 Гб) наблюдались более длительное время выполнение, причем не зависело от количества запущенных в дополнении приложений.
- Самое главное, при всех сравнения и экспериментах время выполнения кейсов не менялось (на разных рабочих местах) например на одном 4 сек сохранение проекта, под другим 8 сек. И чтобы мы не делали значения там где медленее не менялось в лучшую сторону. Мы разбили даже код на куски и производили логирование по частям исполняемого кода, в результате мы не нашли конкретных проблемных мест в основном мы наблюдали пропорциональное возрастание времени исполнения кода на клиенте на разных рабочих местах, при этом сервер обрабатывал запросы одинаково.
- У нас проектное решение
А профайлер на sql сервере в самих запросах не помог выявить проблемные запросы с длительным выполнением?
Проблема то в коде скорее всего... либо тяжелые запросы, либо неаккуратные скрипты при сохранении записей, в любом случае это надо брать базу и тестировать.
Добрый день!
Проблема зависаний действительно есть и с ней я столкнулся опять совсем недавно.
Нужно было в карточке проставить связанные продажи. Попросили пользователей создавать продажи и потом выбирать их в карточке.
Значения для поля продажа в карточке фильтруются OnPrepareSelectWindow. Заполнить надо было около 800 карточек.
Так вот после 40-50 заполнений система зависала или вываливалась ошибка, не связанная с конкретным кодом. Анализ показал, что клиентское приложение так себя ведет когда начинает использовать память больше определенного значения. А занимаемая память увеличивается после открытия каждой карточки или датасета. И не освобождается.
Подчеркиваю. Проблема не с сервером, а именно на клиентских машинах. Самое смешное, что физической памяти на компах еще много в этот момент, но клиент выше определенного предела видимо использует ее некорректно. И это не зависит от x64. Я повторил такую же проблему у себя на ноуте, где x32.
Уважаемые разработчики! Можно ли это как то исправить? Это сильно мешает работать и портит впечатление от в целом неплохой системы. Могу попробовать помочь симулировать ситуацию на базовой конфигурации.
Повторюсь, но причины возникновения проблем с производительностью могут быть разнообразные и не факт, что проблема, о которой пишет автор поста, такая же, с которой столкнулись Вы.
Вероятно, Вы пользуетесь не самой последней версией приложения Terrasoft.
На сегодняшний день последней версией Terrasoft является версия 3.4.1.186.
Добрый день, Алла.
Мы как и автор темы используем конфигурацию версии 3.3.2. и насколько я знаю использовать клиента 3.4.1 несколько невозможно. Или я ошибаюсь?
Для 3.3.2. последние бинарники вчера получил.
"Гетманенко Виктор" написал:использовать клиента 3.4.1 несколько невозможно. Или я ошибаюсь?
Денежку за использование лицензий 3.4.1 заплатите и используйте просто новые бинарники, без перевода конфигурации на новую версию.
Про переполнение памяти на клиенте - либо проблема бинарников, либо что более вероятно криво написанный код в том месте, использование которого вызывает переполнение...
Как выше написал Александр, утечка памяти может происходит в коде, например, при открытии карточки редактирования мы создаем глобальный объект, который не уничтожаем по закрытию карточки редактирования.
это безобидная функция добавления записи... и вызывается она в коробке вроде только из scr_Access функции AddAccessRecord... т.е добавление прав доступа.
Внутри у нее Append, Post - вот видимо они память и жрут... ну в любом случае тут надо предметно отладкой заниматься :)
Добрый день, коллеги! Выявили одну, по нашим догадкам, из основных проблем. Проблема с сортировкой - стандартный функционал позволяет сортировать разделы, но в трейсе (преобразовав в запрос) четко видно, что основное время затрачивается на сортировку (например по типовому полю «дата начало» - 1 мин 30 сек (при этом мы закомментили из запроса большинство полей (иначе еще дольше) оставив - ID, Название , номер и дату старта). Без сортировки меньше секунды.
Подскажите, в чем может быть проблема сортировки?
Антон, судя по тексту запроса,дата начала — это не просто поле, она вычисляется отдельным подзапросом с достаточно сложным условием из EXISTS и NOT EXISTS. И при сортировке по ней запрос будет выполняться долго в любом случае, хоть его запустить из Terrasoft, хоть напрямую запустить этот код из Management Studio.
Доброго времени суток. Столкнулся со следующей задачей:
При копировании операции в разделе продажи, чтобы менялась "дата От:" на текущую, а также копировались права доступа.
У меня совсем нет опыта в работе с Terrasoft, поэтому прошу помощи профессионалов.
1. Для того, чтобы при копировании поменялось значение поля, нужно в обработчике события OnDatasetAfterAppend датасета даталинка прописать такой код:
if (BaseDBEdit.IsCopy) {
//TO DO присвоение нужного значения полю
}
2. Для копирования прав доступа нужно в обработчике кнопки OK прописать вызов функции копирования прав доступа CopyRight:
function btnOKOnClick(Control) {
scr_BaseDBEdit.btnOKOnClick(Control);
if (Self.Attributes('IsCopy')) {
var RecordID = Self.Attributes('RecordID');
CopyRight(Self.Attributes('SourceRecordID'), RecordID);
}
}
function CopyRight(OldRecordID, NewRecordID) {
var InsertSelectQuery = GetSingleItemByCode('isq_CopyRight');
var Columns = InsertSelectQuery.SelectQuery.Columns;
var ConstColumn = Columns.ItemsByAlias('NewRecordID');
ConstColumn.ColumnValue = NewRecordID;
SetParameterValue(InsertSelectQuery.Parameters, 'OldRecordID', OldRecordID);
SetParameterValue(InsertSelectQuery.Parameters, 'MyAdminUnitID',
Connector.CurrentUser.ID);
try {
InsertSelectQuery.Execute();
}
catch(e) {
CatchException(e);
}
}
где isq_CopyRight - сервис InsertSelect Query, который Вы можете реализовать самостоятельно по аналогии с подобным сервисом, структуру которого можно увидеть на скриншоте в прикрепленном к данному посту файлу.
Добрый день! у меня проблема с программой, я создаю файл dataset для своего fast report, но при добавлении полей справочника программа закрывается, Microsoft Script Debugger у меня установлен, данную ошибку не отслеживает, клиентская часть работает вроде нормально, помогите решить данную проблему.
создаю сервис dataset, и добавляю в нем поля типа справочник, у справочнику указываю источник из другого dataset, родительського, тот, который нужен, он добавляется, затем программа вылетает ((, но потом зайти на dataset невозможно, программа вылетает при попытке зайти на dataset ((.
1) Вы добавляете поля в тот датасет, который находится в архиве?
2) Какие именно поля Вы добавлете, что указываете в качестве источника?
3) Возникает ли эта ошибка, если Вы пытаетесь добавить такое же поле в другой датасет или только в этот?
Эта информация нужна, чтобы установить причину ошибки.
1) нет, у свой созданый датасет
2) добавляю поле customer, типу справочника, указиваю в нем источник ds_Account, дальше сохраняю, пробую вернуться и выбивает ошибку
3) да, возникает, уже все перепробовал
1) Сервис в архиве тоже назвается ds_TestReport и содержит те же поля. Он у меня открывается без ошибок.
2) Для анализа проблемы выложите ещё сервис отчета fr_TestReport (также, если, как Вы утвержаете, select query и dataset отличаются от тех, которые находятся в предыдущем комментарии в архиве, добавьте и их).
Также рекоммендую обратиться в службу поддержки и запросить последние бинарные файлы для обновления текущей версии Terrasoft.
Если Вы планируете выводить данные по курсу валют или погоде, полученные с других сайтов, можно использовать блок итогов web-страница. При ее настройке Вам достаточно указать ссылку на страницу, с интересующей Вас информацией и она будет выведена в разделе "Итоги"
Блок итогов “Виджет” отображает дополнительные виджеты, настраиваемые разработчиком, например, виджет курсов валют, виджет погоды.
Как мне поэтапно создать виджет, например курса валют, но задача построить таблицу, хотел разобраться как использовать виджеты? На сколько я понимаю нужно создать свой модуль и в настройка вызвать его, но что для этого нужно и что необходимо писать в параметрах модуля?
1) Создаёте свой виджет в конфигурации, создать модуль
2) Переходите в раздел [Итоги]
3) Через меню «Изменить», выбираете добавить виджет
4) В открывшихся настройках модуля, выбираете свой модуль
5) При необходимости указываете параметры и сообщение
Что касается самих модулей, добавляю информацию по ним во вложение. Также, достаточно подробная информация доступна в SDK.
Примеров готовых виджетов погоды и курса валют предоставить не смогу. Однако, тут и вот тут доступна полезная информация по их созданию.
Владимир, видео добавлено в модуле SectionDesigner, блок SystemDesignerVideo. Можно попробовать заместить модуль и добавить вместо видео необходимый виджет.
Добрый день! помогите сделать в карточке контакты следующую вещь, при выборе приветствие чтобы сразу выпадал пол согласно приветствие, так как показано на скриншоте.
Для реализации такой функциональности нужно в обработчике OnDatasetDataChange Datalink карточки редактирования контакта выполнять проверку:
if (DataField.Name == 'SalutationID') {
// TO DO
}
А в теле if делаете проверку:
if (DataField.Value == [ID значения госпожа]) {
dlData.Dataset('GenderID') = [ID значения Женский];
} else
if... // по аналогии прописываете проверку для Мужской
Посмотреть значения для поля [Приветствие] можно в таблице tbl_Salutation, а для поля [Пол] - в перечислении enm_Gender.
function dlDataOnDatasetDataChange(DataField){
var Dataset = DataField.ParentDataFields.ParentDataset;
var DataFieldName = DataField.Name;if(DataFieldName.indexOf('Communication')==0){
var Index = DataFieldName.substr(13, 1);
var CommTypeDataControl =
Self.ComponentsByName('edtCommunication'+ Index +'Type');
var CommDataControl =
Self.ComponentsByName('edtCommunication'+ Index);
RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
(DataFieldName.indexOf('Type')>-1));}if(!ContactEdit.IsUpdating){switch(DataFieldName){case('AccountID'):if(!IsEmptyStr(DataField.DisplayValue)){
ContactEdit.IsUpdating=true;try{
FillInformationBySelectedItem(Dataset, DataField.Value,
DoYouWantToFillContactEntriesMessage);} finally {
ContactEdit.IsUpdating=false;}}break;}}if(DataField.Name=='SalutationID'){if(DataField.Value=='1F87FD97-A663-4C02-8530-48951F912C6B'){
dlData.Dataset('GenderID')='8CB0B216-3E35-47CE-8C31-8DFAA3C1548D';}elseif(DataField.Value=='E285E1C6-841C-45CE-B5CD-B256C445DFFB'){
dlData.Dataset('GenderID')='264EF705-6CC4-4E2F-9611-45531D04CBE7';}}}
Есть такой элемент добавления.
есть таблица А в которую нужно вставить некоторое количество записей из таблицы Б
Нужно в А.Поле1 записать значение (Если Б.Поле1==1 то Параметр1*Б.Поле2 Иначе 0)
-------------------------------------
Также интересует как с помощью БП можно увеличить значение поля в конкретной записи(нипример контакта), например увеличить числовое поле год на 5.
Виталий,
1. При работе с массивом в элементе добавление данных выполнить дополнительные арифметические действия не получится. Задачу можно решить в 2 этапа.
- Добавлять выборку из таблицы Б в таблицу А.
- Создать второй процесс по стартовому сигналу добавления записи в объекте А. Выполнять интересующие проверки, манипуляции и т.д.
2. Увеличить значение поля в определенной записи:
- элемент читать данные. По заданному условию найти интересующую запись.
- элемент изменить данные.
Если интересующее поле с типом Целое – [Читать данные. Первый элемент коллекции. Название поля] + 5
Если тип поля DateTime - [Читать данные. Первый элемент коллекции. Название поля].AddYears(5)