Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а [D6, Paradox]


Страницы:   1 2

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]

В приведенном примере, я вижу месяцы, а не даты.
Отчет по месяцам нужен?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо