Я нахожу трудным найти любое обсуждение лучших практик для контакта с несколькими валютами. Кто-либо может обеспечить некоторое понимание или ссылки на справку?
Я понимаю, что существует много способов сделать это - или транзакционно где Вы храните значение, вводимое, как, или функционально где Вы преобразовываете в базовую ставку. В обоих случаях обменный курс необходим, чтобы быть сохраненным, который покрывает то время транзакций за каждую валюту, что это, возможно, должно быть преобразовано в в будущем.
Мне нравится гибкость транзакционного подхода, который позволяет старой информации об обменном курсе вводиться позднее, но вероятно имеет больше служебное (поскольку необходимо хранить больше данных обменного курса), чем функциональный подход.
Производительность и Масштабируемость являются основными факторами. У нас есть (весь .NET) победа и веб-клиент, комплект отчетов и ряд веб-сервисов, которые предоставляют функциональность бэкенду базы данных. Я могу кэшировать информацию об обменном курсе где-нибудь (например, на клиенте) при необходимости.
Править: Я действительно хотел бы ссылки на некоторые документы или ответы, которые включают 'глюки' от предыдущего опыта.
Я не смог найти окончательного обсуждения, поэтому размещаю свои выводы, надеюсь, это кому-нибудь поможет.
Таблица валют должна включать код культуры, чтобы использовать любые классы глобализации.
Метод транзакции
Функциональный метод
Композитный
Сравнение
В реальности вам придется выбирать между функциональным и транзакционным методами. Оба имеют свои преимущества и недостатки.
Функциональный метод не требует хранения местной валюты для транзакции, конвертирования текущих значений базы данных в базовую валюту, нуждается только в одном наборе курсов обмена, немного сложнее в реализации и поддержке, хотя требует меньшего объема памяти.
Метод транзакций гораздо более гибкий, хотя он требует хранения большего количества информации о курсах обмена и каждая транзакция должна быть связана с валютой входа (хотя это может быть применено к группе клиентов, а не к каждой транзакции). Как правило, это не повлияет на код, уже находящийся в производстве, поскольку местные валюты все равно будут использоваться на местном уровне, что делает это решение простым в реализации и поддержке. Хотя очевидно, что любые отчеты или значения, которые необходимо конвертировать в другую валюту, будут затронуты.
В обоих случаях каждая транзакция будет нуждаться в курсах обмена на момент транзакции для каждой валюты, в которую ее нужно конвертировать - это необходимо в момент транзакции для функционального метода, однако транзакционный метод обеспечивает большую гибкость, поскольку данные о прошлом курсе обмена могут быть введены в любое время (что позволяет использовать любую валюту), т.е. вы теряете возможность использовать другие обменные курсы в функциональном методе.
Заключение
Транзакционный метод управления валютой обеспечит гибкий подход, избежание негативного влияния на производительность клиента и нулевую модификацию клиентского кода. Негативное влияние на производительность, скорее всего, будет иметь место в отчетах, где все придется переделывать, если потребуются разные валюты. Каждый клиентский сайт должен будет хранить ссылку на валюту, в которой указывается валюта ввода. Можно обойтись хранением курсов валют на высоком уровне (например, группа клиентских сайтов и т.д.), это позволит минимизировать объем хранимых данных. Проблемы могут возникнуть, если информация о курсах обмена требуется на более низком уровне.
Поскольку обменные курсы колеблются, один из подходов, как вы упомянули, состоит в том, чтобы сохранить «введенную как есть» сумму, которая не конвертируется, но отобразить сопутствующее поле, которое отображается только для отображения и показывает конвертированную сумму. Для преобразования потребуется таблица обменных курсов и их применимые диапазоны дат. Если размер небольшой, возможно кэширование на клиенте. В противном случае для выполнения преобразования потребуется удаленный вызов.
Однозначного ответа нет, потому что он очень сильно зависит от того, как бизнес обрабатывает транзакции в этих валютах. Некоторые компании используют довольно изощренные способы управления иностранной валютой. Я предлагаю вам прочитать о мультивалютном учете.
Главное, что нужно сделать, - это зафиксировать данные в единицах измерения, стоимости и дате, когда бизнес-операция выполняется без какого-либо преобразования, иначе вы рискуете потерять что-то при переводе. Для отображения и отчетности конвертируйте по запросу, используя либо исходный обменный курс, либо любой другой обменный курс в зависимости от намерений пользователя.
Хранение и вычисление со значениями типа «Десятичный» (в C #) - не используйте float / double, иначе вы рискуете ошибиться округлением.
Например, в предыдущей жизни я создавал мультивалютное приложение:
Наша компания занимается мультивалютным бухгалтерским учетом и бюджетированием. Реализованное нами решение довольно простое и включает в себя следующее:
одна таблица валют с несколькими полями, включая числа десятичных знаков, которые должны учитываться для валюты (да, некоторые валюты должны управляться с тремя десятичными знаками .. .) и значение обменного курса, которое не имеет другого значения, кроме как «предлагаемый / используемый по умолчанию обменный курс» при оценке «невыполненных» или «ожидающих» финансовых транзакций (см. ниже)
В этой таблице валют одна из записи имеют обменный курс 1. Это основная / основная валюта в нашей системе
. Все финансовые транзакции или все операции с финансовым измерением (то, что мы называем обязательствами на нашем языке), либо сортируются как «ожидающие» или «выполнено»:
Незавершенные транзакции - это, например, счета, которые, как ожидается, будут получены на определенную сумму в определенную дату. В нашей системе отслеживания бюджета эти суммы всегда переоцениваются в соответствии с «предлагаемым обменным курсом / обменным курсом по умолчанию», доступным в таблице валют.
Выполненные транзакции всегда сохраняются с датой выполнения, суммой, валютой И обменным курсом, который необходимо подтвердить / ввести при вводе данных выполнения.
(Я предполагаю, что вы уже знаете, что вам определенно не следует хранить данные о валюте как плавающие, и почему )
На мой взгляд, было бы проще работать с единой базовой валютой; тем не менее, вы должны сохранить исходную сумму, исходную валюту, курс конвертации и сумму в базовой валюте - в противном случае ваш бухгалтерский отдел. могут съесть вас заживо, так как они, вероятно, будут хранить разные валюты как бы отдельно.