powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка с учетом курса
12 сообщений из 12, страница 1 из 1
Выборка с учетом курса
    #39373394
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Подскажите имеет на существование велосипед который я придумал.
В базе есть таблица курсов валют вида
id_currencyexchangerate_maxexchangerate_mindate110.58.123.12.2016420.218.723.12.2016
Есть основная валюта (основная валюта может быть только одна, и изменить основную валюту невозможно) для которой курс не устанавливается, для всех других валют установлен курс, курс устанавливается каждый операционный день.
Для каждой модели (товар) в таблице моделей присвоено id_currency. в большинстве случаев пользователи видят цены в основной валюте, с учетом курса, придумал следующую выборку.
Код: sql
1.
2.
3.
4.
select count,name_model......, iif(exgerates.exchangerate_max is null, 1, exgerates.exchangerate_max) * price
from.....

 left join exchangerates exgerates on exgerates.id_currency = id_currency_модели and....


Выборка сводится к условию если для модели нет курса цену умножаем на 1 если есть цену умножаем на exgerates.exchangerate_max и получаем стоимость модели с учетом курса.
Имеет право на жизнь?
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39373430
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select count,name_model......, coalesce(exgerates.exchangerate_max, 1) * price
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39373435
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сугубо личное мнение
SashauaЕсть основная валюта (основная валюта может быть только одна, и изменить основную валюту невозможно)
Изначально не универсальное решение, проблема заложенная под масштабируемость системы.
авторДля каждой модели (товар) в таблице моделей присвоено id_currency.
Если пользователю нужно видеть текущую цену в другой валюте, нужно смотреть на текущую дату (правильнее - текущий=актуальный курс). Если речь идет о переводе цены покупки, то надо смотреть по дате покупки, а не по ID перевода из одной валюты в другую - также в этом случае лучше рассмотреть вариант хранения для товара цены в основной валюте (отклонение от нормализации, но упростит=ускорит многие выборки).
Также можно установить не только дату, а актуальность курса и при добавлении нового курса отменять актуальность предыдущего - это упростит выборки когда на текущую дату курса нет (например в выходные курс не меняется).
При Вашем решении - можно сделать так как посоветовал Exteris
Можете хранить курс 1:1 и ссылайтесь на него по ID.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39373510
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

Ну то есть завожу я в таблицу новую валюту, и пока к ней курс (завтра) не прочитался, выдаётся какая-то лажа.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39373529
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦБ РФ устанавливает курс валют... на завтра или на выходные/праздничные/понедельники.
То есть они действуют с 00:00:00 нового дня.

А раньше таки да, фигня с "прыгающим" курсом в течении биржевого дня имела место.
Время "публикации" нового курса жестко не определено, где-то с 12:00 до 16:00, по "желанию" регулятора.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39373961
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Sashaua!
You wrote on 23 декабря 2016 г. 16:48:58:

Sashaua> Для каждой модели (товар) в таблице моделей присвоено id_currency.зачем?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39376485
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exteris select count,name_model......, coalesce(exgerates.exchangerate_max, 1) * price
спасибо за наводку.
Евгений, Екатеринбург Изначально не универсальное решение, проблема заложенная под масштабируемость системы...
добавлении нового курса отменять актуальность предыдущего
Согласен, как то так получилось, пока нет возможности подумать насчет универсальности в этом месте. Операция установки курса представляет собой добавление записи в таблицу курсов валют с текущей датой, и для "не критичных" операций таких как просмотр остатков с ценами выбирается для модели курс с максимальной датой, для операций продаж и подобных требуется установка курса на текущий день (так бизнес захотел).
WildSeryНу то есть завожу я в таблицу новую валюту, и пока к ней курс (завтра) не прочитался, выдаётся какая-то лажа.
При добавлении новой валюты предлагается сразу установить курс.

Мимопроходящий Sashaua
> Для каждой модели (товар) в таблице моделей присвоено id_currency.
зачем?
Есть модели которые закупаются в разных валютах (отличной от той в которой продают), и для этого была реализована такая схема.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39376515
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashauaОперация установки курса представляет собой добавление записи в таблицу курсов валют с текущей датой, и для "не критичных" операций таких как просмотр остатков с ценами выбирается для модели курс с максимальной датой, для операций продаж и подобных требуется установка курса на текущий день (так бизнес захотел).

Поэтому и надо хранить ID валюты, в которой указана цена, а не ID курса. И если по валюте курс "несвежий" надо предупреждать об этом пользователя, например, давать подсказку сколько дней назад был установлен этот курс. Может товар покупали за тугрики и курс по ним в Вашей системе операторы не меняли уже 2 года (на этот случай можно предусмотреть возможность привязки к другой валюте - например, купили за турецкие лиры, но чтобы не отслеживать постоянно курс - перепривязали к доллару и дальше отталкиваетесь от этого).
В общем продумывайте систему на будущее, чтобы потом не пришлось переделывать постоянно добавляя новые таблицы и атрибуты.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39376757
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Sashaua!
You wrote on 28 декабря 2016 г. 12:23:12:

