Валюта с дробными центами в списке

Я создаю программу покупок — msAccesss 2016. Некоторые из товаров, которые нужно купить, — это электрические компоненты, цена которых составляет около 0,06100 долларов США при покупке не менее 10 штук. Я пытаюсь отобразить это количество и цену за единицу в списке. Поле со списком округляет цену до центов. Кто-нибудь знает способ отобразить все $0,06100 в списке? Он отображает OK в представлении таблицы данных и в представлении таблицы данных запроса, привязанного к полю списка.

Подробнее: та часть Shopper, которая содержит эту информацию, представляет собой таблицу под названием PriceLists. В нем есть:

  1. RecNo (автономер для первичного ключа)
  2. VendorNo — внешний ключ к таблице Vendor — строка представляет цену поставщика.
  3. PartNo — внешний ключ к таблице Parts — строка представляет цену поставщика на деталь.
  4. Количество - не менее количества деталей, которые необходимо заказать, чтобы получить цену
  5. Цена - цена товара до 5 знаков после запятой в долларах США.
  6. LastChangedDate - фактически метка времени последнего изменения этой строки.

Функция каталога деталей программы начинается с открытия экрана поиска всех деталей. Пользователь определяет нужную деталь и поставщика и выбирает ее. Именно тогда отображается форма, которая доставляет мне неприятности. Он привязан к данным детали и имеет поле со списком, в котором отображаются цены со скидками за количество. Я беру данные с сайта продавца и добавляю в таблицу PricesLists. По мере добавления каждой строки она отображается в списке. Цена определяется как валюта в таблице PricesLists с 5 знаками после запятой.

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

Спасибо


person Perry Sugerman    schedule 17.06.2016    source источник


Ответы (2)


Используйте FormatCurrency([Выражение], [Число цифр]) или FormatNumber([Выражение], [Число цифр]). Оба будут округлять [Выражение] до [Числа цифр] в виде строки.

FormatCurrency([0,06100], 5) возвращает $0,06100.

FormatNumber([0,06100], 5) возвращает $0,06100

Вот сигнатуры методов, взятые из MSDN

FormatCurrency

Function FormatCurrency(
   ByVal Expression As Object,
   Optional ByVal NumDigitsAfterDecimal As Integer = -1,
   Optional ByVal IncludeLeadingDigit As TriState = TriState.UseDefault,
   Optional ByVal UseParensForNegativeNumbers As TriState = TriState.UseDefault,
   Optional ByVal GroupDigits As TriState = TriState.UseDefault
) As String

Номер формата

Function FormatNumber(
   ByVal Expression As Object,
   Optional ByVal NumDigitsAfterDecimal As Integer = -1,
   Optional ByVal IncludeLeadingDigit As TriState = TriState.UseDefault,
   Optional ByVal UseParensForNegativeNumbers As TriState = TriState.UseDefault,
   Optional ByVal GroupDigits As TriState = TriState.UseDefault
) As String
person Community    schedule 17.06.2016

«Проблема» заключается в том, что в списке отображается только текст, поэтому любое числовое исходное поле преобразуется в текст с использованием формата по умолчанию из настроек Windows.

Чтобы получить контроль, сделайте форматирование в исходнике, таким образом измените

Select ProductId, Price, Description From Table

to:

Select ProductId, Format(Price, "$0.000000"), Description From Table

Однако, поскольку вы сохраняете значения как валюту, вы никогда не получите более четырех знаков после запятой с округлением Бейкера:

Value = CCur(0.567892)
' will return: 0.5679

поэтому, возможно, придется либо масштабировать сохраненные значения - сохранить как Cent (x 100) и разделить на 100 при чтении:

Select ProductId, Format(PriceCent / 100, "$0.000000"), Description From Table

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

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

Округление значений вверх, вниз, на 4/5 или до значащих цифр

Комментарий автора

Изменение поля «Цена» на «Двойное число» вместо валюты позволяет мне иметь точность 5 знаков после запятой в цене за единицу без необходимости масштабирования. Я пытался использовать DECIMAL, который есть в документации Access SQL, но, похоже, его нет в коде. Поэтому я остановился на двойнике. Мне нужно только округлить его до 5-значной точности в расчетах цен для списков покупок. Кажется, это будет проще, чем масштабирование, когда мне придется выполнять вычисления.

Ниже приведен фрагмент кода нового рабочего кода:

Const strPriceFormat As String = """$##0.00###"""
Const sqlVendorPriceList As String = "SELECT PricesLists.RecNo" & _
                                ", PricesLists.VendorNo AS VNo" & _
                                ", PricesLists.PartNo as Pno" & _
                                ", PricesLists.Quantity as Qty" & _
                                ", Format(PricesLists.Price, " & strPriceFormat & ") as Price" & _
                                " FROM PricesLists INNER JOIN VendorParts" & _
                                " ON PricesLists.PartNo=VendorParts.PartNo" & _
                                " AND PricesLists.VendorNo = VendorParts.VendorNo"
person Gustav    schedule 17.06.2016
comment
ХОРОШО. В VBA Decimal доступен только как подтип данных для Variant. Если вы хотите увидеть примеры его использования, изучите ссылку на функции округления, которые я предоставил выше, и вы увидите интенсивное использование CDec для получения высокой точности и нулевых ошибок функций. - person Gustav; 17.06.2016