2016-06-17 10 views
0

Я создаю программу покупок - msAccesss 2016. Некоторые из предметов, которые нужно купить, это электрические компоненты, цены которых равны 0.06100, если не менее 10 купленных. Я пытаюсь отобразить это количество и цену единицы в списке. В окне списка округляется цена до центов. Кто-нибудь знает способ отображения всего $ 0.06100 в списке? Он отображает ОК в представлении таблицы данных и в представлении таблицы данных запроса, привязанного к списку.Валюта с дробными центами в окне списка

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

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

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

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

Благодаря

ответ

1

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

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 

FormatNumber

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 
1

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

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

Select ProductId, Price, Description From Table 

к:

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

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

Value = CCur(0.567892) 
' will return: 0.5679 

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

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

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

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

Rounding values up, down, by 4/5, or to significant figures

Изменение ценового поля, которое должно быть двойным, вместо валюты позволяет мне иметь пятизначную точность по цене единицы без необходимости масштабирования. Я попытался использовать 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" 
+0

OK. В VBA _Decimal_ доступен только в качестве типа вспомогательных данных для _Variant_. Если вы хотите увидеть примеры его использования, изучите ссылку на функции округления, приведенную выше, и вы увидите интенсивное использование 'CDec' для получения высокой точности и нулевых ошибок функций. – Gustav