SashauaМимопроходящийSashaua>> Для каждой модели (товар) в таблице моделей присвоено id_currency.
> зачем?> Есть модели которые закупаются в разных валютах (отличной от той в которой продают), и для этого была реализована такая схема.
неправильная схема учёта, если это "белая" схема.
даже если это "серая" схема, то обычно в таком случае ведут мультивалютный учёт -
для каждой валюты своя "кучка" товара.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39376758
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Евгений, Екатеринбург!
You wrote on 28 декабря 2016 г. 12:27:53:

Евгений, Екатеринбург> надо хранить ID валюты, в которой указана цена, а не ID курса.+1

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39377001
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, ЕкатеринбургПоэтому и надо хранить ID валюты, в которой указана цена, а не ID курса.

Цены, аки резиденты РФ обязаны публиковать (указывать в документах) в рублях.
Хоть и МП ниже всказалсси, но моя имха против такого подхода.
Всё зависит от организации табли "Валюты".
У мну в табле "Валюты" ID_курса номер дня в формате YYYYMMDD.
И нужное кол-во столбиков: $, Euro, Шв. франки, Фунты стерлингов и прочее.
В ячейках хранится курс на эту дату для данной валюты.
Табля ведется с 2007 года.

- Чё я делаю не так уже 10 лет?
Если во всех возможных бизнес-ситуациях, включая распорки с клиентами в судах, претензий к системе не возникало.

Евгений, ЕкатеринбургВ общем продумывайте систему на будущее, чтобы потом не пришлось переделывать постоянно добавляя новые таблицы и атрибуты.
Совет пральный, еще бы следовал ему...
Ща ЕС посыпится и опять вернемся ко множеству валют.
- У мну они есть.
А чё придется перелопачивать тебе?
Ессессено вопрос риторический.


И в большей степени - метедологический:
- Вертикальные vs горизонтльные табли в БД.
...
Рейтинг: 0 / 0
Выборка с учетом курса
    #39378283
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Di_LIneЦены, аки резиденты РФ обязаны публиковать (указывать в документах) в рублях.

Публикуй как требует закон, просматривай в любой валюте в которой требуется, храни универсальным образом.
автор- Чё я делаю не так уже 10 лет?
Тебе виднее - ты программист, я любитель, поэтому говорю так как вижу из своей практики.
Я бы начал примерно так - завел справочник валют
Код: plsql
1.
2.
3.
ID_Cur
Cur_Name
--Другие атрибуты, типа страны и т.п.


Таблицу операций с валютами, она же таблица курсов
Код: plsql
1.
2.
3.
4.
5.
6.
ID
ID_Cur_From --Внешний ключ на справочник валют
ID_Cur_To --Внешний ключ на справочник валют
ID_Operation_type --Внешний ключ на тип операции
Operation_Time_from --Поле если в таблице хранятся данные об инфляции. Т.е. коэффициент от даты к дате.
Operation_Time --Время на которое фиксируется операция


Справочник типов операций
Код: plsql
1.
2.
ID
Operation_Name


Предустановленные типы операций
1. Курс покупки.
2. Курс продажи.
3. Курс ЦБ.
4. Курс преобразования валюты.
5. Коэффициент инфляции.
6. Продажа товара.
7. Покупка товара.
Покупки фиксировал бы в таблице операций с товарами
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID
ID_Goods --Внешний ключ на таблицу товаров
ID_Cur --Внешний ключ на таблицу валют
Operation_Sum_Cur --Сумма операции в указанной валюте
/*
Рассмотрел бы необходимость хранения суммы операции в основной валюте.
Необходимость определяется планируемой нагрузкой на базу.
*/
Operation_type --Внешний ключ на таблицу операций
Operation_Time


При такой структуре я могу не трогая структуру базу, а только лишь силами пользователя отобразить любые данные - хранить курсы покупки, продажи, ЦБ, преобразование одних валют в другие - дойчмарки в евро (в том числе наоборот если Греция отвалится и вернет драхмы), и даже преобразование одной валюты - например, деноминацию.
Такая структура позволит мне, например, отследить текущую стоимость товара в рублях, который был куплен за дойчмарки в 1995 году, позволит продать программу в другую страну, где нет обязанности хранить в рублях и т.п.
Но, конечно правильным программистам виднее...


авторИ в большей степени - метедологический:
- Вертикальные vs горизонтльные табли в БД.
Это философский вопрос, но примерно в 80% случаев где я пожалел времени и стал делать горизонтальные столбцы для дополнительных (=вспомогательных) атрибутов, я потом пожалел об этом - каждый чих, каждая дополнительная настройка приводят к изменению структуры, в том числе у пользователей у которых нет DBA.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка с учетом курса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]