Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Справочник курсов валют, как правильно реализовать 
:(
    Опции темы
Akella
Дата 8.7.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Нужно добавить в программу цену в валюте.
Для этого придётся реализовать справочник валют.

Заложена такая структура:

user posted image


Вопрос такой. Нужно ли вести какую-то историю курсов валют или оно нафиг не нужно?

Планируется, что в основной записи будет 2 цена.
Цена в нац. валюте и цена в валюте., + курс на такую-то дату чтобы было видно почему именно такая цена, а не текущая?

Может быть в главной записи сделать поле "Цена в валюте" вычисляемым относительно того курса, который записан в справочнике?

Кто работал с валютами, признавайтесь smile
PM MAIL   Вверх
~FoX~
Дата 10.7.2011, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



Akella, Я работал  smile 
Только валюта у нас была собственная называлась "абико" (по названию фирмы) консультанты при заходе в программу вводили "курс" валюты иначе невозможно продолжить работу... 
Цитата(Akella @  8.7.2011,  17:37 Найти цитируемый пост)
Нужно ли вести какую-то историю курсов валют или оно нафиг не нужно?

По сути вопроса, историю вести нужно всенеприменно по нескольким причинам:
1. Шефы периодически возбудясь к активности хотят узнать "что там было пол года назад". (хотя чаще всего это лишь для того что бы озадачить)
2. На основании колебаний курса можно производить расчеты и прогнозы. (веер Фибоначи как оказалось действительно работает)
3. У нас был случай когда пришла рекламация на продукт поставленный 1,5 года назад, а т.к. мы гарантируем не изменение цены на протяжение всего срока службы продукта пришлось вытаскивать курс из архива...
4. Чаще всего, работы по заказу длятся дольше чем меняется курса валют...

Цитата(Akella @  8.7.2011,  17:37 Найти цитируемый пост)
Цена в нац. валюте и цена в валюте., + курс на такую-то дату чтобы было видно почему именно такая цена, а не текущая?

Нафиг не надо... У нас законодательно расплачиваться можно только рублями...

Цитата(Akella @  8.7.2011,  17:37 Найти цитируемый пост)
Может быть в главной записи сделать поле "Цена в валюте" вычисляемым относительно того курса, который записан в справочнике?

Это можно, дело личное, так сказать  smile 

З.Ы.: У нас хранение истории курса было выведено отдельной таблицей, и реализована возможность расчета на любую дату... Как оказалось весьма удобно

Это сообщение отредактировал(а) ~FoX~ - 10.7.2011, 08:17


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 10.7.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(~FoX~ @  10.7.2011,  08:03 Найти цитируемый пост)
1. Шефы периодически возбудясь к активности хотят узнать "что там было пол года назад". (хотя чаще всего это лишь для того что бы озадачить)

в тырнете такой инфы полно


Цитата(~FoX~ @  10.7.2011,  08:03 Найти цитируемый пост)
2. На основании колебаний курса можно производить расчеты и прогнозы. (веер Фибоначи как оказалось действительно работает)

программа не финансовая, нафиг там прогнозы


Цитата(~FoX~ @  10.7.2011,  08:03 Найти цитируемый пост)
3. У нас был случай когда пришла рекламация на продукт поставленный 1,5 года назад, а т.к. мы гарантируем не изменение цены на протяжение всего срока службы продукта пришлось вытаскивать курс из архива...

см. п 1 smile


Цитата(~FoX~ @  10.7.2011,  08:03 Найти цитируемый пост)
Цитата(Akella @  8.7.2011,  17:37 Найти цитируемый пост)
Цена в нац. валюте и цена в валюте., + курс на такую-то дату чтобы было видно почему именно такая цена, а не текущая?

Нафиг не надо... У нас законодательно расплачиваться можно только рублями...

Ну а фактически расплачиваются долларами или еврикамиsmile, я про покупку на руках квартиры или машины.
Людям копить на машину или квартиру лучше в долларах или евро, т.к. национальная валюта нестабильна так сказать и она привязана к курсу доллара, как ни крути smile



Цитата(~FoX~ @  10.7.2011,  08:03 Найти цитируемый пост)
З.Ы.: У нас хранение истории курса было выведено отдельной таблицей, и реализована возможность расчета на любую дату... Как оказалось весьма удобно

Спасибо,  подумаю.
PM MAIL   Вверх
Akella
Дата 19.7.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



А где легче всего в онлайне можно получать курсы валют?
PM MAIL   Вверх
Keeper89
Дата 19.7.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Легче - не знаю, но хороший сайт тут http://quote.rbc.ru/exchanges/demo/cb.0/daily


--------------------
PM MAIL WWW   Вверх
Akella
Дата 19.7.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Я искал что-то универсальное, а не только для рублей. Но так и не нашёл.
PM MAIL   Вверх
pseud
Дата 20.7.2011, 09:38 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Akella, 
Рекомендую реализовать 2 справочника:
- справочник валют (СВ);
- справочник курсов (СК).
Вещь полезная. Возможно это будет поначалу избыточно. Но ведь раньше вообще справочник валют тебе не был нужен. 

Оба справочника исторические (DATE_START, DATE_END). 
Зачем? Например в СВ есть валюта 980(UAH)УКРАИНСКАЯ ГРИВНА. Завтра ее переименовывают в УКРАИНСКИЙ ДИНАР. Получаем 2 записи:
Код

980(UAH)УКРАИНСКАЯ ГРИВНА - 01.01.1991 - 20.07.2011
980(UAH)УКРАИНСКИЙ ДИНАР  - 21.07.2011 - 01.01.2099

Ну а в СК соответсвенно - курсы. Тоже с датой начала действия курса и датой окончания. 

IS_NATIONAL - имхо не нужно.
Зато нужны:
  - тип курса (Нац банк, Наш банк, Наша контора, Договорной курс).
  - порядок (за 1000 или за 10 000). Курсы ведь бывают не только за единицу валюты. Например 5000 бел.руб за 1 доллар. Но 632.79 бел.руб. за 10 японских йен или 473.93 бел.руб. за 1000 иранский риалов.


Это сообщение отредактировал(а) pseud - 20.7.2011, 09:39


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 20.7.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(pseud @  20.7.2011,  09:38 Найти цитируемый пост)
- порядок (за 1000 или за 10 000). Курсы ведь бывают не только за единицу валюты. Например 5000 бел.руб за 1 доллар. Но 632.79 бел.руб. за 10 японских йен или 473.93 бел.руб. за 1000 иранский риалов.

Думаю, что это не нужно, это только усложнит расчёты цен в валюте, мне кажется.


Цитата(pseud @  20.7.2011,  09:38 Найти цитируемый пост)
IS_NATIONAL - имхо не нужно.

Почему это. Программе нужно знать, какая валюта для пользователя есть национальной, т.е. по умолчанию.

Добавлено через 38 секунд
Цитата(pseud @  20.7.2011,  09:38 Найти цитируемый пост)
Зато нужны:
  - тип курса (Нац банк, Наш банк, Наша контора, Договорной курс).

тоже пока не вижу обоснованности

Добавлено через 1 минуту и 51 секунду
с переименованием вообще ничего не понял, ну переименуют, ну и что с того, есть код числовой и текстовый, на это и опираемся
PM MAIL   Вверх
pseud
Дата 20.7.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Akella @  20.7.2011,  09:47 Найти цитируемый пост)
Почему это. Программе нужно знать, какая валюта для пользователя есть национальной, т.е. по умолчанию.

