Вопрос

Доброго дня.

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

После выбора группы и прокрутки отобразившегося списка продуктов, в консоли выводятся запросы, которые система направляет в БД.

По окончанию списка продуктов и прокрутке вниз (в этой же области списка) запросы продолжают отправляться в БД, несмотря на то, что все продукты уже прогружены.
Получается, что система всё-равно пытается найти подходящие продукты, отчего система принимает на 1-2 секунды режим загрузки.

Почему так происходит и должна ли по логике система слать запросы в БД, если все продукты группы уже загружены?

У меня такой же вопрос

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

Доброе утро.

Это на последней версии наблюдается такое поведение системы?

Алла Савельева,

доброго дня, Алла.

Версия 7.13.1.769

Не совсем понятно, о каких «запросах в БД», которые «выводятся в консоли» речь. Вы имеете в виду «Инструменты разработчика» в браузере или профайлер из MS SQL?

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

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

На сегодняшний день актуальной текущей версией является 7.14.4, поэтому лучше проверять сразу на ней.

Дарья Сошина пишет:
Версия 7.13.1.769

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

Алла, спасибо, когда заказывал демку, её ещё не давали. Сейчас, по идее, совсем скоро должна уже 7.15 появиться.

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

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

Алла Савельева,

Попробовала на демке 7.14.4. Индицент не повторился. В действительности, как Александр подметил, была доработка окна выбора.

Зверев Александр пишет:
Не совсем понятно, о каких «запросах в БД», которые «выводятся в консоли» речь. Вы имеете в виду «Инструменты разработчика» в браузере или профайлер из MS SQL?

В консоли браузера при скролле наблюдала формирование запросов. 

Могла ли доработка так повлиять на поведение системы и можно ли это как-то проверить?

Могла, конечно. Мы же не знаем, что это за доработка. Проверить можно, оставив Вашу  7.13 без неё (например, подняв старый бекап и подключив сайт к нему) или накатываем доработанных схем на 7.14.

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

Всем доброго времени суток.
Хотелось бы узнать если ли возможность в элемент бизнес-процесса "Задание-сценарий" вставить запрос к базе данных и если есть, то можно хоть самый простой пример c Select.

У меня такой же вопрос

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

Сергей, такая возможность есть.
Пример можно посмотреть на академии в этой статье.

Спасибо Наталия. Буду разбираться.

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Коллеги, добрый день!

При настройке системы иногда возникает потребность внесения ряда изменений на уровне базы данных.
Наш бесплатный модуль для bpm’online позволяет техническим специалистам осуществлять выборки из базы данных и выполнять SQL-команды наиболее удобным способом и без потери времени.
Особенно эта возможность актуальна для пользователей сайтов on-demand, когда доступ к базе данных ограничен.

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

SQL

Будем рады ответить на ваши вопросы!

С уважением,
Зайчиков Илья
Менеджер продуктов
ООО «Программные Технологии»
Центр разработки и внедрения Террасофт Поволжье
Тел. +7 (846) 266-55-69
Email: galanin@samarasoft.com
samarasoft.com

Поделиться

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

Насколько понимаю, это развитие Вашей же утилиты под 5.Х?

Александр, Добрый день!

Да, всё верно. Эта версия позволяет более удобно выполнять SQL запросы в интерфейсе 7.X, в новой версии появилась подсветка синтаксиса языка SQL, возможность настроить разграничение доступа к данному модулю, выполнять одновременно несколько select запросов (как это позволяет делать SQL Management Studio), выполнять сортировку полученных результатов и обрабатывать ошибки в случае некорректного написания SQL-команды.

С уважением,
Зайчиков Илья

Бесплатно, но "спасибо" оставлю :)

Сходил по ссылке, заявку оставил, да так мне и не дали чудо утилиту... :cry:

Александр, Добрый день!

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

С уважением,
Зайчиков Илья

"Зайчиков Илья Алексеевич" написал:А утилиту мы конечно же предоставим!

Еще раз отправил заявку))

Александр,

Я уже вам отправил ссылку для скачивания в скайп.

С уважением,
Зайчиков Илья

"Зайчиков Илья Алексеевич" написал:Я уже вам отправил ссылку для скачивания в скайп.

Поймал, спасибо огромное

Александр,

Всегда рады помочь!

С уважением,
Зайчиков Илья

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

Коллеги, приветствую.

Есть некоторый запрос к базе данных, полученный с использованием класса SELECT (считывается информация о платежах за период по ФИО должника.):

