Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Access VBA

Автор: Arjuna
Дата сообщения: 27.01.2006 20:38
Спасибо Silla!

Просто решил с Access на Delphi мягко перейти ))
Автор: kii
Дата сообщения: 01.02.2006 09:09
Arjuna
Не понятен мне такой переход. Access это Access - для доступа клюбым базам и быстро я использую его, даже отчеты получаю в нем. А Delphi это шикарный инструмент. Икак это "мягко перейти" ?
Автор: vredinka
Дата сообщения: 06.02.2006 20:36
Люди, помощи прошу!
Дано: таблица с именами людей и датами рождения + поле "возраст"(пустое).
Вопрос: как посчитать возраст для ВСЕХ людей в таблице на данный момент.

Нашла прорамму (VB): (Аргументы: Дата рождения и текущая дата; Назначение: Расчитывает разницу

в годах между двумя датами (использовать для расчета возраста); Возвращает: Количество лет Integer)

Function Age(Bdate, DateToday) As Integer
If DateToday < Bdate Then Age = 0:Exit Function
If Month(DateToday) < Month(Bdate) Or (Month(DateToday) = Month(Bdate) And Day(DateToday) <

Day(Bdate)) Then
Age = Year(DateToday) - Year(Bdate) - 1
Else
Age = Year(DateToday) - Year(Bdate)
End If
End Function

Взяла ленточную форму (фамилия, дата рождения, возраст), пихнула в неё поле с сегодняшней датой и

кнопкой. На кнопку навесила эту функцию ([let]=Age([birfday], [today]), но она считает только

активную запись, а не все. Что делать? Если можно - без SQL.
Автор: dneprcomp
Дата сообщения: 06.02.2006 21:31
vredinka
А как функция может знать сколько записей в таблице и какие они? Надо пробежаться по рекордсету и на каждую строку сделать вызов функции.
IF я бы несколько упростил:
If Month(DateToday) <= Month(Bdate) And Day(DateToday) < Day(Bdate)) Then
Автор: MrZeRo
Дата сообщения: 07.02.2006 13:23

Цитата:
На кнопку навесила эту функцию ([let]=Age([birfday], [today]),

Так делать не надо, если нужны все возрасты. Надо добавить вычисляемое поле в запрос, которое бы вычислялось вашей функцией.
Автор: vredinka
Дата сообщения: 07.02.2006 20:57
dneprcomp
А что такое рекордсет?

MrZeRo
В запросе я нашла только как простой вычислитель вызвать (стандартные функции) а вот как в него мою запихать?
Автор: dneprcomp
Дата сообщения: 08.02.2006 05:45
vredinka
Recordset это результат любого SQL запроса. Это набор/set записей/records. Все что отображается в контролах на экране - результат явного или скрытого SQL запроса. Когда применяются команды MoveFirst, MoveNext, MoveLast то движение осуществляется по строкам рекордсета.
Автор: evle
Дата сообщения: 08.02.2006 06:34
vredinka
При работе с базами данных есть правило: если какое-то поле можно посчитать исходя из других полей, в таблице его быть не должно.
В запросах Access можно пользоваться любыми функциями из модулей. Используй построитель выражений.
Автор: MrZeRo
Дата сообщения: 08.02.2006 08:39
vredinka
Вставляй в запрос непосредственно выражение, которое необходимо. Н-р:

Цитата:

SELECT field_1, field_2, Age([birfday], [today]) as field_age, field_3, ...
FROM table_1
ORDER BY field_1
Автор: vredinka
Дата сообщения: 08.02.2006 22:30
Спасибо всем. Всё работает! Упихнула функцию в модуль. Теперь я беру маленькую формочку: два поля (ДАТА, на которую считаем и требуемый ВОЗРАСТ) и кнопка. По клику на кнопку открывается запрос, выводящий фамилии всех людей на ДАТУ, старше указанного ВОЗРАСТА.

Одна проблема: оно выдаёт не только тех, кто старше, но и почему-то тех, кто к заданному времени ещё не родился (с отрицательным возрастом). Функция перед вами (см. ранее). Где ошибка?
Автор: wiwiw
Дата сообщения: 09.02.2006 09:04
DateDiff пробовали?
Автор: UncleYurka
Дата сообщения: 09.02.2006 19:31
Коллеги, помогите чайнику!

Есть поле со списком.
Хотелось бы после выбора значения (Описано какая таблица и список полей и т.д)получить доступ к остальным полям этой же записи таблицы.

Я программировал на Clarion - там все без проблем, а вот жизнь заставила использовать Access - проблемы.

С уважением, Юрий.

Добавлено:
P.S. Желательно обойтись стандартными средствами
Автор: wiwiw
Дата сообщения: 10.02.2006 19:58
UncleYurka
создай этот поле с помощью мастера. там будет опция : "поиск записи в форме на основе значения ..."
или сам обработай событие AfterUpdate
вот что генерирует мастер:

Код:
Private Sub ПолеСоСписком6_AfterUpdate()
' Поиск записи, соответствующей этому элементу управления.
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[Код] = " & Str(Nz(Me![ПолеСоСписком6], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
Автор: vredinka
Дата сообщения: 12.02.2006 08:22
dneprcomp
Твоя версия кода

Цитата:
IF я бы несколько упростил:
If Month(DateToday) <= Month(Bdate) And Day(DateToday) < Day(Bdate)) Then

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

MrZeRo

Цитата:
SELECT field_1, field_2, Age([birfday], [today]) as field_age, field_3, ...
FROM table_1
ORDER BY field_1

Это в SQL-запросе писать? А он поймёт, откуда функцию Age брать? Она же не встроенная. Попробую.

Отрицательные величины я отсекла: вместо
If DateToday < Bdate Then Age = 0:Exit Function
(далее - DateToday=t и Bdate=b соответственно) пишу
If Year(t) < Year(b) Or Year(t) = Year(b) And Month(t) < Month(b) Or Year(t) = Year(b) And (Month(t) =

Month(b) And Day(t) < Day(b)) Then Age = 0: Exit Function

А вот 2 и 3 года он по-прежнему считает больше 15 (видимо, сравнивает первые цифры). Что делать?

Автор: dneprcomp
Дата сообщения: 12.02.2006 08:34
vredinka
Вот это у вас:
If Month(DateToday) < Month(Bdate) Or (Month(DateToday) = Month(Bdate) And Day(DateToday) < Day(Bdate)) Then
А вот это у меня:
If Month(DateToday) <= Month(Bdate) And Day(DateToday) < Day(Bdate)) Then
По моему записи по логике идентичные.Моя просто несколько короче. Так что и результат должны выдавать один.
Автор: wiwiw
Дата сообщения: 12.02.2006 15:20
vredinka
dneprcomp
почему вы упорно не хотите использовать DateDiff и DateAdd?
код из МСДН:

Код:
Function CalcAge(dteBirthdate As Date) As Long

Dim lngAge As Long

' Make sure passed-in value is a date.
If Not IsDate(dteBirthdate) Then
dteBirthdate = Date
End If

' Make sure birthdate is not in the future.
' If it is, use today's date.
If dteBirthdate > Date Then
dteBirthdate = Date
End If

' Calculate the difference in years between today and birthdate.
lngAge = DateDiff("yyyy", dteBirthdate, Date)
' If birthdate has not occurred this year, subtract 1 from age.
If DateSerial(Year(Date), Month(dteBirthdate), Day(dteBirthdate)) > Date Then
lngAge = lngAge - 1
End If
CalcAge = lngAge
End Function


Автор: dneprcomp
Дата сообщения: 12.02.2006 19:48
wiwiw
Да я, собственно, всегда эту функцию использую Вот только разбираться, есть ли она в Access было просто лень
Автор: vredinka
Дата сообщения: 13.02.2006 07:36
dneprcomp
По вашему коду ветка цикла считается только если выполняются ОБА условия (And): и месяц меньше и день. То есть если я считаю на 15 мая, а человек родился 26 мая, то по вашему коду он уйдёт на вторую ветку, где ELSE ему текущий год не вычтет, а по моей версии кода он останется в этой ветке и свою (-1) получит.
Присмотритесь. Может я совсем ничего не понимаю? Просчитайте варианты.

wiwiw
Спасибо. Не использовала потому, что не знала (А разве здесь DateAdd нужен?). Извините, но за основу (естессно) ваш код, с обозначениями:
dteBirthdate=b, Date=t. t- вводится из формы и по умолчанию является текущей датой, но может быть изменена как в меньшую (для проверки беру 1985 год), так и в большую сторону.

Public Function Age(b As Date, t As Date) As Long
Dim lngAge As Long
If t < b Then t = b
lngAge = DateDiff("yyyy", b, t)
If DateSerial(Year(t), Month(b), Day(b)) > t Then
lngAge = lngAge - 1
End If
Age = lngAge
End Function

В таком виде функция работает, но вот назначение этого куска:

If Not IsDate(dteBirthdate) Then
dteBirthdate = Date
End If

мне не понятно, чего ради dteBirthdate = Date? Или в смысле, что если вместо дата рождения (а в моём случае и "искомая" дата) не в "датовском" формате, то присвоить им текущую дату, и тогда функция вместо ошибки выдаст на выходе ноль?

Всё это здорово, но вопрос остаётся открытым: почему при сравнении 66-летняя бабуля оказывается младше 7 лет и не попадает в выборку, а 2-3 годовалые дети попадают в запрос "старше 15"? Кто знает, в чём дело и что делать?
Автор: wiwiw
Дата сообщения: 13.02.2006 13:06