Все равно все курсы будут вбиваться относительно национальной валюты.
Просто у национальной валюты он окажется 1 (единиц) за 1 (единиц)

Добавлено через 1 минуту и 15 секунд
Цитата(Akella @  20.7.2011,  09:47 Найти цитируемый пост)
Думаю, что это не нужно, это только усложнит расчёты цен в валюте, мне кажется.

зато будет соответсвовать стандартам соответсвий как у нац банка.
да и курс перед пересчетом разделить на 10(100,1000) не сильно усложнит задачу.

Добавлено через 1 минуту и 49 секунд
Цитата(Akella @  20.7.2011,  09:47 Найти цитируемый пост)
тоже пока не вижу обоснованности 

в том то и дело что "пока". Ведь раньше ты и о справочнике валют не думал. )))

Добавлено через 3 минуты и 21 секунду
Хотя, возможно, я перебарщиваю. Ведь моя рекомендация строится на справочнике валют для банка.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 20.7.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(pseud @  20.7.2011,  09:56 Найти цитируемый пост)
Все равно все курсы будут вбиваться относительно национальной валюты.
Просто у национальной валюты он окажется 1 (единиц) за 1 (единиц)


Да, но пользователь сам должен определить нац. валюту. Это даже не нац. валюта, а "валюта по умолчанию". Вдруг он захочет "сказать" программе, что я типа хочу, чтобы поле цена (основное) была в долларах, а уже цена в валюте, это будут рубли.

Добавлено через 1 минуту и 15 секунд
Цитата(pseud @  20.7.2011,  09:56 Найти цитируемый пост)
Хотя, возможно, я перебарщиваю. Ведь моя рекомендация строится на справочнике валют для банка. 

отож smile

Добавлено через 8 минут и 20 секунд
Цитата(pseud @  20.7.2011,  09:38 Найти цитируемый пост)
 - порядок (за 1000 или за 10 000). Курсы ведь бывают не только за единицу валюты. Например 5000 бел.руб за 1 доллар. Но 632.79 бел.руб. за 10 японских йен или 473.93 бел.руб. за 1000 иранский риалов.


Ну тогда нужно держать ещё одно поле "Номинал", где будет храниться значение, сколько долларов или гривен (10, 100 или 1000) обменивается на рубли.
У тебя было бы так:
35 рублей за 10 гривен
28 рублей за 1 доллар
39 рублей за 1 евро


а у меня так:
3,5 рубля за 1 гривну
28 рублей за 1 доллар
39 рублей за 1 евро



