TechKnowledge Content

Въпрос: Vba код е написан, който сравнява две валутни стойности. Показан по-долу е пример за този код:

If ccur(cost) > ccur(1000) then

Когато този ред с код се изпълни, това води до несъвместимост на типа данни или съобщение за грешка при несъответствие на типа тип. Настройките Windows валута в момента се дефинират като символ на английски "паунд" за валутния символ. Ако променя валутния символ на "$", кодът се изпълнява успешно. Какво се случва тук и има ли някакъв начин да заобиколите този проблем? Отговор: Във VBA функцията Ccur() винаги спазва настройките за валута на контролния панел, когато оценява това поле. Тъй като внедряването на VBA на Dynamics винаги ще предава стойностите на полетата като низове, ще имате този проблем всеки път, когато се оценява валутна стойност, която не отговаря на валутните настройки в Windows.В помощния файл на VBA показва, че функциите за преобразуване от тип данни трябва да се използват вместо Val, за да се предоставят международно осведомени реализации от един тип данни в друг. Например когато използвате функцията CCur(), различните десетични разделители, различните хиляди разделители и различните опции за валута се разпознават правилно в зависимост от настройката за езикови стойности на вашия компютър.Под това разбиране обърнете внимание на работата с GP на Microsoft Dynamics:

  • CCur("œ1000") ще се равнява на несъответствие на типа (т.е. този низ не е валидна валута), ако настройката Windows Валута не е зададена на "паунд".

  • Ако е зададено на "фунт", CCur("œ1000") ще върне стойност от 1000, но след това CCur("$1000") ще се равнява на грешка при несъответствие на типа.

Най-добрият начин да се справите с валути от VBA би било да напишете функция, която ще преобразува всеки низ с нечислени символи пред числова стойност (или валута). Например ето така:

If CurrencyValueFromDynField(cost) > ccur(1000) then

където функцията, наречена CurrencyValueFromDynField, се дефинира по следния начин. Този код правилно обработва отрицателните числа, които имат знаци за напредване или крайни минуси, които са заобиколени от скоби или имат интервали между валутния символ и числото.

Public Function CurrencyValueFromDynField(FieldString As String) As CurrencyDim i As IntegerDim TempChar, TempString As String' Strip off all non-numeric charactersTempString = ""For i = 1 To Len(FieldString)TempChar = Mid(FieldString, i, 1)If InStr("1234567890.,-()", TempChar) > 0 ThenTempString = TempString & TempCharEnd IfNextFieldString = TempString' Return the numeric value of the string (as a currency data type )CurrencyValueFromDynField = CCur(FieldString)End Function

Тази статия е TechKnowledge Document ID:10036

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.