создать отчет
нужно создать отчет вида:
как можно это сделать с помощью одного запроса к БД??
запрос,к примеру:
или
заранее спасибо..
дата номинал кол-во сумма
01.01.01 50 20 1000
---------------------------
20 1000
02.02.02 5 4 20
100 2 200
--------------------------
6 220
с этим проблем нет,но дальше нужно по этому отчету подвести итоги следующего вида:
5 4 20
50 20 1000
100 2 200
то есть нужно изменить порядок сортировки (в первом отчете сначала по дате, потом по номиналу, а тут нужно только по номиналу)..как можно это сделать с помощью одного запроса к БД??
запрос,к примеру:
select * from CardSales
order by CardSales.DateSale, CardSales.CardValue;
или
select DealerAccNum, Count(CardValue), CardValue, SUM(CardValue), DateSale from CardSales
group by DealerAccNum, DateSale, CardValue
order by DealerAccNum, DateSale, CardValue;
заранее спасибо..
Комментарии
http://www.fast-report.com/en/forum/?p=/discussion/3061
как сделать это средствами FR? понимаю,что производительность пострадает
CardSales:
DateSale CardValue DealerAccNum
в случае первого запроса получаем все записи,отсортированные по DateSale и потом по CardValue и в отчете использую Groupheader/footer
во втором агрегатные ф-ии в запросе
а сумма = Count() * CardValue
вопрос в том,что сначала группировка идет по дате
и нужно перегруппировать по cardvalue без второго запроса к БД
то есть оба отчета строятся на базе одного запроса, и как сделать второй отчет не ясно
gpi, вопрос к тебе..ты писал,что делал средствами FR.. please
Вот:
SELECT CardValue, COUNT(*), SUM(CardValue)
FROM CardSales
GROUP BY CardValue
ORDER BY CardValue
и да, операция слишком дорогая по времени
запрос должен быть один,такое условие
Для DBX например, могу посоветовать доработать клиентский набор TfrxDBXDataset, добавив ему метод для задания индекса(ну или создать свой). Этот индекс строится в памяти и повторные запросы к базе не производятся.
2) Создай StringList и руками заноси туда итоговые строки, он тебе отсортирует, главное только помнить что строки надо дополнять слева для нормальной сортировки. Потом просто вывести так же как из любого массива.
Попробуй перевести мой способ на FS. От записей придётся отказаться, а динамические массивы в FS вроде бы уже поддерживаются.
Сегодня вечером и сам попробую сделать без использования пользовательских функций.
на всякий случай,если вдруг просто не заметил, еще туда:
SetLength(SummaArray,0);
у нас сортировка ведь происходит, как будто мы сортируем строки, а не числа. так,например, 100 получается меньше 20
TStringList.CustomSort в fs не поддерживается (почему??!)
что с этим делать?
1) заносить числа в массив в формате '100', '020', '006', а при выводе убирать нули
2) сортировку выполнять в массивах, в StringList заносить результат
Я использую третий вариант: сказал пользователям, чтобы счета заносили с нулями
почему так бедно реализована функциональность TStringList?
ну и
если всё-таки используем внешнюю функцию, то что написать вместо
то есть, как обратиться к переменным отчета?
есть ли вообще такая возможность?