0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
1

Вычисления в Access

12.09.2010, 20:54. Показов 9067. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Помогите пожалуйста химикам разобраться с базой данных... Интересует вопрос, можно ли, чтобы в таблице данных производились расчеты - например, дата выпуска реактива и срок годности - забивается... А вот дата, до которой годен реактив - чтобы вычислялась на основе этих двух данных автоматически (как, например, это обычно происходит в excel'е? Или это не позволяет делать программа в таблице, а только в формах и отчетах?
И если таки такое возможно - подскажите, какие условия!!!
Заранее спасибо. С уважением, Дмитрий.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2010, 20:54
Ответы с готовыми решениями:

Вычисления в Access 2007
Всем Доброго дня!!!! Подскажите пожалуйста, как реализовать расчет, проблема такая: есть таблица...

Вычисления в запросе access
У меня база данных ЖКХ . Мне надо рассчитать сумму за потребленные услуги по счётчику. Что бы...

Связи и Вычисления в запросе access
Доброе время суток ) У меня есть база данных жкх . В ней мне надо посчитать сумму которую нужно...

MS Access БД вычисления в запросах и отчетах
Здравствуйте. Для оптимизации своего рабочего времени решил написать базу данных по учету автошин....

19
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
12.09.2010, 22:12 2
Здравствуйте Дмитрий.
"..можно ли, чтобы в таблице данных производились расчеты.." нет не только возможности, но и необходимости, подобная информация отображается в таблице формируемой запросом.
например запрос: "SELECT Date(), Date()+10" отобразит две даты, текущую и текущую плюс десять дней.
В Вашем случае возможно реализовать так:
1. создайте в таблице поле для даты выпуска - Поле1
2. создайте в таблице поле для кол-ва дней (срок годности) - Поле2
3. SQL конструкция :
SELECT Поле1 AS Выпуск, Поле1 + Поле2 AS [Годен до] From Table [Имя таблицы]
отобразит необходимые данные (без сохранения)
Примерно так.
Евгений.
2
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
13.09.2010, 16:57  [ТС] 3
Евгений, спасибо, что откликнулись...
подробный ответ!!! и еще один маленьких вопросик... можно ли проводить манипуляции с датой выпуска плюс срок хранения, но не в днях, а месяцах и годах... как при этом изменится запрос?
С уважением, Дмитрий.
0
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
13.09.2010, 17:11 4
Просче производить вычисление в форме, используя подпрограмму:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Public Sub SubAge(gdtBeginDate As Date, gdtEndDate As Date)
'Використано алгоритм Сергея Терени з сайту MS Access - Кирпичики [url]http://msa.polarcom.ru/downloads.htm[/url]
'АЛГОРИТМ РЕШЕНИЯ ЧАСТИЧНО БЫЛ ВЗЯТ С САЙТА БИБЛИОТЕКИ АЛГОРИТМОВ
Dim dm(12) As Integer, cf As Integer
'описываем массив количества дней в месяцах
dm(1) = 31
dm(2) = 28
dm(3) = 31
dm(4) = 30
dm(5) = 31
dm(6) = 30
dm(7) = 31
dm(8) = 31
dm(9) = 30
dm(10) = 31
dm(11) = 30
dm(12) = 31
If LeapYear(DatePart("yyyy", gdtEndDate)) Then
    dm(2) = 29  'если год високосный, то число дней в месяце февраль -29
        Else
    dm(2) = 28  'если год невисокосный, то число дней в месяце февраль -28
End If
' кількість днів
cf = 0
d = DatePart("d", gdtEndDate) - DatePart("d", gdtBeginDate)
If d < 0 Then
    d = d + dm(DatePart("m", gdtBeginDate))
    cf = 1
Else
    d = DatePart("d", gdtEndDate) - DatePart("d", gdtBeginDate)
End If
If d >= dm(DatePart("m", gdtEndDate)) Then
    d = d - dm(DatePart("m", gdtEndDate))
    cf = 0
End If
'кількість місяців
m = DatePart("m", gdtEndDate) - DatePart("m", gdtBeginDate) - cf
cf = 0
If m < 0 Then
    m = m + 12
    cf = 1
End If
'кількість років
If m = 12 Then
    cf = -1
    m = 0
End If
    
Y = DatePart("yyyy", gdtEndDate) - DatePart("yyyy", gdtBeginDate) - cf
 
VarD = d 'дней
VarM = m 'месяцев
VarY = Y 'лет
End Sub
и функция вычисления высокосного года:
Visual Basic
1
2
3
Function LeapYear(YYYY As Integer) As Integer
  LeapYear = YYYY Mod 4 = 0 And (YYYY Mod 100 <> 0 Or YYYY Mod 400 = 0)
End Function
1
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
13.09.2010, 18:09  [ТС] 5
я к сожалению... не владею языками программирования...
как всем этим пользоваться... прошу прощения за недальновидность...
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
13.09.2010, 18:09 6
Здравствуйте Дмитрий.
большой плюс диалекта SQL применяемого в MS Access это возможность использования VBA функций (в том числе и пользовательских) в теле запроса.
создайте подобную функцию :
Visual Basic
1
2
3
Function newDate(dV As Date, Optional iY%, Optional iM%, Optional iD%) As Date
    newDate = DateSerial(Year(dV) + iY, Month(dV) + iM, Day(dV) + iD)
