![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а [D6, Paradox]
Piton X © (2003-10-14 13:44:00)
Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а в таблице - деньги либо 0, либо количество.
Уважаемые мастера! Необходимо создать запрос результатом, которого будет таблица в которой
Перечисленны люди и сколько они заплатили за услуги по датам:
Январь Февраль Март
Иванов 10руб 0 10руб
Петров 0 10руб 0
Сидоров 10руб 10руб 10руб
Есть две таблицы, в одной люди, в другой факты оплаты этих людей с датой оплаты и суммой. Уже бьюсь над проблемой несколько дней, голова кругом идет. Работаю с Парадоксом. Есть FreeReport и PReport под Delphi 6, может кто знает как это сделать? Буду очень признателен за любую помощь.
Piton X (2003-10-14 17:16:00) [21]
Zhouck, насчет DesicionCube, ты правильно определил, но проблема в том, что запрос мне нужен для последующей распечатке в PReport например, можно ли DesicionCube засунуть туда как источник данных?
MsGuns (2003-10-14 16:52:00) [22]
>Zhouck © (14.10.03 16:48) [7]
2MsGuns
>Запрос написан в принципе правильно, однако совсем не уверен что он пойдет под парадокс.
Запрос написан на Local SQL, т.е. Borland, а что там используется в качестве БД - вопрос десятый.
MsGuns (2003-10-14 16:50:00) [23]
Принцип использования CDS для последнего случая (твоего, насколько я понял) следующий.
1. CDS наполняется содержимым в дизайн-режиме. Т.е. ты ручками добавляешь в него филды, описывая каждое в соответствии с той структурой, которая нужна как врем.таблица. Для упорядочения создаешь один или более индексов. Все это хорошо видно в самом делфишном IDE - нет смысла описывать этот процесс подробно. Если что непонятно, то F1.
Этот CDS связываешь с визуальными компонентами (например, с TDBGrid) с помощью связующего TDataSource - обычным, знакомым способом. Все визуальные части настраиваешь как надо (шапку грида, формат отображения данных, св-ва колонок грида и т.д.)
2. По мере необходимости (например в событии OnShow формы с вышеуказанным гридом) ты создаешь CDS (CreateDataSet) и наполняешь его записями (например, сканируя НД, полученный соотв. запросом из БД)
3. Программишь CDS как обычный датасет со всеми стандартными свойствами и методами датасетов (события, процедуры и функции и т.д.)
4. Указываешь CDS в качестве DataSet репорта или чего там надо.
Zhouck (2003-10-14 16:48:00) [24]
2MsGuns
Запрос написан в принципе правильно, однако совсем не уверен что он пойдет под парадокс. Под интербейс,оракл без проблем. И создавать каждый раз таблицу, да еще не зная кол-ва столбцов...
Более правильный вариант - использовать DesicionCube. Ntv более если парадокс
Piton X (2003-10-14 16:46:00) [25]
Спасибо вроде понял, типа RxMemoryTable
Я вот подумал, исходя из моего вопроса - это вообще-то не 2-х мерный набор данных получается, а 3-х мерный вроде, в том-то и сложность.
MsGuns (2003-10-14 16:39:00) [26]
>Piton X (14.10.03 15:40) [3]
Вообще-то там очень хорошая справка. Но если с аглицким проблемы..
Попробую на пальцах.
TClientDataSet (CDS) полезен в неск. случаях
- источник данных (БД), называемый провайдером, находится вне пределах видимости программы (Сервер приложений, например)
- нестабильный доступ к источнику данных (серверу): модем, тормозная сеть и т.д.
- чрезмерная загрузка сервера, из-за чего клиенту надо предоставить некоторое подмножество БД, с которым он будет работать монопольно, периодически сбразывая рез-ты на сервак и подкачивая изменения, сделаннын другими.
- отказ от каких-бы то ни было движков и форматов СУБД с целью сделать данные проекта сугубо локальными, не привязанными ни к какой БД.
- требуется временная таблица для редактирования юзером, содержащая в том числе поля, отсутствующие в БД, котроая может быть использована для отчетов или для локального хранения.
Продолжать ?
DenK_vrtz (2003-10-14 15:47:00) [27]
Если не работал с TClientDataSet
1.Создать таблицу нужной структуры
2.Сделать запрос суммирующий оплаты клиентов по месяцам
3.Сбросить данные запроса в таблицу п.1
Piton X (2003-10-14 15:40:00) [28]
В общем-то по месяцам, но это уже другой вопрос, решил не усложнять.
MsGuns, спасибо. Людей около - 2500, платежей - 1, должно работать быстро. Смысл вашего решения примерно понятен: создавать клиентский набор данных и заполнять его нужными значениями. Все подходит, но нет ли решения на уровне SQL? Дело в том, что я не работал раньше с TClientDataSet, и не знаю как создать на его основе набор данных. Буду признателен, если объясните.
MsGuns (2003-10-14 15:11:00) [29]
Проблема решается несколькими способами. Приведу тот, который больше всего мне нравится ;))
1. Создаешь с помощью TClientDataSet таблицу нужной для отчета структуры:
Таб.N Tn
ФИО FIO
...
Январь Mon1
...
Декабрь Mon12
2. В эту таблицу ручками вносишь данные, полученные запросом типа
Select T1.TN, T1.FIO, T1.., T2.DATPAY, SUM(T2.SUMPAY) AS S
From Table1 T1 LEFT JOIN Table2 ON T1.TN=T2.TN
Group By T1.TN, T1.FIO, T1.., T2.DATPAY
ORDER BY T1.FIO, T2.DATPAY
При сканировании полученного рез-та снаяала для каждого новоно ТН добавляешь строку в новую таблицу, заполняя нулями все поля месяцев, затем по дате определяешь месяц и сооветствующую ему колонку таблицы и сумму добавляешь к содержимому этой колонки.
Если людей не слишком много (до неск.тысяч) и платежей по одной дате не десятки-сотни, то все это будет работать достаточно быстро.
DenK_vrtz (2003-10-14 13:59:00) [30]
В приведенном примере, я вижу месяцы, а не даты.
Отчет по месяцам нужен?