Сортировка результатов как параметр

отредактировано 09:52 Раздел: FastReport 2.xx VCL
Можно ли и как в параметрах отчёта, выбираемых пользователем, задать значение для сортировки в запросе?
В запросе выбираются несколько полей из БД, вычисляется несколько выражений с этими полями. Нужно сделать сортировку в зависимости от выбора пользователя, по какому результату. Например в запросе

SELECT es.sal, em.den, em.nad,
SUM(es.sal) AS sum_sal,
SUM(em.den) * 0.03 AS sum_den
FROM ***
WHERE ***
ORDER BY :sort

надо определить параметр :sort по желанию пользователя. Это могут быть em.nad, sum_sal или sum_den. Результаты запроса выдаются в master-e, если это имеет какое-то значение.

Комментарии

  • отредактировано 09:52
    А Select от куда выполняется, из отчета или с клиента или на сервере?
    Если из отчета или с клиента можно сначала юзверю показать диалог, что бы он выбрал как нужно сортировать а потом дописать к Select-у order by с выбранными полями сортировки.
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 09:52
    Tavika написал:
    Можно ли и как в параметрах отчёта, выбираемых пользователем, задать значение для сортировки в запросе?
    В запросе выбираются несколько полей из БД, вычисляется несколько выражений с этими полями. Нужно сделать сортировку в зависимости от выбора пользователя, по какому результату. Например в запросе

    SELECT es.sal, em.den, em.nad,
      SUM(es.sal) AS sum_sal,
      SUM(em.den) * 0.03 AS sum_den
    FROM ***
    WHERE ***
    ORDER BY :sort

    надо определить параметр :sort по желанию пользователя. Это могут быть em.nad, sum_sal или sum_den. Результаты запроса выдаются в master-e, если это имеет какое-то значение.
    Использование параметров для задания порядка сортировки данных в запросе не подходит, т.к. параметры не могут фигурировать в выражении Order by.
    Вам необходимо модифицировать запрос перед его выполнением.

    1. Запишите выражение ORDER BY запроса, например, как
    ORDER BY em.den

    2. Тогда код для модификации запроса будет выглядеть следующим образом:

    sSQL := MyQuery.SQL;
    sSQL := ReplaceStr(sSQL, 'ORDER BY em.den', 'ORDER BY ' + sOrderByField);
    MyQuery.SQL := sSQL;

    переменной sOrderByField надо присвоить название колонки, по которой нужна сортировка: 'em.nad', ....

  • отредактировано 09:52
    Селект из отчёта выполняется - использую компонент запрос TfrADOQuery
    Диалог да, показываю, только не получается оттуда данные передать в order by
  • отредактировано 09:52
    Query1.SQL.ADD('ORDER BY '+FIELDS);

    Где FIELDS это твоя строковая переменная с выбранными полянками.
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 09:52
    Tavika написал:
    Диалог да, показываю, только не получается оттуда данные передать в order by
    код напиши в событие OnClick для кнопки на диалоге, по которой запускается отчет
  • отредактировано 09:52
    Большое спасибо :-) Сортировка работает.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.