Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.07.2014, 11:49
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию Отображение сгрупированных записей БД

Здравствуйте, дорогие форумчане!
Мне нужна ваша помощь. В общем такая ситуация:
Посоветуйте, как лучше решить такую проблему.
Нужно создать справочник, для вычисления комиссии перевода для определенной суммы.
Есть таблица стран, таблица валют. сделал, чтобы комиссия вычислялась по формулам, согласно интервалов(например,0-100,101-200$).
Все работает. В каждой записи моей таблице тарифов есть:
1)айдишник системы;
2)айдишник страны;
3)айдишник валюты;
4)итревал(границы тарифа);
5)формула для рассчета;

Но так его очень тяжело наполнять и изменять, потому что исходные данные тарифа для сист. переводов имеют вид:

Россия, Украина, Белоруссия,Грузия - Доллар, Евро - от1 до100 - 5%;
Россия, Украина, Белоруссия,Грузия - Доллар, Евро - от101 до 200 - 6%; и т.д.

Выходит, что для данной реализации нужно заводить для каждой страны, валюты, да еще для каждого интервала новую запись и для человека, который будет с ним работать - это ад
Думаю, что в бд нужно хранить также по 1 записи, но для пользователя их групировать. Тоесть загружать данные в ДС, а потом В ВТ отображать уже как одну запись. В общем нужно переделать/доделать, чтобы с ним было проще работать пользователю. Чтобы при создании/редактировании одного тарифа пользователь выбрал в ДБГридах несколько стран, потом несколько валют, интерфал и формулу комиссии - ему все отображалось в таком виде:

Россия, Украина, Белоруссия,Грузия - Доллар, Евро - от1 до100 - 5%;

а не в таком(хотя в базе буду хранить в таком):

Россия - доллар - от1 до100 - 5%;
Украина - доллар - от1 до100 - 5%;
...
Россия - евро - от1 до100 - 5%;
Украина - евро - от1 до100 - 5%;
...

И я не знаю как лучше это лучше сделать? Опытные люди, подскажите.

Последний раз редактировалось activexpoint, 24.07.2014 в 14:58.
Ответить с цитированием
  #2  
Старый 24.07.2014, 16:19
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп: станная какая-то такса вырисовывается - обычно, чем больше сумма, тем меньше комиссия, это ж не ПДН

И вам не хворать. Не работают в такой системе ни айдишки, ни интервалы, это всё вообще не нужно, поскольку в БД лежит обычное наполнение, в смысле "Россия - доллар - от1 до100 - 5%"...

Похоже здесь нужен такой органайз: к названию страны будут привязаны айди валюты и границы тарифа которые в свою очередь тоже должны лежать в своих таблицах, т.е. всего нужны три таблы. Тогда и при наполнении (добавлении новой страны) останется лишь добавить к её названию ID валюты (если такой нет, то задать новую) и интервал, а при выборке напр. по интервалу запросом можно сразу отобрать только те страны где действует нужный порог. Всё намного проще

З.Ы. Для конкретики, пжлст, код в студию
Ответить с цитированием
  #3  
Старый 25.07.2014, 11:54
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Такса с головы, так, для примера.

Поясните, почему не нужны айдишники?
да, в таблице будут одиночные записи для каждой страны и валюты+ еще и сист. пекреводов, но отображать пользователю нужно группой, например:
WU - Россия, Украина, Белоруссия,Грузия - Доллар, Евро - от1 до100 - 5%;
Хотя в бд они будут лежать одиночными записями для каждой сист. переводов, страны и валюты.

При создании я дам пользователю выбрать несколько стран, валют остальное. Для него одна запись тарифа будет отображаться групой, а в базе по одной(не группой).
Я не знаю, как потом при выборке с базы их группировать и отображать.

В БД уже есть таблицы со всеми валютами, странами и сист. переводов.
У мене мало опыта, поэтому могу не совсем верно излагать свою мысль, но, думаю, вы поймете.

Последний раз редактировалось activexpoint, 25.07.2014 в 11:57.
Ответить с цитированием
  #4  
Старый 25.07.2014, 22:01
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от activexpoint
Я не знаю, как потом при выборке с базы их группировать и отображать.
Отображение, скорее всего, придется делать через вычисляемое поле. Какая СУБД? Знаю, что агрегация строк поддерживается в Oracle, про другие СУБД не в курсе.

Вне зависимости от отбражение редактирование придется делать диалогом, как я уже однажды писал.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #5  
Старый 28.07.2014, 10:50
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Oracle. Использую ODAC.

Хотел сделать, чтобы было так, строка в справочнике тарифов:
WU - Россия, Украина, Белоруссия,Грузия - Доллар, Евро - от1 до100 - 5%;
Пользователь кликает по поле страна и появляется справочник стран с дбгридом( с мультиселектом) и выбирает несколько стран, так же и с валютами. Потом для каждой страны и валюты сохраняю по отдельности запись.

Самый главный вопрос, как потом их вытянуть с бд и сгруппировать.
Прочитал тему, по вашей ссылке, не совсем понял, как связать с моим вопросом. Объясните, пожалуйста.

Последний раз редактировалось activexpoint, 28.07.2014 в 10:55.
Ответить с цитированием
  #6  
Старый 28.07.2014, 17:55
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Есть два варианта:
  • В Oracle 11.2 наконец-то появилась агрегатная функция для строк -- listagg. Можно воспользоваться ею, но тогда после редактирования придется перечитывать или весь запрос в гриде целиком, или только одну строку, если ODAC это позволяет. На память не помню.
  • Другой способ -- держать отдельные запросы, читающие исходные данные для агрегации целиком, а саму агрегацию делать на клиенте в полях с FieldKind = fkInternalCalc (вычисляемые поля с буферизацией значений).
Редактирование в обоих случаях придется делать как-то отдельно, поскольку для грида требуется агрегация всех доступных связанных значений, а для редактирования -- только для одной записи. В ODAC, в принципе, можно выкрутиться с AddWhere, чтобы не дублировать компоненты запросов агрегируемых значений.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #7  
Старый 29.07.2014, 10:46
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Спасибо за функцию, у меня версия - 11.2. Попробую с ней. Только вопрос все-равно остался(простите если не понимаю ), как объединить если мне нужен не конкретный интервал, а все для данной системы? Для некот. систем интервалов вообще может и не быть, только процент от суммы.

Вытянуть все записи для нужной системы можно, но как их правильно сгруппировать по интервалам(для примера, смотрите начало темы).

Последний раз редактировалось activexpoint, 29.07.2014 в 12:07.
Ответить с цитированием
  #8  
Старый 29.12.2014, 11:36
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Народ, подскажите как лучше убрать дубликаты с нескольких listagg-полей(оракл)?
Ответить с цитированием
  #9  
Старый 29.12.2014, 12:46
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Пример запроса и его вывода можно?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #10  
Старый 29.12.2014, 15:33
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Вот, пожалуйста:
Код:
select 
    ...
    listagg(co.country_name,',') within group (order by col.id_group_country) as country_l,
    listagg(cu.name_cur,',') within group (order by col.id_group_country) as currency_l,
from 
   ...
where 
    ...
group ...

рез:

Последний раз редактировалось activexpoint, 30.12.2014 в 01:19.
Ответить с цитированием
  #11  
Старый 29.12.2014, 22:18
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Думаю, что после выражения within group нужно еще приписать over (partition by col.id_group_country). Вроде бы...
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter