Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.053 c
3-40934
S.A.S.
2003-10-17 16:36
2003.11.13
DBExpress


4-42294
MishaS
2003-09-09 18:36
2003.11.13
Как програмновызвать окно Установка и Удаление программ


14-41879
Василиск
2003-10-22 11:34
2003.11.13
Как по аглицки правильно пишется: ???


3-40836
chtr
2003-10-21 14:22
2003.11.13
Ошибка Row cannot be located for updating


3-41070
Slim
2003-10-23 18:41
2003.11.13
DB???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский