TechKnowledge Content
Otázka: Byl napsán kód jazyka VBA, který porovnává dvě hodnoty měny. Příklad tohoto kódu je uvedený níže:
If ccur(cost) > ccur(1000) then
Při spuštění tohoto řádku kódu se zobrazí chybová zpráva o nekompatibili datového typu nebo neshodě typu. Nastavení Windows měny je aktuálně definováno jako symbol libry v angličtině pro symbol měny. Pokud změním symbol měny na $, kód se úspěšně spustí. Co se tady děje a existuje nějaký způsob, jak tento problém vyřešit?
Odpověď: Funkce Ccur() v jazyce VBA vždy respektuje nastavení měny Ovládacích panelů při vyhodnocování tohoto pole. Vzhledem k tomu, že implementace Jazyka VBA Dynamics vždy předá hodnoty polí jako řetězce, budete mít tento problém pokaždé, když se vyhodnotí hodnota měny, která neodpovídá nastavení měny v Windows. V souboru nápovědy jazyka VBA označuje, že funkce převodu datového typu by měly být místo funkce Val použity k poskytování převodů z jednoho datového typu do druhého s mezinárodním povědomím. Když například použijete funkci CCur(), budou v závislosti na nastavení národního prostředí počítače správně rozpoznány různé oddělovače desetinných míst, různé oddělovače tisíců a různé možnosti měny. V tomto principu si všimněte, že pracujete s Microsoft Dynamics GP:-
CCur("œ1000") se rovná neshodě typu (tj. tento řetězec není platná měna), pokud nastavení Windows Currency není nastavené na "pound".
-
Pokud je nastavená na "pound", vrátí CCur("œ1000") hodnotu 1000, ale CCur("$1000") se rovná chybě neshody typu.
Nejlepší způsob, jak se vypořádat s měnami z jazyka VBA, je napsat funkci, která převede libovolný řetězec s ne numerickými symboly vpředu na číselnou hodnotu (nebo měnu). Třeba takhle:
If CurrencyValueFromDynField(cost) > ccur(1000) then
kde je funkce s názvem CurrencyValueFromDynField definována následujícím způsobem. Tento kód správně zpracovává záporná čísla, která mají znaménka minus, která jsou obklopená hranatými závorkami nebo mají mezery mezi symbolem měny a číslem.
Public Function CurrencyValueFromDynField(FieldString As String) As Currency
Dim i As Integer Dim TempChar, TempString As String ' Strip off all non-numeric characters TempString = "" For i = 1 To Len(FieldString) TempChar = Mid(FieldString, i, 1) If InStr("1234567890.,-()", TempChar) > 0 Then TempString = TempString & TempChar End If Next FieldString = TempString ' Return the numeric value of the string (as a currency data type ) CurrencyValueFromDynField = CCur(FieldString) End Function
Tento článek byl TECHKnowledge Document ID:10036