Одесса: 3°С (вода 8°С)
Киев: -1°С
Львов: -4°С

Тема: Нужна помощь с Access

Ответить в теме
Показано с 1 по 13 из 13
  1. Вверх #1
    Посетитель Аватар для Anastasia
    Пол
    Женский
    Адрес
    Одесса
    Возраст
    34
    Сообщений
    374
    Репутация
    57

    По умолчанию Нужна помощь с Access

    У меня есть экселевская таблица с данными. В одной из коллонок есть деньги с копейками в очень не красивом виде (5-6 цифр после запятой). В аксесе делаю прогу по обработке и выводу отчета нужных данных экселевской табл.
    Проблема заключается в том, что мне необходимо суммировать эти уродливые копейки, но перед этим округлить до 2 десятых НЕ ЗРИТЕЛЬНО, а физически.

    В аксесе применяю выражение в запросе с функцией Round. Аксес выдает ошибку:"Ошибка синтаксиса в приведенном выражении. Задано выражении для операции без оператора".
    Подскажите, что неправильно, плиз:
    Выражение1: Round("Сумма, грн#" [2])
    Сумма грн#" - имя столбца в Екселе
    Последний раз редактировалось Anastasia; 31.08.2007 в 16:23.


  2. Вверх #2
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    Выражение1: Round("Сумма грн#" [2])
    Может так: Round(Столбец, 2)
    ~ Motivation is what gets you started. Habit is what keeps you going.

  3. Вверх #3
    Посетитель Аватар для Anastasia
    Пол
    Женский
    Адрес
    Одесса
    Возраст
    34
    Сообщений
    374
    Репутация
    57
    Цитата Сообщение от Яр Посмотреть сообщение
    Может так: Round(Столбец, 2)
    Я так уже пробовала, не помогает. Ругается, что лишняя запятая или не поставленны кавычки.

  4. Вверх #4
    User banned
    Пол
    Мужской
    Адрес
    СНГ, Одесса
    Возраст
    42
    Сообщений
    15,258
    Репутация
    5810
    Я не знаю версию вашего Access, но у VBA, да и у VB есть сложности с обычной функцией Round.

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

    Код:
    Private Function fnADownDigits(ByVal X As Double, Optional ByVal Digits As Integer = 0) As Double
         fnADownDigits = fnAsymDown(X, 10 ^ Digits)
    End Function
    
    Private Function fnAsymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
         fnAsymDown = Int(X * Factor) / Factor
    End Function
    
    Private Function fnSymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
         fnSymDown = Fix(X * Factor) / Factor
       '  Alternately:
       '  SymDown = AsymDown(Abs(X), Factor) * Sgn(X)
    End Function
    
    Private Function fnAsymUp(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
       Dim Temp As Double
         Temp = Int(X * Factor)
         fnAsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor
    End Function
    
    Private Function fnSymUp(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
        Dim Temp As Double
        Temp = Fix(X * Factor)
        fnSymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor
    End Function
    
    Private Function fnAsymArith(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
         fnAsymArith = Int(X * Factor + 0.5) / Factor
    End Function
    
    Private Function fnSymArith(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
         fnSymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor
       '  Alternately:
       '  SymArith = Abs(AsymArith(X, Factor)) * Sgn(X)
    End Function
    
    Private Function fnBRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
       '  For smaller numbers:
       '  BRound = CLng(X * Factor) / Factor
       Dim Temp As Double, FixTemp As Double
         Temp = X * Factor
         FixTemp = Fix(Temp + 0.5 * Sgn(X))
         ' Handle rounding of .5 in a special manner
         If Temp - Int(Temp) = 0.5 Then
           If FixTemp / 2 <> Int(FixTemp / 2) Then ' Is Temp odd
             ' Reduce Magnitude by 1 to make even
             FixTemp = FixTemp - Sgn(X)
           End If
         End If
         fnBRound = FixTemp / Factor
    End Function
    
    Private Function fnRandRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
       ' Should Execute Randomize statement somewhere prior to calling.
       Dim Temp As Double, FixTemp As Double
         Temp = X * Factor
         FixTemp = Fix(Temp + 0.5 * Sgn(X))
         ' Handle rounding of .5 in a special manner.
         If Temp - Int(Temp) = 0.5 Then
           ' Reduce Magnitude by 1 in half the cases.
           FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X)
         End If
         fnRandRound = FixTemp / Factor
    End Function
    
    Private Function fnAltRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
       Static fReduce As Boolean
       Dim Temp As Double, FixTemp As Double
         Temp = X * Factor
         FixTemp = Fix(Temp + 0.5 * Sgn(X))
         ' Handle rounding of .5 in a special manner.
         If Temp - Int(Temp) = 0.5 Then
           ' Alternate between rounding .5 down (negative) and up (positive).
           If (fReduce And Sgn(X) = 1) Or (Not fReduce And Sgn(X) = -1) Then
           ' Or, replace the previous If statement with the following to
           ' alternate between rounding .5 to reduce magnitude and increase
           ' magnitude.
           ' If fReduce Then
             FixTemp = FixTemp - Sgn(X)
           End If
           fReduce = Not fReduce
         End If
         fnAltRound = FixTemp / Factor
    End Function
    К данному коду в модуле добавляете публик функцию того округления, что вам нужно, например

    Код:
    Public Function fnRoundDigits(ByVal X As Double, Optional ByVal Digits As Integer = 0) As Double
         fnRoundDigits = fnSymArith(X, 10 ^ Digits)
    End Function
    Потом связываете лист Excel с Access через связанную таблицу, названную допустим tbl_FromExcel , и создаете простой запрос:

    SELECT fnRoundDigits([tbl_FromExcel].[Сумма, грн],2) AS fld_RoundedSum FROM tbl_FromExcel;
    Последний раз редактировалось RJK; 31.08.2007 в 17:36.

  5. Вверх #5
    Постоялец форума Аватар для Макс
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    1,646
    Репутация
    1887
    А можно еще вопрос по Аксессу (в моем случае 2000-й)

    Есть форма с килограммом полей. Юзер ее заполняет и иногда (разумеется!) ближе к концу, нажимает "ESC". Все введенные данные - кирдык. Можно как-то перехватить событие "нажатие на клавишу ESC"?

    И если можно - то КАК?

    Можно в личку. Тогда будет еще куча вопросов и при благоприятном решении - пиво. Или эквивалент.
    Самая лучшая штука - это Штука Баксов!

  6. Вверх #6
    User banned
    Пол
    Мужской
    Адрес
    СНГ, Одесса
    Возраст
    42
    Сообщений
    15,258
    Репутация
    5810
    Макс

    Способов решить данную проблему несколько.

    Самый простой - в свойствах формы для параметра "Перехват нажатия клавиш" задать "Да", а для события "клавиша вниз" написать обработчик кодов клавиш.

    Код:
    Const intEscapeKeyCode = 27
    
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case intEscapeKeyCode
                If MsgBox("Save record?", vbOKCancel) = vbOK Then Me.Form.Refresh
            Case Else
        End Select
    End Sub
    Теперь при нажатии escape пользователь будет выбирать, сохранить запись или нет.

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

  7. Вверх #7
    User banned
    Пол
    Мужской
    Сообщений
    136
    Репутация
    27
    round как rounв но вот так как работает int в аксессе это абзац

  8. Вверх #8
    Посетитель Аватар для Anastasia
    Пол
    Женский
    Адрес
    Одесса
    Возраст
    34
    Сообщений
    374
    Репутация
    57
    Большое спасибо RJK за такой хороший ответ. Я думаю он мне поможет. Вот, только есть пару вопросиков. Как в Аксесе посмотреть на эти модули? Я ими никогда не пользовалась. Или необходимую функцию надо создать в новом модуле?

  9. Вверх #9
    User banned
    Пол
    Мужской
    Адрес
    СНГ, Одесса
    Возраст
    42
    Сообщений
    15,258
    Репутация
    5810
    Я вложил самый простой файл с примером использования.

    Формат - акс.97, так что вы легко преобразуете его в любую из нужных вам версий.

    В примере я включил ассиметричное округление, т.е. отрицательные числа при округлении, например -0,115 будут округляться до -0,12, а не до -0,11

    Удачного вам округления
    Вложения

  10. Вверх #10
    Посетитель Аватар для Anastasia
    Пол
    Женский
    Адрес
    Одесса
    Возраст
    34
    Сообщений
    374
    Репутация
    57
    Цитата Сообщение от RJK Посмотреть сообщение
    Я вложил самый простой файл с примером использования.

    Формат - акс.97, так что вы легко преобразуете его в любую из нужных вам версий.

    В примере я включил ассиметричное округление, т.е. отрицательные числа при округлении, например -0,115 будут округляться до -0,12, а не до -0,11

    Удачного вам округления
    RJK, в целом механизм получился. Большое спасибо. Есть только маленькая вопросик, для уточнения. Банковский формат - fnBRound?

  11. Вверх #11
    User banned
    Пол
    Мужской
    Адрес
    СНГ, Одесса
    Возраст
    42
    Сообщений
    15,258
    Репутация
    5810
    Цитата Сообщение от Anastasia Посмотреть сообщение
    Банковский формат - fnBRound?
    Да, верно.
    Округляет к числам, кратным 2.

  12. Вверх #12
    Постоялец форума Аватар для Макс
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    1,646
    Репутация
    1887
    Есть база на MS Access 2000 (Критично! Только 2000!)
    Пару таблиц и одна форма ввода данных.
    Базу набивали с весны этого года и продолжают.
    Появилась острая необходимость сделать несколько отчетов.
    Тематика - медицинская статистика.
    Кто предварительно в состоянии взяться - напишите, пожалуйста, в "личку".
    Самая лучшая штука - это Штука Баксов!

  13. Вверх #13
    Ребята - совет от человека, который в далеком прошлом скушал собачку на MSA - храните деньги в КОПЕЙКАХ integer поле! А уже для человека делайте преобразование, убережете себя от множества проблем


Ответить в теме

Похожие темы

  1. Excel & Access
    от napTu3aH в разделе Программирование
    Ответов: 18
    Последнее сообщение: 10.02.2007, 21:49
  2. Access
    от ~Iren~ в разделе Студенческая жизнь
    Ответов: 11
    Последнее сообщение: 23.01.2007, 09:13
  3. Прошу помощи с Access.Очень срочно!
    от cTcangel в разделе Программирование
    Ответов: 4
    Последнее сообщение: 07.11.2006, 19:40
  4. Access Database to MySQL
    от Joda в разделе Программирование
    Ответов: 3
    Последнее сообщение: 21.10.2006, 22:40
  5. Microsoft Access + web
    от Egoist в разделе Программирование
    Ответов: 17
    Последнее сообщение: 03.08.2006, 09:19

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения