Лучшая практика с использованием нескольких валют и [закрытая] Реализация

Я нахожу трудным найти любое обсуждение лучших практик для контакта с несколькими валютами. Кто-либо может обеспечить некоторое понимание или ссылки на справку?

Я понимаю, что существует много способов сделать это - или транзакционно где Вы храните значение, вводимое, как, или функционально где Вы преобразовываете в базовую ставку. В обоих случаях обменный курс необходим, чтобы быть сохраненным, который покрывает то время транзакций за каждую валюту, что это, возможно, должно быть преобразовано в в будущем.

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

Производительность и Масштабируемость являются основными факторами. У нас есть (весь .NET) победа и веб-клиент, комплект отчетов и ряд веб-сервисов, которые предоставляют функциональность бэкенду базы данных. Я могу кэшировать информацию об обменном курсе где-нибудь (например, на клиенте) при необходимости.

Править: Я действительно хотел бы ссылки на некоторые документы или ответы, которые включают 'глюки' от предыдущего опыта.

59
задан Mr Shoubs 30 June 2010 в 16:29
поделиться

5 ответов

Я не смог найти окончательного обсуждения, поэтому размещаю свои выводы, надеюсь, это кому-нибудь поможет.

Таблица валют должна включать код культуры, чтобы использовать любые классы глобализации.

Метод транзакции

  • Хранить в валюте, локальной для клиента, и хранить несколько курсов конвертации для валюты транзакции, которые применялись, когда транзакция произошла.
  • Требуется несколько курсов обмена для каждой валюты
  • Таблица настроек сайта будет хранить валюту ввода
  • Ввод и вывод значений на уровне клиента не будет иметь накладных расходов, так как можно считать, что значение в правильной валюте
  • Чтобы применить курсы обмена, вам нужно знать валюту вводимых значений (которая может быть разной для кросс-клиентских отчетов), затем умножить ее на соответствующий курс обмена, который действовал в период времени транзакции.

Функциональный метод

  • Хранить в одной базовой валюте, хранить курсы конвертации для этой валюты, которые применяются в течение времени
  • Необходимо рассмотреть вопрос о том, где лучше всего конвертировать значения - в точке между фронт-эндом и базой данных
  • На производительность ввода влияет незначительно, поскольку необходимо выполнить конвертацию в базовую валюту. Курс обмена может быть кэширован на клиенте (обратите внимание, что каждая организация может использовать свой курс обмена)
  • Это требует одного набора курсов обмена (из базовой валюты во все остальные требуемые валюты)
  • Чтобы применить курсы обмена, каждая транзакция должна быть преобразована между базовой и требуемыми валютами

Композитный

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

Сравнение

В реальности вам придется выбирать между функциональным и транзакционным методами. Оба имеют свои преимущества и недостатки.

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

Метод транзакций гораздо более гибкий, хотя он требует хранения большего количества информации о курсах обмена и каждая транзакция должна быть связана с валютой входа (хотя это может быть применено к группе клиентов, а не к каждой транзакции). Как правило, это не повлияет на код, уже находящийся в производстве, поскольку местные валюты все равно будут использоваться на местном уровне, что делает это решение простым в реализации и поддержке. Хотя очевидно, что любые отчеты или значения, которые необходимо конвертировать в другую валюту, будут затронуты.

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

Заключение

Транзакционный метод управления валютой обеспечит гибкий подход, избежание негативного влияния на производительность клиента и нулевую модификацию клиентского кода. Негативное влияние на производительность, скорее всего, будет иметь место в отчетах, где все придется переделывать, если потребуются разные валюты. Каждый клиентский сайт должен будет хранить ссылку на валюту, в которой указывается валюта ввода. Можно обойтись хранением курсов валют на высоком уровне (например, группа клиентских сайтов и т.д.), это позволит минимизировать объем хранимых данных. Проблемы могут возникнуть, если информация о курсах обмена требуется на более низком уровне.

39
ответ дан 24 November 2019 в 18:32
поделиться

Поскольку обменные курсы колеблются, один из подходов, как вы упомянули, состоит в том, чтобы сохранить «введенную как есть» сумму, которая не конвертируется, но отобразить сопутствующее поле, которое отображается только для отображения и показывает конвертированную сумму. Для преобразования потребуется таблица обменных курсов и их применимые диапазоны дат. Если размер небольшой, возможно кэширование на клиенте. В противном случае для выполнения преобразования потребуется удаленный вызов.

1
ответ дан 24 November 2019 в 18:32
поделиться

Однозначного ответа нет, потому что он очень сильно зависит от того, как бизнес обрабатывает транзакции в этих валютах. Некоторые компании используют довольно изощренные способы управления иностранной валютой. Я предлагаю вам прочитать о мультивалютном учете.

Главное, что нужно сделать, - это зафиксировать данные в единицах измерения, стоимости и дате, когда бизнес-операция выполняется без какого-либо преобразования, иначе вы рискуете потерять что-то при переводе. Для отображения и отчетности конвертируйте по запросу, используя либо исходный обменный курс, либо любой другой обменный курс в зависимости от намерений пользователя.

Хранение и вычисление со значениями типа «Десятичный» (в C #) - не используйте float / double, иначе вы рискуете ошибиться округлением.

Например, в предыдущей жизни я создавал мультивалютное приложение:

  • Каждый день устанавливался курс обмена на день, который сохранялся в базе данных и кешировался для преобразования в приложении.
  • Все транзакции будут фиксироваться как сумма + валюта + дата (т. Е. Без конвертации).
  • Отображение транзакции в валюте пользователя было выполнено «на лету». Дайте понять, что это не валюта транзакции, а отображаемая валюта. Это похоже на выписку по кредитной карте, когда вы уезжаете в отпуск. Он показывает сумму иностранной транзакции, а затем, сколько она обойдется вам в вашей национальной валюте.
17
ответ дан 24 November 2019 в 18:32
поделиться

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

  1. одна таблица валют с несколькими полями, включая числа десятичных знаков, которые должны учитываться для валюты (да, некоторые валюты должны управляться с тремя десятичными знаками .. .) и значение обменного курса, которое не имеет другого значения, кроме как «предлагаемый / используемый по умолчанию обменный курс» при оценке «невыполненных» или «ожидающих» финансовых транзакций (см. ниже)

  2. В этой таблице валют одна из записи имеют обменный курс 1. Это основная / основная валюта в нашей системе

. Все финансовые транзакции или все операции с финансовым измерением (то, что мы называем обязательствами на нашем языке), либо сортируются как «ожидающие» или «выполнено»:

  1. Незавершенные транзакции - это, например, счета, которые, как ожидается, будут получены на определенную сумму в определенную дату. В нашей системе отслеживания бюджета эти суммы всегда переоцениваются в соответствии с «предлагаемым обменным курсом / обменным курсом по умолчанию», доступным в таблице валют.

  2. Выполненные транзакции всегда сохраняются с датой выполнения, суммой, валютой И обменным курсом, который необходимо подтвердить / ввести при вводе данных выполнения.

9
ответ дан 24 November 2019 в 18:32
поделиться

(Я предполагаю, что вы уже знаете, что вам определенно не следует хранить данные о валюте как плавающие, и почему )

На мой взгляд, было бы проще работать с единой базовой валютой; тем не менее, вы должны сохранить исходную сумму, исходную валюту, курс конвертации и сумму в базовой валюте - в противном случае ваш бухгалтерский отдел. могут съесть вас заживо, так как они, вероятно, будут хранить разные валюты как бы отдельно.

2
ответ дан 24 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: