Вопрос

Выборка данных, которую нельзя реализовать через SelectQuery



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

Имеется TerrasoftCRM 3.3.2.245. Нужно реализовать выборку данных, которую нельзя сделать посредством SelectQuery с передачей параметров в запрос и расчетом итоговой строки.

Почему нельзя использовать SelectQuery? В конструкторе запроса нельзя join-ить с подзапросом и нельзя join-ить более, чем по одному полю.

Вопрос 1: как реализовать расчет итоговой строки? DataGrid умеет считать итоги только в виде суммы, среднего, максимума и минимума колонки переданного набора данных. Я могу записать произвольное значение в область итогов DataGrid? Если не могу, то строку итогов мне придется считать в запросе и потом ее объединять с результатом запроса.

Вопрос 2: как можно получить данные в виде таблицы в обход SelectQuery?

  1. ExecuteCustomSQL - отпадает, так как не может вернуть таблицу (или я чего-то не знаю).
  2. Вызов хранимой процедуры в CustomSql колонке SelectQuery. Вариант в принципе годный. Есть некоторые проблемы с передачей параметров для Include фильтра, но решаемые.
  3. CustomQuery. Непонятный мне зверь. Может ли возвращать таблицу? Можно ли менять текст запроса в runtime или только хардкодить в Администраторе? В конфигурации я примеров использования не нашел, на этом форуме тоже (киньте ссылку, если не жалко).
  4. ADODataset. На первый взгляд тоже годный вариант, но есть свои "но". Хотелось бы, чтобы запрос выполнялся от имени текущего пользователя, со всеми его ограничениями доступа. В случае доменной аутентификации это решаемо, а как быть, если используется аутентификация СУБД? Я вряд ли смогу где-нибудь достать пароль текущего пользователя, могу только показать диалог с запросом пароля и сохранить его в базе.

Есть ли еще какие-либо варианты получения табличных данных?

Нравится

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

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

Так в 3-ке, насколько помню, можно и представление реализовать нужное со всем набором колонок.

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

Хотя SelectQuery в конфигурации все же прийдется реализовать.

Но этот вариант не подойдет, если нужно в режиме ран тайм, что-то изменить.

Можно реализовать весь свой запрос в хранимой функции, а затем её вызвать при помощи нескольких CustomSql-колонок в SelectQuery. Так можно будет передать параметры и получить результат в табличной форме.

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

Так в 3-ке, насколько помню, можно и представление реализовать нужное со всем набором колонок.

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

Хотя SelectQuery в конфигурации все же прийдется реализовать.

Но этот вариант не подойдет, если нужно в режиме ран тайм, что-то изменить.

Да, с представлением тоже можно. Но тогда нужно будет не только SelectQuery, но и сервис таблицы с таким же названием и набором полей задизайнить, а потом при его сохранении сказать «нет» на вопрос об изменении в БД.

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

Тогда используйте мой вариант из ссылки выше.

Благодарю за помощь. Реализовал через табличную функцию.

Riptor пишет:

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

Почему не подойдет?

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

Алла, видимо, речь о том, что если внутри view вся логика сделана не select, а кодом или вызовом функции с параметрами, пробросить внутрь условия фильтра, наложенные на view снаружи, нетривиально.

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