Доступ к SQL-запросу 2010 для форматирования 14-символьных финансовых данных

У меня есть необработанные текстовые файлы финансов, которые я импортирую в Access 2010 и экспортирую в формат Excel. Эти файлы содержат несколько полей длиной 14 символов, которые представляют значения в долларах. У меня проблемы с преобразованием этих полей в валюту из-за 14-го символа. 14-й символ — это число, представленное скобкой или буквой. Он также определяет, является ли уникальное поле положительным или отрицательным значением.

Положительные числа от 0 до 9 начинаются с открывающей скобки { равной нулю, A равной единице, B равной двум,...I равной девяти.
Отрицательные числа от -0 до -9 (я знаю, что -0 - это математическая оплошность, но остановитесь на этом. Я не знаю, как еще это объяснить.) начинаются с закрывающей скобки } равно -0, J равно -1, K равно -2,... R равно -9.

Пример данных (все принадлежат одному полю/столбцу):
0000000003422{ преобразовано равно 342,20 долл. США
0000000006245} преобразовано равно -624,50 долл. США
0000000000210N преобразовано равно -21,05 долл. США
0000000011468D преобразовано составляет 1146,84 доллара США.

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

SET FIELD_1 = Format(Left([FIELD_1],12) & "." & Mid([FIELD_1],13,1) & IIf(Right([FIELD_1],1)="{",0,IIf(Right([FIELD_1],1)="A",1,IIf(Right([FIELD_1],1)="B",2,IIf(Right([FIELD_1],1)="C",3,IIf(Right([FIELD_1],1)="D",4,IIf(Right([FIELD_1],1)="E",5,IIf(Right([FIELD_1],1)="F",6,IIf(Right([FIELD_1],1)="G",7,IIf(Right([FIELD_1],1)="H",8,IIf(Right([FIELD_1],1)="I",9,"")))))))))),"$##0.00"), IIf(Right([FIELD_1],1)="}",0,IIf(Right([FIELD_1],1)="J",1,IIf(Right([FIELD_1],1)="K",2,IIf(Right([FIELD_1],1)="L",3,IIf(Right([FIELD_1],1)="M",4,IIf(Right([FIELD_1],1)="N",5,IIf(Right([FIELD_1],1)="O",6,IIf(Right([FIELD_1],1)="P",7,IIf(Right([FIELD_1],1)="Q",8,IIf(Right([FIELD_1],1)="R",9,"")))))))))),"-$##0.00")

person SpeakerBoxV    schedule 04.02.2015    source источник
comment
Мне кажется, вы оцениваете не того персонажа. Mid("0000000000210N", 13, 1) возвращает 0. Mid("0000000000210N", 14, 1) возвращает N, что, я думаю, вам действительно нужно. Примечание Right("0000000000210N", 1) даст вам N.   -  person HansUp    schedule 05.02.2015
comment
Спасибо @HansUp за ваш вклад. Я ценю его.   -  person SpeakerBoxV    schedule 06.02.2015


Ответы (1)


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

Private Function ConvertCurrency(strCur As String) As String
    Const DIGITS = "{ABCDEFGHI}JKLMNOPQR"

    Dim strAlphaDgt As String
    Dim intDgt As Integer, intSign As Integer
    Dim f As Integer
    Dim curConverted As Currency

    strAlphaDgt = Right(strCur, 1)               ' Extract 1st char from right

    f = InStr(DIGITS, strAlphaDgt)               ' Search char in DIGITS. Its position is related to digit value

    intDgt = (f - 1) Mod 10                      ' Converts position into value of the digit

    intSign = 1 - 2 * Int((f - 1) / 10)          ' If it's in the 1st half is positive, if in the 2nd half of DIGITS it's negative

    curConverted = intSign * _
        CCur(Left(strCur, Len(strCur) - 1) & _
        Chr(intDgt + 48)) / 100                  ' Rebuild a currency value with 2 decimal digits

    ConvertCurrency = Format(curConverted, _
        "$#,###.00")                             ' Format output

End Function

Если вам нужно иметь валюту в качестве возвращаемого значения, вы можете изменить тип, возвращаемый из String, в валюту и вернуть содержимое переменной curConverted.

Пока.

person Wiz    schedule 05.02.2015