var selectPaymentsRegister = (Select)new Select(userConnection)
        .Column("c", "Surname").As("Surname")
        .Column("c", "GivenName").As("Name")
        .Column("c", "MiddleName").As("MiddleName")
        .Column("c", "Name").As("FullName")
        .Column("c", "Phone").As("Phone")
        .Column("c", "Address").As("Address")
        .Column("up", "UsrPaymentSum").As("Amount")
        .Column("up", "UsrPaymentDate").As("AmountDate")
        .From("UsrPayments").As("up")
        .Join(JoinType.Inner, "Contact").As("c")
        .On("up", "UsrDebtorId").IsEqual("c", "Id")
        .Where("c", "Surname").IsEqual(Column.Parameter(debtorSurname))
        .And("c", "GivenName").IsEqual(Column.Parameter(debtorName))
        .And("c", "MiddleName").IsEqual(Column.Parameter(debtorMiddleName))
        .And("up", "UsrPaymentDate").IsGreaterOrEqual(Column.Parameter(dateBegin))
        .And("up", "UsrPaymentDate").IsLessOrEqual(Column.Parameter(dateEnd))

        as Select;

Далее, с использованием IDataReader в цикле я получаю значения полей.

Как составить такой же запрос, но с использованием EntitySchemaQuery? Хочу подробнее разобраться в этой теме.

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

У меня такой же вопрос

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

Здесь вся доступна инфа по ESQ - http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/UsingEntit…. Должно помочь.

Здравствуйте, Илья! Спасибо.

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

Добрый день!
Бывают к примеру фильтры сравнения
filterGroup1.add("ServiceItemFilter", scope.Terrasoft.createColumnFilterWithParameter(
scope.Terrasoft.ComparisonType.EQUAL, "[ServiceEngineer:Engineer].ServiceItem", serviceItem.value));
}

фильтры проверки на null
filterGroup2.add("TerritoryNullFilter", scope.Terrasoft.createColumnIsNullFilter(
"[ServiceEngineer:Engineer].UsrNeedTerritory"));

А подскажите, пожалуйста, синтаксис фильтра like?
Допустим, я хочу исключить все группы в название которых входит Группа руководителей
Каков синтакис?

У меня такой же вопрос

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

Попробуйте, использовать для этой задачи NOT IN фильтр на ESQ?

var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
   someCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;

вы имеете в виду создать коллекцию someCollection, в которую бы входили группы с названием "Группа руководителей", а потом ее исключить из выбора?
Да, наверное, это вариант.
Хорошо, спасибо, попробую

вы имеете в виду создать коллекцию someCollection, в которую бы входили группы с названием "Группа руководителей", а потом ее исключить из выбора?
Да, наверное, это вариант.
Хорошо, спасибо, попробую

хотя вопрос остается)
даже если это фильтр на ESQ

Допустим, есть такой фильтр
- этот фильтр отбирает записи, у которых поле UsrTest = значению somecaption
esq.filters.add("filterCase", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrTest", somecaption));
каким образом должен выглядеть фильтр, отбирающий записи, в название которых (поле UsrTest в примере) входит значение somecaption?

Здравствуйте, Дарья!

1) Откройте консоль браузера, находясь в Вашей CRM системе
2) Начните писать в консоли Terrasoft.ComparisonType.
В результате система Вам предложит все типы сравнения - просто выберите нужный. В условиях Вашей задачи - это CONTAIN.

Спасибо, Алексей, попробую

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

Коллеги, приветствую.

Есть определенный интерес поизучать классы Select, Insert, Update, EntitySchemaQuery и подробнее
разобраться, как с ними работать.

Чтобы это было проще и быстрее мне бы хотелось иметь возможность работать с ними из MS Visual Studio.

Например, запрос из статьи Использование EntitySchemaQuery для построения запросов к базе данных:

// Создание экземпляра запроса, добавление в запрос колонок и источника данных.
Select selectQuery = new Select(UserConnection)
                    .Column("Id")
                    .Column("Name")
                    .From("Contact");
// Выполнение запроса к базе данных и получение результирующего набора данных.
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection())
{
    using (IDataReader reader = selectQuery.ExecuteReader(dbExecutor))
    {
        while (reader.Read())
        {
            // Обработка результатов запроса.
        }
    }
}

Собственно, вопрос в конфигурировании класса UserConnection, как его использовать "вне платформы", не в режиме отладки?

Например, в методе Main:

static void Main(string[] args)
{
}

В элементе "Задание- сценарий" я могу получить его таким образом:

var userConnection = Get("UserConnection");

В Web- сервисе WCF:

var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

У меня такой же вопрос

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

Здравствуйте.
Если сайт у вас развернуть on-site, то есть, поднят на своем IIS сервере:
Тогда у вас есть возможность написать свой, к примеру, веб-сервис, или даже скрипт-сценарий, и пользуясь статьей по отладке,
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ServerCode…
ставить точки останова, и изучать поведение серверного ESQ.
Здесь главное, что бы код был частью системы, поэтому его и нужно писать как часть системы (веб-сервис, бизнес-процесс, и.т.д.), а не сторонние dll,exe,итд.
С автономной программы этого сделать не получится.

Если же сайт on-demand, то есть, развернут как http://имя-сайта.bpmonline.com/
То такой возможности у Вас нет, и со стороннего процесса (программы), Вы никак не обратитесь к ядру системы.
Из сторонних программ написанных Вами в Visual Studio, Вы можете разве что обратится к уже написанным веб-сервисам в рамках структуры сайта, либо же по протоколу OData,
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.4.1/WorkWithBp… что, конечно же, совсем не запросы ESQ.

Александр, спасибо большое за ответ!

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

Коллеги, приветствую.

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

SELECT
        TOP 1  
        ContactId as id,
        AC.CreatedOn as activityDate,
        UP.CreatedOn as paymentDate

FROM
        Activity as AC INNER JOIN UsrPayments as UP
                ON AC.ContactId = UP.UsrDebtorId
WHERE
        UP.CreatedOn  > AC.CreatedOn

ORDER BY AC.id ASC;

И есть некоторый код на C#, где с помощью класса Select проделывается то же, но считываются записи по всем активностям:

var selectNewPayments = (Select)new Select(userConnection)
                .Column("t1", "ContactId")
                .Column("t1", "CreatedOn")
                .Column("t2", "CreatedOn")
                .From("Activity").As("t1")
                .Join(JoinType.Inner, "UsrPayments").As("t2")
                .On("t1", "ContactId").IsEqual("t2", "UsrDebtorId")
                .Where("t1", "CreatedOn")
                .IsLess("t2", "CreatedOn") as Select;

Как прочитать только первую запись?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

У меня такой же вопрос

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

Нашел, собственно -

var selectNewPayments = (Select)new Select(userConnection)
   .Top(1)
   .Column("t1", "ContactId") 
   .Column("t1", "CreatedOn")
   .Column("t2", "CreatedOn")
   .From("Activity").As("t1")
   .Join(JoinType.Inner, "UsrPayments").As("t2")
   .On("t1", "ContactId").IsEqual("t2", "UsrDebtorId")
   .Where("t1", "CreatedOn").IsLess("t2", "CreatedOn").OrderByAsc("t1", "id") as Select;
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день, коллеги!

Имеется примерно такой запрос:

var newSelect = new Select(CurrentUserConnection)
        .Column("Table1", "Column1").As("Column1")
        .From("Table1").As("Table1")
        .Where("Table1", "Column2").IsNotEqual(  ...  ) as Select;

И имеется некоторая коллекция значений, к примеру:

List myList = new List();

Вопрос в следующем: Каким образом можно в условие запроса передать список значений моей коллекции (будь то Array, ArrayList, List, Dictionary, Hashtable, SortedList или другое - значения не имеет)?

Условно говоря, мне нужно мою коллекцию представить в виде типа "Select", чтобы можно было использовать в месте отмеченном 3-мя точками, - это если следовать сигнатуре этих методов, согласно описанию из SDK (www.terrasoft.ru/bpmonlinesdk/). Но как это сделать? Прошу помощи!

У меня такой же вопрос

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

Виталий, для этого нужно использовать конструкцию .Not().In(массив_или_список_идентификаторов) .
Пример использования (схема EditSynchUserInSynchRole):

var ldapGroupsIds = new List<QueryParameter>();
	var ldapUserLoginAttribute = SysSettings.GetValue(UserConnection, "LDAPUserLoginAttribute").ToString();
	using (var ldapUtils = new LdapUtilities(UserConnection)) {
		var usersCollection = ldapUtils.GetUsersAttributesByFilter(ldapUserLoginAttribute + "=" + ldapEntry, new [] {"distinguishedName"});
		var userDn = string.Empty;
		foreach (SearchResultEntry user in usersCollection) {
			userDn = user.DistinguishedName;
			break;
		}
		var ldapGroupIdentityAttribute = SysSettings.GetValue(UserConnection, "LDAPGroupIdentityAttribute").ToString();
		var groupsCollection = ldapUtils.GetGroupsAttributesByFilter("member=" + userDn, new [] {ldapGroupIdentityAttribute});
		foreach(SearchResultEntry group in groupsCollection) {
			ldapGroupsIds.Add(new QueryParameter(ldapUtils.IdentityAttributeToString(group.Attributes[ldapGroupIdentityAttribute][0])));
		}
	}
 
	if (ldapGroupsIds.Count < 1) {
		return true;
	}
 
	var delete = new Delete(UserConnection).From("SysUserInRole").
	Where("SysUserId").IsEqual(Column.Parameter(userId)).
	And().Exists(new Select(UserConnection).
		Column("Id").From("SysAdminUnit").
		Where("SysUserInRole", "SysRoleId").IsEqual("SysAdminUnit", "Id").
		And("SynchronizeWithLDAP").IsEqual(Column.Parameter(true)).
		And("LDAPEntryId").Not().In(ldapGroupsIds));
	delete.Execute();