End Function
и проверьте выполнение конструкцией:
SQL
1
SELECT DATE(), newDate(DATE(), 0, 2, 5)
Примерно так.
HOUSE MD "..используя подпрограмму..", идея не плохая, но код может быть короче:
Visual Basic
1
2
3
4
Dim v1, v2, v3
v1 = DateDiff("yyyy", #1/1/2000#, Date)
v2 = DateDiff("m", #1/1/2000#, Date)
v3 = Abs(Cint(#1/1/2000#) - Cint(Date))
Евгений.
2
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
13.09.2010, 18:49  [ТС] 7
надо попробовать... может не так страшен SQL... но пока с трудом предполагаю... как это делается...

Добавлено через 27 минут
Люди, подскажите пожалуйста еще...
Выражение1: [Таблица1]![дата выпуска]+[Таблица1]![срок годности, мес]
дата выпуска - формат "дата"
срок годности - формат "число"
в режиме запроса формула работает... но срок годности считает в днях... как это переделать в месяцы и годы?

Добавлено через 6 минут
когда переходишь в режим SQL, то выдается сообщение
SQL
1
2
3
SELECT Таблица1.[наименование реактива], Таблица1.[дата выпуска], 
Таблица1.[срок годности, мес], [Таблица1]![дата выпуска]+[Таблица1]![срок годности, мес] AS Выражение1
FROM Таблица1;
куда вставить все те вещи, которые Вы советуете?
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
14.09.2010, 08:39 8
winddim, функция описанная выше, помещается в Модуль.
"..в режим SQL, то выдается сообщение.." - это "сообщение собственно и есть SQL конструкция запроса, а "режим SQL" это редактор.
после создания функции разместите в SQL редактор подобную конструкцию:
SQL
1
2
3
SELECT [наименование реактива], [дата выпуска], 
[срок годности, мес], newDate([дата выпуска], 0, [срок годности, мес], 0 ) AS [Годен до]
FROM Таблица1
и это всё
Евгений.
0
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
14.09.2010, 09:44 9
Доброго времени суток. Уважаемый Евгений.Заменил в своей базе подпрограмму определения возраста на Вашу. Не работает
Visual Basic
1
2
3
4
5
Public Sub SubAge(gdtBeginDate As Date, gdtEndDate As Date)
VarY = DateDiff("yyyy", gdtBeginDate, gdtEndDate)
VarM = DateDiff("m", gdtBeginDate, gdtEndDate)
VarD = Abs(CInt(gdtBeginDate) - CInt(gdtEndDate))
End Sub
Где ошибка ? Спасибо.
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
15.09.2010, 17:24 10
HOUSE MD простите действительно при ближайшем рассмотрении моя "наколенная" конструкция не выдерживает критики, предел Int - 32678 значит CInt(gdtBeginDate) скорее всего вызовет переполнение.
соответственно конструкция CInt(gdtBeginDate - gdtEndDate) будет работоспособна только если разница между датами не будет превышать 32768 дня.
конечно для того что бы обойти это ограничение можно обратится к Long
Visual Basic
1
v3 = CLng(#1/1/2000#) - CLng(Date)
но все же лучше использовать функцию DateDiff
Visual Basic
1
v3 = DateDiff("d", #1/1/2000#, Date)
Евгений.
1
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
15.09.2010, 19:02 11
Евгений, большое Вам спасибо. Но все равно работает не корректно. В примере gdtBeginDate - 01.04.2010; gdtEndDate - 02.07.2010
Visual Basic
1
2
3
4
5
6
7
Public Sub SubAge1(gdtBeginDate As Date, gdtEndDate As Date)
VarY = DateDiff("yyyy", gdtBeginDate, gdtEndDate) ' 0 лет
VarM = DateDiff("m", gdtBeginDate, gdtEndDate)' 3 месяца
'VarD = Abs(CInt(gdtBeginDate) - CInt(gdtEndDate))'не работает 92 дня вместо 1
'VarD = DateDiff("d", gdtBeginDate, gdtEndDate) 'работает не корректно - 92 дня вместо 1
'VarD = CLng(CLng(gdtBeginDate) - CLng(gdtEndDate)) 'работает не корректно
End Sub
Спасибо.
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
15.09.2010, 20:13 12
HOUSE MD, вся проблема в формате даты, проверьте как инициируются переменные gdtBeginDate и gdtEndDate. проблема явно в них. Даты обрабатываемые в VB(A) задаются форматом m/d/yyyy.
Убедиться Вы сможете вызвав процедуру командой :
Visual Basic
1
SubAge1 #4/1/2010#, #7/2/2010#
можно предварительно добавить в неё строки:
Visual Basic
1
2
VarM = Month(gdtBeginDate) 'вернет 4
VarM = Month(gdtEndDate) 'вернет 7
вот такая "проблема" с корректностью.

Евгений.
1
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
15.09.2010, 20:28 13
Уважаемій Евгений, а как на счет такой конструкции:
Visual Basic
1
2
3
4
5
Public Sub SubAge(gdtBeginDate As Date, gdtEndDate As Date)
VarY = DateDiff("yyyy", gdtBeginDate, gdtEndDate)
VarM = DateDiff("m", gdtBeginDate, gdtEndDate)
VarD = DatePart("d", gdtEndDate) - DatePart("d", gdtBeginDate)
End Sub
Работает, вроди, корректно.
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
15.09.2010, 20:38 14
HOUSE MD, подозреваю Вы хотите получить числа 0, 3, 1.
не знаю зачем, но попробуйте так:
Visual Basic
1
2
3
4
5
6
7
8
Public Sub SubAge1(gdtBeginDate As Date, gdtEndDate As Date)
Dim VarY, VarM, VarD
VarY = DateDiff("yyyy", gdtBeginDate, gdtEndDate) ' 0 лет
gdtBeginDate = DateSerial(Year(gdtBeginDate) + VarY, Month(gdtBeginDate), Day(gdtBeginDate))
VarM = DateDiff("m", gdtBeginDate, gdtEndDate) ' 3 месяца
gdtBeginDate = DateSerial(Year(gdtBeginDate), Month(gdtBeginDate) + VarM, Day(gdtBeginDate))
VarD = DateDiff("d", gdtBeginDate, gdtEndDate) ' 1
End Sub
такой вариант не зависит от года (убедитесь SubAge1 #4/1/2010#, #7/2/2015#)
Евгений.
1
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
15.09.2010, 20:41 15
Спасибо Евгений, проверю. Вопрос стоит в корректности вычисления разности дат. Я врач. Програмирование - хобби. У детей до года возраст записывается с точностью до дня.
0
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
20.09.2010, 14:13 16
Цитата Сообщение от Teslenko_EA Посмотреть сообщение
...такой вариант не зависит от года ...
Уважаемый Евгений ! Такой вариант короче. Хотелось бы услышать Ваше мнение:
Visual Basic
1
2
3
4
5
Public Sub SubAge(gdtBeginDate As Date, gdtEndDate As Date)
    VarY = DateDiff("yyyy", gdtBeginDate, gdtEndDate)
    VarM = DatePart("m", gdtEndDate) - DatePart("m", gdtBeginDate)
    VarD = DatePart("d", gdtEndDate) - DatePart("d", gdtBeginDate)
End Sub
Спасибо.
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
20.09.2010, 19:45 17
Здравствуйте HOUSE MD.
назначение функции DatePart - отображение части содержимого поля даты.
если эта "часть" Вас устраивает, то почему бы не пользоваться?
о функции DatePart есть упоминание в справке А97 (в архиве)
(это была единственная полностью русифицированная (включая VBA) справочная система MS Office)
Евгений.
Вложения
Тип файла: zip ACMAIN80.zip (1.34 Мб, 57 просмотров)
1
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
20.09.2010, 19:50 18
У меня не работает (под W7). Но запущу на другом компе. Спасибо.
0
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
08.10.2010, 10:49  [ТС] 19
Всем спасибо за ответы! Еще как вариант решения проблемы, с которой я столкнулся и просил помощи - это создание запроса и там посредством построителя выражений и функции DateAdd можно решать подобные проблемы.
0
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 10
08.10.2010, 11:09  [ТС] 20
Но вот еще возникла такая ситуация. Речь идет о складе химических реактивов.
есть таблица, где указываются паспортные сведения о реактиве - дата выпуска, степень чистоты, производитель, срок хранения, а также масса при поступлении.
затем, в запросе отображается срок, до которого годен реактив (делается, как я писал выше, с помощью функции DateAdd).
вопрос в следующем. каким образом лучше организовать списание реактива по мере его использования, например, каждодневно?
т.е. у каждого реактива есть свой порядковый номер (совпадает со значением счетчика в таблице). я вижупримитивный вариант решения вопроса - сделать таблицу (связанную с первой талицей) и там забивать вручную расход, а затем, например, в том же запросе, где выводится информация о дате, до которой годен реактив, считать остаток на начало следующего дня. Но это все страшно неудобно - придется каждый раз пролистывать таблицу в поиске нужного реактива.
Фантазия просит , чтобы было примерно так - в неком окне вводится порядковый номер реактива и масса использованного реактива (причем в течение одного дня может несколько раз использоваться один и тот же реактив), а программа суммирует расход и считает остаток... И. при необходимости, можно вывести отчет...
Можно ли такое сделать? если да, помогите пожалуйста!
0
08.10.2010, 11:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2010, 11:09
Помогаю со студенческими работами здесь

не могу понять вычисления в access
не могу понять вычисления в access..как вы думаете лучше в excel все подготовить а c access...

Вычисления в Access :вычислить заработную плату
Здравствуйте! Помогите пожалуйста с базой данных в Access. Необходимо вычислить заработную...

Как записать вычисления в базу данных Access
Подскажите как записать вычисления в базу данных Access. То есть у меня есть программа которая в...

Как в Access создать формулу для вычисления суммы?
Проблема такая: на основе таблицы создана форма с полями:. Способ оплаты: касса. банк. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru