Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а   Найти похожие ветки 

 
Piton X   (2003-10-14 13:44) [0]

Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а в таблице - деньги либо 0, либо количество.

Уважаемые мастера! Необходимо создать запрос результатом, которого будет таблица в которой
Перечисленны люди и сколько они заплатили за услуги по датам:
Январь Февраль Март
Иванов 10руб 0 10руб
Петров 0 10руб 0
Сидоров 10руб 10руб 10руб

Есть две таблицы, в одной люди, в другой факты оплаты этих людей с датой оплаты и суммой. Уже бьюсь над проблемой несколько дней, голова кругом идет. Работаю с Парадоксом. Есть FreeReport и PReport под Delphi 6, может кто знает как это сделать? Буду очень признателен за любую помощь.


 
DenK_vrtz ©   (2003-10-14 13:59) [1]

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


 
MsGuns ©   (2003-10-14 15:11) [2]

Проблема решается несколькими способами. Приведу тот, который больше всего мне нравится ;))

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
При сканировании полученного рез-та снаяала для каждого новоно ТН добавляешь строку в новую таблицу, заполняя нулями все поля месяцев, затем по дате определяешь месяц и сооветствующую ему колонку таблицы и сумму добавляешь к содержимому этой колонки.
Если людей не слишком много (до неск.тысяч) и платежей по одной дате не десятки-сотни, то все это будет работать достаточно быстро.


 
Piton X   (2003-10-14 15:40) [3]

В общем-то по месяцам, но это уже другой вопрос, решил не усложнять.

MsGuns, спасибо. Людей около - 2500, платежей - 1, должно работать быстро. Смысл вашего решения примерно понятен: создавать клиентский набор данных и заполнять его нужными значениями. Все подходит, но нет ли решения на уровне SQL? Дело в том, что я не работал раньше с TClientDataSet, и не знаю как создать на его основе набор данных. Буду признателен, если объясните.


 
DenK_vrtz ©   (2003-10-14 15:47) [4]

Если не работал с TClientDataSet
1.Создать таблицу нужной структуры
2.Сделать запрос суммирующий оплаты клиентов по месяцам
3.Сбросить данные запроса в таблицу п.1


 
MsGuns ©   (2003-10-14 16:39) [5]

>Piton X (14.10.03 15:40) [3]

Вообще-то там очень хорошая справка. Но если с аглицким проблемы..

Попробую на пальцах.
TClientDataSet (CDS) полезен в неск. случаях

- источник данных (БД), называемый провайдером, находится вне пределах видимости программы (Сервер приложений, например)
- нестабильный доступ к источнику данных (серверу): модем, тормозная сеть и т.д.
- чрезмерная загрузка сервера, из-за чего клиенту надо предоставить некоторое подмножество БД, с которым он будет работать монопольно, периодически сбразывая рез-ты на сервак и подкачивая изменения, сделаннын другими.
- отказ от каких-бы то ни было движков и форматов СУБД с целью сделать данные проекта сугубо локальными, не привязанными ни к какой БД.
- требуется временная таблица для редактирования юзером, содержащая в том числе поля, отсутствующие в БД, котроая может быть использована для отчетов или для локального хранения.

Продолжать ?


 
Piton X   (2003-10-14 16:46) [6]

Спасибо вроде понял, типа RxMemoryTable

Я вот подумал, исходя из моего вопроса - это вообще-то не 2-х мерный набор данных получается, а 3-х мерный вроде, в том-то и сложность.


 
Zhouck ©   (2003-10-14 16:48) [7]

2MsGuns
Запрос написан в принципе правильно, однако совсем не уверен что он пойдет под парадокс. Под интербейс,оракл без проблем. И создавать каждый раз таблицу, да еще не зная кол-ва столбцов...
Более правильный вариант - использовать DesicionCube. Ntv более если парадокс


 
MsGuns ©   (2003-10-14 16:50) [8]

Принцип использования CDS для последнего случая (твоего, насколько я понял) следующий.

1. CDS наполняется содержимым в дизайн-режиме. Т.е. ты ручками добавляешь в него филды, описывая каждое в соответствии с той структурой, которая нужна как врем.таблица. Для упорядочения создаешь один или более индексов. Все это хорошо видно в самом делфишном IDE - нет смысла описывать этот процесс подробно. Если что непонятно, то F1.
Этот CDS связываешь с визуальными компонентами (например, с TDBGrid) с помощью связующего TDataSource - обычным, знакомым способом. Все визуальные части настраиваешь как надо (шапку грида, формат отображения данных, св-ва колонок грида и т.д.)

