Cross-tab старый стиль
Здравствуйте.
делаю кростаб старого стиля. Потожил все бэнды. Все вроде так. Выводятся строки как надо. Колонки вроед тоже как надо. В первом датасете выбираются инфа на строки. Во втором - на колонки. Какой запрос надо делать чтобы корректро выводились наднные на пересечении. Я так понимаю что необходим третий датасет с запросом. но не соображу какой.
Может у кого ест пример рабочий (с текстом запросов)
Спасибо
делаю кростаб старого стиля. Потожил все бэнды. Все вроде так. Выводятся строки как надо. Колонки вроед тоже как надо. В первом датасете выбираются инфа на строки. Во втором - на колонки. Какой запрос надо делать чтобы корректро выводились наднные на пересечении. Я так понимаю что необходим третий датасет с запросом. но не соображу какой.
Может у кого ест пример рабочий (с текстом запросов)
Спасибо
Комментарии
Например вот так:
где Equuipment датасет вертикального бэнда а BuildPlans датасет горизонтального
т.е. получается что в отчете 3 датасета? Тут приведен запрос для датасета на пересечения? Тогда вопрос - qty.sql.add когда формирует этот запрос? Можно четь пошире пояснить принцип старого кростаба?
В данном примере он формируется на OnBrforePrint у мемо стоящего на пересечении. Но теоретически он может и не формироваться динамически, а быть связаным с двумя датасетами через параметры.
Принцип простой, допустим есть горизонтальный бенд привязаный к датасету А и вертикальный бенд привязаный к датасету Б.
При формировании отчета сначала отображается первая строка - датасет А становится на первую запись, после этого отображается первый столбец - датасет Б становится на первую запись, в этот момент мы можем на основе первых записей датасетов вычислить некие данные, сформировать зависимый запрос и т.п. и вывести результат на пересечении этих бэндов. После этого отображается второй столбец - датасет Б становиться на вторую свою запись - исходные данные для вычислений на пересечении меняются и если есть некий датасет В у которого имеется привязка к датасетам А и Б то он будет пересчитан на основе новых данных. И так пока не закончится датасет Б. После чего отображается вторая строка - датасет А становится на вторую свою запись, а датасет Б вноь начинает отсчет с первой поиции.
Вот примерно так.
ХМ... Это всё, конечно, правильно, но в этом случае получается, что запрос С, вычисляющий значения на пересечениях будет выполняться чёрт знает сколько раз. А если он (запрос этот) сравнительно "тяжёлый"? У меня, например, запрос этот выполняется ~5 c.. Ждать замучаетесь.
Есть другой вариант. Выполнить запрос С один раз. Пусть он возвращает три поля "select A, B, C from table..." и покрывает перечень всех возможных значений.
Далее, на месте перечечения положите пустой Memo, на OnBeforePrint которого напишите:
И все.