Если же передавать массив, то так (схема AdministrativeGrantedRightsGridPage):

	object[] objectParameters = new object[adminUnitCollection.Count];
	for (int i = 0; i < adminUnitCollection.Count; i++) {
		objectParameters[i] = adminUnitCollection[i];
	}
}
var entitySchemaManager = Page.UserConnection.EntitySchemaManager;
var rightsSchema = entitySchemaManager.GetInstanceByName("SysAdminUnitGrantedRight");
var select = new Select(Page.UserConnection)
		.Column(rightsSchema.Name, "Id")
		.Column(rightsSchema.Name, "GrantorSysAdminUnitId")
		.Column("Grantor", "Name").As("GrantorSysAdminUnitName")
	.From(rightsSchema.Name)
	.InnerJoin("SysAdminUnit").As("Grantor").On("Grantor", "Id").IsEqual(rightsSchema.Name, "GrantorSysAdminUnitId")
	.Where(rightsSchema.Name, "GranteeSysAdminUnitId").In(Column.Parameters(objectParameters))
	.OrderByAsc("Grantor", "Name") as Select;

Хм... Честно говоря, если судить по информации из SDK (http://i.piccy.info/i9/fa961117bdc660b65920ae24393d4c3e/1452507140/1535…), то оператор "In()" не принимает произвольную коллекцию, потому и решил переспросить. Во всяком случае, вопрос закрыт. В очередной раз спасибо Вам, Александр!

Я тоже думал, что только массивы из Object, но оказалось, что не только массивы.
В первом примере обратите внимание, что коллекция из элементов именно типа QueryParameter.

А это действительно важно, использовать именно тип "QueryParameter"? Т.е., к примеру:

List<Guid> guids = new List<Guid>();

нельзя использовать? Или тот же тип "string"? В том же SDK есть только такой пример: http://i.piccy.info/i9/7c65675471d92405256ab8d1e300693f/1452512386/1789…

Если следовать этому описанию, то коллекция ГУИДов должна выглядеть так:

List<QueryParameter> guids = new List<QueryParameter>();
guids.Add(new QueryParameter((new Guid("...")).ToString()))

Верно ли это? Тогда я не смогу указать оператор "In()" для колонки, содержащую тип "Guid", т.к. я буду проверять наличие текущей записи в коллекции guids, а у нее QueryParameter содержит тип "string". Что-то тут нечисто... Подскажете, как быть?:confused:

Попробуйте сделать как в моём первом примере, там как раз сравнивается со списком из Guid, хоть и приводится к строке.

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

Доброго времени суток, коллеги.
Согласно этому в запросе в колонке с текстом SQL вроде как можно использовать конструкцию для автоматической замены таблицы на представление в зависимости от прав пользователя. Вопрос: в каких версиях Terrasoft это работает? На Terrasoft CRM 3.3.2.245 выдает ошибку "Оригинальное сообщение об ошибке: Incorrect syntax near '

У меня такой же вопрос

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

Добрый день.

Начиная с версии 3.4.0

Ясно, спасибо.
А в 3.3.2 подобную задачу решить можно? Или сразу вместо имен таблиц вставлять имена представлений?

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

Также можно


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

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

Добрый день!
Подскажите, пожалуйста синтаксис запрос COUNT на C#

Например, такой запрос
var select =
new Select(userConnection)
.Column("SysUserInRole","SysUserId")
.From("SysUserInRole")
.Join(JoinType.Inner, "SysAdminUnit").On("SysUserInRole", "SysUserId").IsEqual("SysAdminUnit", "Id")
.Where("SysUserInRole", "SysRoleId").IsEqual(new QueryParameter(ownerGroup))
as Select;

Как здесь правильно прописать COUNT?

У меня такой же вопрос

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

.Column(Func.Count("TableName", "FieldName")).As("ColumnAlias")

что то вроде такого

Спасибо

Добрый день!
А подскажите, пожалуйста, как привести к целому типу?

к String, например, так
(String)dataReader.GetColumnValue("NameGroup")

к Guid, например, так
(Guid)dataReader.GetColumnValue("NameId")

а к целому типу как?

Int32.Parse()
к примеру:
Int32.Parse((String)dataReader.GetColumnValue("NameCount"))

а если NameCount - это и так число?

я, наверное, не так выразилась
- хочу обратиться, результату значения из запроса
dataReader.GetColumnValue("NameCount")
NameCount"- это число (кол-во записей)

Дарья, добрый день!

Попробуйте так:

dataReader.GetColumnValue<int>("NameCount")
Войдите или зарегистрируйтесь, чтобы комментировать