У меня проще, в любом случае всегда одно и то же количество - 1.
PM MAIL   Вверх
Akella
Дата 20.7.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Для расчёта курса российских рублей у мну получилась вот такая процедура:

Код

//Передаём строку: http://www.cbr.ru/scripts/XML_daily.asp?date_req

procedure TMyCurrency.GetByRUB(url: string);
Type
  TCurrencyData = record
    CharCode, Name: String;
    Nominal: Integer;
    Value: Real;
  end;

var
  XMLDocument: TXMLDocument;
  BufXMLNodeList: IXMLNodeList;
  i, k, j: integer;
  CBR: array of TCurrencyData;
begin
  if not dm.fibDB.TestConnected then
  begin
    log('Курсы валют. Не удалось обновить курсы валют в процедуре GetByRUB, БД не подключена');
    exit;
  end;

  if not fdataset.Active then fdataset.Open;

  try
    XMLDocument := TXMLDocument.Create(Application);
    XMLDocument.Active := True;

    if url = '' then url := GetUrlRUB();

    XMLDocument.LoadFromFile(url);

    if XMLDocument.ChildNodes[1].HasChildNodes then
      BufXMLNodeList := XMLDocument.ChildNodes[1].ChildNodes;


    for i := 0 to BufXMLNodeList.Count - 1 do
      if BufXMLNodeList[i].HasChildNodes then
      begin
            SetLength(CBR, Length(CBR) + 1);
            for k := 0 to BufXMLNodeList[i].ChildNodes.Count - 1 do
            begin
              if BufXMLNodeList[i].ChildNodes[k].NodeName = 'CharCode' then
                if BufXMLNodeList[i].ChildNodes[k].NodeValue <> Null then
                  CBR[Length(CBR) - 1].CharCode := BufXMLNodeList[i].ChildNodes[k].NodeValue;

              if BufXMLNodeList[i].ChildNodes[k].NodeName = 'Nominal' then
                if BufXMLNodeList[i].ChildNodes[k].NodeValue <> Null then
                  CBR[Length(CBR) - 1].Nominal := StrToInt(BufXMLNodeList[i].ChildNodes[k].NodeValue);

              if BufXMLNodeList[i].ChildNodes[k].NodeName = 'Name' then
                if BufXMLNodeList[i].ChildNodes[k].NodeValue <> Null then
                  CBR[Length(CBR) - 1].Name := BufXMLNodeList[i].ChildNodes[k].NodeValue;

              if BufXMLNodeList[i].ChildNodes[k].NodeName = 'Value' then
                if BufXMLNodeList[i].ChildNodes[k].NodeValue <> Null then
                  CBR[Length(CBR) - 1].Value := StrToFloat(BufXMLNodeList[i].ChildNodes[k].NodeValue);
            end;
      end;


        with fdataset do
        begin
          DisableControls;
          //если справочник валют пуст
          if RecordCount <= 0 then
          begin
            application.MessageBox(constMsgCurruncySprIsNull, constError, MB_ICONSTOP or MB_OK);
            exit;
          end;// if fDataSet.RecordCount <= 0 then

          first;
          while not eof do
          begin
            //для рублей
            if FieldByName('CODE').AsString = 'RUB' then
            begin
              edit;
              FieldByName('COURSE').AsCurrency      := 1;
              FieldByName('DATE_UPDATE').AsDateTime := Date;
              FieldByName('SOURCE').AsString        := url;
              FieldByName('NAME').AsString          := 'Российские рубли';
              FieldByName('IS_NATIONAL').AsBoolean  := true;
              post;
            end
            else
            begin
                for j := 0 to high(cbr) do
                begin//для всех остальных валют

                  if AnsiUpperCase(cbr[j].CharCode) = AnsiUpperCase(FieldByName('CODE').AsString) then
                  begin
                    edit;
                    FieldByName('COURSE').AsCurrency      := (cbr[j].Value / cbr[j].Nominal);
                    FieldByName('DATE_UPDATE').AsDateTime := Date;
                    FieldByName('SOURCE').AsString        := url;
                    FieldByName('NAME').AsString          := cbr[j].Name;
                    FieldByName('IS_NATIONAL').AsBoolean  := false;
                    post;

                  end;// if AnsiUpperCase(cbr[j]) = AnsiUpperCase(FieldByName('CODE').AsString) then
                end;// for j := 0 to high(cbr) do
            end;//else

            next;

          end;// while not eof do
        end;// with fdataset do
        log('Курсы валют (GetByRUB) обновлены');
  finally
//    XMLDocument.SaveToFile('cbr.xml');
    fdataset.EnableControls;
    XMLDocument.Active := False;
    FreeAndNil(XMLDocument);

  end;
end;


Результат:
user posted image
PM MAIL   Вверх
pseud
Дата 21.7.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Если я сидя в Беларуси хочу получить курсы валют относительно российского рубля, то это уже курсы конверсии. 
Но курс конверсии полчим достаточно условный, т.к. реальные курсы конверсии субъекты на то уполномоченные выставляют вне зависимости от курсов валют.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 21.7.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.