Форум: "Базы";
Текущий архив: 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