Цитата:
мне не понятно, чего ради dteBirthdate = Date? Или в смысле, что если вместо дата рождения (а в моём случае и "искомая" дата) не в "датовском" формате, то присвоить им текущую дату, и тогда функция вместо ошибки выдаст на выходе ноль?

да.

покажите запрос. возможно нужно использовать подчиненный запрос.
Автор: vredinka
Дата сообщения: 13.02.2006 20:31
wiwiw
Кажется, я нашла ошибку - сменила формат данных поля "Граничный возраст(letmore)" в форме на "Основной" - теперь работает как надо. Но на всякий случай:

SELECT DATI.Фамилия, DATI.Имя, DATI.Отчество, DATI.[Дата рождения], Age(DATI![Дата

рождения],Forms!Формасдатой2!today) AS Возраст, *
FROM DATI
WHERE (((Age([DATI]![Дата

рождения],[Forms]![Формасдатой2]![today]))>=[Forms]![Формасдатой2]![letmore]))
WITH OWNERACCESS OPTION;

Или лучше в запросе использовать функцю Clng? И на поле в форме маску наложить (для пользователей)?

Кстати, вы не знаете, не может ли так быть, что на другом компе (перенесла базу), запрос перестаёт редактироваться? При попытке сохранить изменения выдаёт фразу "запись удалена!". Вернула на родной комп - без разницы. Пришлось запрос удалять и писать заново.
Автор: wiwiw
Дата сообщения: 14.02.2006 00:11
vredinka

Цитата:
Или лучше в запросе использовать функцю Clng? И на поле в форме маску наложить (для пользователей)?

не повредит

Цитата:
Кстати, вы не знаете, не может ли так быть, что на другом компе (перенесла базу), запрос перестаёт редактироваться? При попытке сохранить изменения выдаёт фразу "запись удалена!".

внутренние ошибки access. народсоветует переустановить все что можно, поставить последние апдейты и т.д.
Автор: Muz_Tani
Дата сообщения: 17.02.2006 09:10
Может и не туда попал. Дурацкий вопрос, но я в Access пока чайник.
Дело вот в чём... Есть запрос и есть форма. Надо чтоб из поля со списком данные передавались в поля "условие" запроса... Наверное это легко но я раздуплиться пока не могу. Помогите пожалуйста....
Автор: vredinka
Дата сообщения: 17.02.2006 23:07
Muz_Tani
Я и сама почти "чайник", но попробуй так: ставь курсор в строку условия, нажимай на Построитель выражений, набирай нужное условие (больше, меньше и т.д.), потом выбираешь в левой колонке построителя папочку "Формы, в ней - свою форму. В средней колоночке появятся все доступные объектыэтой формы, из них выбери поле, значечие из которого тебе нужно. И, наконец - правая колонка, двойной клик по строчке <значение>. В поле построителя должно появиться что-то типа:

Код: >=[Forms]![Форма1]![Поле4]
Автор: Linda
Дата сообщения: 18.02.2006 01:29
Access 2002. Создание запроса.

Есть две таблицы с одинаковыми полями. Нужно объединить их по одному текстовому полю. Например:

Таблица1 Таблица2

название название
A D
B A
C C

Результат запроса:
название
A
B
C
D

Inner Join выдет только совпадающие значения, Left и Right Join - соответственно.

Как организовать?

Автор: dneprcomp
Дата сообщения: 18.02.2006 05:36
Linda
SELECT Table1.[Field1] FROM Table1 UNION SELECT Table2.[Field1] from Table2
Автор: EZH
Дата сообщения: 18.02.2006 09:47
dneprcomp

Цитата:
SELECT Table1.[Field1] FROM Table1 UNION SELECT Table2.[Field1] from Table2

Я думаю этого мало будет, т.к. надо исключить повторяющиеся в разных таблицах А С и D, да ещё и отсортировать это всё.

Тут видимо имеет смысл создать VIEW по твоему запросу, и делать выборку из него с DISTINCT и ORDER BY.
Автор: dneprcomp
Дата сообщения: 18.02.2006 11:15
EZH
При тех данных, что привела Linda, результат точно, как запрашиваемый. Union само делает уникальную выборку. UNION ALL покажет и дубликаты. Добавить сортировку будет не сложно. Хотя у меня в Access отсортировало по умолчанию.
Автор: Linda
Дата сообщения: 18.02.2006 16:27
EZH, dneprcomp, спасибки. Ща буду пробовать

Автор: evle
Дата сообщения: 20.02.2006 11:35
Есть таблица с полями Event_ID, Man_ID, Event_date, Order
Задача: сделать View, в котором для каждого Man_ID содержится Event_ID с максимальным Event_date (если несколько записей с одинаковым Event_date, среди них выбрать ту, у которой максимален Order).
Автор: Linda
Дата сообщения: 21.02.2006 02:26
EZH, dneprcomp, все получилось как надо только с помощью UNION. СПАСИБО!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: BDE - траблы, помогите пожалуйста срочно...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.