2. По мере необходимости (например в событии OnShow формы с вышеуказанным гридом) ты создаешь CDS (CreateDataSet) и наполняешь его записями (например, сканируя НД, полученный соотв. запросом из БД)

3. Программишь CDS как обычный датасет со всеми стандартными свойствами и методами датасетов (события, процедуры и функции и т.д.)

4. Указываешь CDS в качестве DataSet репорта или чего там надо.


 
MsGuns ©   (2003-10-14 16:52) [9]

>Zhouck © (14.10.03 16:48) [7]
2MsGuns
>Запрос написан в принципе правильно, однако совсем не уверен что он пойдет под парадокс.

Запрос написан на Local SQL, т.е. Borland, а что там используется в качестве БД - вопрос десятый.


 
Piton X   (2003-10-14 17:16) [10]

Zhouck, насчет DesicionCube, ты правильно определил, но проблема в том, что запрос мне нужен для последующей распечатке в PReport например, можно ли DesicionCube засунуть туда как источник данных?


 
MsGuns ©   (2003-10-14 17:30) [11]

>Piton X (14.10.03 17:16) [10]

Если не хочешь CDS (хотя зря - штука супер !), то для создания кросс-таблицы совсем не обязательно использовать DesicionCube - можно опять же запросом. Но дело вкуса, конечно..

ЗЫ. Кстати, если когда-нибудь понадобиться чтобы узер вносил перед печатью в таблицу какие-нибудь свои данные, то без CDS не обойдешься (RxMem может не решить траблу)


 
Piton X   (2003-10-14 17:47) [12]

MsGuns,
>Если не хочешь CDS (хотя зря - штука супер !), то для создания
> кросс-таблицы совсем не обязательно использовать DesicionCube -
> можно опять же запросом. Но дело вкуса, конечно..

А как сделать такой кросс-запрос?


 
Zhouck ©   (2003-10-14 18:53) [13]

>>Запрос написан на Local SQL, т.е. Borland, а что там используется в качестве БД - вопрос десятый
А если нужно будет вставить к-л ограничения? Попробуйте в такой запрос поставить еще having. Это точно не пойдет. А ведь ограничения нужно ставить часто


 
MsGuns ©   (2003-10-14 20:17) [14]

>Zhouck © (14.10.03 18:53) [13]
>А если нужно будет вставить к-л ограничения? Попробуйте в такой запрос поставить еще having. Это точно не пойдет.

Изучаем Local SQL, а если он не нужен, то не критикуем тех, кто его знает лучше ;))

>Piton X (14.10.03 17:47) [12]
>А как сделать такой кросс-запрос?

Смысл в том, что используются вложенные запросы по одному на каждый месяц. За тебя написать ?


 
Piton X   (2003-10-15 08:16) [15]

Программа еще в разработке. Аернее в творческом тупике. :-) Поэтому я могу даже переделать схему данных. Только не хочу уходить от Paradox. Пока есть две таблицы. В Т1 - люди. В Т2 - факты их оплаты за услуги. Если вы найдете, что можно сделать удобнее, для кросс-запроса, то поменяю даже схему данных.


 
Zhouck ©   (2003-10-15 10:43) [16]

>> Изучаем Local SQL, а если он не нужен, то не критикуем тех, кто его знает лучше ;))
Да ладно, смысла изучения Local SQL большого нет. Просто ппробуйте данный запрос с having и увидите ошибку. Ну умеет так Local SQL. Не надо считать себя очень умным. Kexit изучать полноценный SQL сразу
>>Только не хочу уходить от Paradox
Очень даже зря. Лучше переходи на FireBird. Потом меньше трабл будет. Да и дистр. у него меньше парадоксовского будет


 
MsGuns ©   (2003-10-15 12:55) [17]

>Zhouck © (15.10.03 10:43) [16]
>Очень даже зря. Лучше переходи на FireBird. Потом меньше трабл будет. Да и дистр. у него меньше парадоксовского будет

Согласен полностью с учетом того, что в условиях автора сабжа это возможно. Но какое это (переход на IB) имеет отношение к кросс-запросу ?


 
bushmen ©   (2003-10-15 13:10) [18]

Мне кажется, что не совсем удобно в качестве столбцов использовать даты - даты растут, значит, кол-во столбцов постоянно надо менять. Если я в чем-то не прав - поправьте, пожалуйста


 
MsGuns ©   (2003-10-15 13:29) [19]

>bushmen © (15.10.03 13:10) [18]
Обычно используются "временные" шахматки 2 видов: помесячные в пределах года, полугодия, квартала или подневные (календарные или фактические) в пределах месяца или указанных граничных дат.
Судя по сабжу (оплата абонентами услуг), может понадобиться и то, и другое. Первое - для бухгалтерии, второе - для дирекции.


 
bushmen ©   (2003-10-15 13:45) [20]

> MsGuns ©:
А чем "стандартная" схема не подходит?


 
Piton X   (2003-10-15 14:16) [21]

Даты в качестве столбцов - обязательное условие. В строках люди, в столбцах месяцы, в таблице сумма денег. Таким должен быть результат.


 
bushmen ©   (2003-10-15 14:31) [22]

2 Piton X:
Результат будет в таком виде, как ты его запрограммируешь, а способ хранения данных - это совсем другое. А если в будущем надо будет еще какой-нибудь отчет сваять, то ты ещё одну таьлицу создашь и будешь сразу в две одни и те же данные загонять?! :)


 
Danilka ©   (2003-10-15 14:43) [23]

[22] bushmen © (15.10.03 14:31)
дык, в теме - запрос на выборку, а данные хранятся как надо, см: [15] Piton X (15.10.03 08:16)


 
Zhouck ©   (2003-10-15 14:47) [24]

>>Но какое это (переход на IB) имеет отношение к кросс-запросу ?
А такое, что IB имеет полноценный SQL. А не обрезанный Local. Почему вы не отвечаете по сути? Ваш запрос не будет работать в Local SQL если в него добавить условия having. Потому нужно переходить на SQL-сервер


 
bushmen ©   (2003-10-15 14:53) [25]

> Danilka ©:
Всё, пора мне очки покупать. Тогда, извиняюсь.


 
MsGuns ©   (2003-10-15 16:42) [26]

>Zhouck © (15.10.03 14:47) [24]
>А такое, что IB имеет полноценный SQL. А не обрезанный Local

Это фраза - вера или голый понт ? Если первое, объясни мне, да и форуму заодно, что есть полноценный SQL ? SQL в Оракле и MSSQL, к примеру, отличаются и между собой и от интербэйзовского. Какой из них полноценный а какой ущербный ?

>Ваш запрос не будет работать в Local SQL если в него добавить условия having

Запрос успешно работает и с Having, потому что в Local SQL есть такая буква ! Может, сначала прочитаем о Local SQL, в частности о том, что и его создатель, и разработчик IB (точнее тот, кто его сейчас поддерживает) - одни и те же люди ?


 
Sandman25 ©   (2003-10-15 17:24) [27]

Piton X (14.10.03 13:44)

В PReport включен демо-проект, в котором делается именно то, что Вам нужно.


 
Piton X   (2003-10-16 10:08) [28]

Sandman25
>В PReport включен демо-проект, в котором делается именно то, что Вам нужно.
Что-то немогу с ним разобраться, поэтому и попросил помощи. Если сможете помочь, то спасибо.
Я не знаю как сделать лучше. Либо сформировать кросс-запрос и засунуть его в простой отчет, либо создать пару простых запросов и на их основе сформировать кросс-отчет в PReport. Буду рад за помощь по любому способу. Тем более, что думаю эта тема многих волнует. Особое спасибо MsGuns, пока от него больше дельных мыслей, и всем остальным тоже спасибо. Тема открыта.


 
Piton X   (2003-10-16 10:18) [29]

В общем-то теперь вопроса два.
1. Как сделать кросс-запрос в моем случае?
или
2. Как сделать кроссовый PReport, в моем случае?

Думаю, что любое из этих решений подойдет. Какое будет лучше, скорее дело вкуса.


 
Piton X   (2003-10-16 10:27) [30]

Можете писать мне по ICQ - 341166984
или на petr_malahov@mail.ru

Даже если я найду обходной маневр, то мне интересно как это решить именно с помощью SQL, т.е. кросс-запроса. В любом случае буду рад любой помощи.



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.03 c
1-41178
Crush
2003-11-02 23:54
2003.11.13
Поиск файла на вичестере


14-42042
Карелин Артем
2003-10-22 15:53
2003.11.13
Покритикуйте мою вторую попытку многопоточного доступа к базе.


1-41182
MaG
2003-11-01 19:17
2003.11.13
Поверх всех окон


3-40811
Игорь Ч
2003-10-22 13:07
2003.11.13
Компоненты для фильтрации


1-41546
Висилич
2003-10-28 00:01
2003.11.13
Использование обектов в процедурах.