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

» Access VBA

Автор: MrZeRo
Дата сообщения: 06.05.2008 12:28
Meysoncup
Есть функция DSum(expr, domain[, criteria])
При помощи Criteria можно определить дополнительные параметры для суммирования.
Автор: Meysoncup
Дата сообщения: 06.05.2008 15:48
ага, спасибо, мож ещё пригодится, а это уже сам сделал чуть по-другому

Добавлено:
Создана форма на основе таблицы. Как вставить в эту форму поле, которое выводило бы некую запись из запроса?
Автор: TohaDub
Дата сообщения: 08.05.2008 15:09
Скажите плиз, есть база в Аксцес 2003, открываею в 2007, в базе есть табличка в ней поле OLE. Вставляю в это поле вордовский документ на две странички, база весит 2 метра, вставляю еще один 4 метра, еще - 16метров, еще 32, и так далее........ УЖАС.
По логике не должно же быть так? В чем трабла? Может открывать в Аксцес 2003???
Автор: dneprcomp
Дата сообщения: 09.05.2008 06:14
TohaDub
Все нормально. Просто база накапливает место прозапас. На самом деле процесс несколько сложнее, но такое объяснение достаточно близко к тому, что происходит. Что такое 16 мб для современных винтов? Ерунда ведь. Если очень раздражает, то идем в меню:
Tools - Database Utilities - Compact and Repair Databese
Автор: TohaDub
Дата сообщения: 09.05.2008 07:09
dneprcomp

Цитата:
Если очень раздражает, то идем в меню:
Tools - Database Utilities - Compact and Repair Databese


Да меня не раздражает, просто база будет работать по сети, и огромный объем может тормазить. хммммм.
При "сжать и востановить" размер уменьшается на 100кб.
Ладно буду пока добавлять, а там поглядим.
Автор: aa2ndrew
Дата сообщения: 11.05.2008 11:52
Не могу вывести данные из VBA в таблицу базы даных. код следующий

Код:
Set dbs = OpenDatabase(Putfile)
With dbs
Set rst = .OpenRecordset("rez1")
For x = 1 To 298 Step 2
For y = 1 To 300 Step 2
rst.Fields(0).Value = 1
If x / 2 < 75 Then
rst.Fields(1).Value = (x1 * 135900.000031766 + x) / 135900.000031766
rst.Fields(2).Value = (y1 * 135900.000031766 + y) / 135900.000031766
rst.Fields(3).Value = c(75 - (x + 1) / 2, (y + 1) / 2)
ElseIf x / 2 >= 75 Then
rst.Fields(1).Value = (x1 * 135900.000031766 + x) / 135900.000031766
rst.Fields(2).Value = (y1 * 135900.000031766 + y) / 135900.000031766
rst.Fields(3).Value = c((x + 1) / 2 - 74, (y + 1) / 2)
End If
rst.MoveNext
Next
Next
.Close
End With


Выдает ошибку:
"Run-time error "3020"
Update или CancelUpdate без AddNew или Edit"

Скажите что здесь не правильно (если хоть чтото правильно)
Автор: dneprcomp
Дата сообщения: 11.05.2008 19:11
aa2ndrew

Цитата:
Update или CancelUpdate без AddNew или Edit"

Так тебе же база уже почти человеческим голосом ответила

Код:
Set dbs = OpenDatabase(Putfile)
With dbs
Set rst = .OpenRecordset("rez1")
Do While Not rst.EOF
'Если добавляется новый рекорд, то:
rst.AddNew
'Если редактируем существующий, то:
rst.Edit 'или AddNew, или Edit. Не обе команды одновременно!!!

For x = 1 To 298 Step 2
For y = 1 To 300 Step 2
rst.Fields(0).Value = 1
If x / 2 < 75 Then
rst.Fields(1).Value = (x1 * 135900.000031766 + x) / 135900.000031766
rst.Fields(2).Value = (y1 * 135900.000031766 + y) / 135900.000031766
rst.Fields(3).Value = c(75 - (x + 1) / 2, (y + 1) / 2)
ElseIf x / 2 >= 75 Then
rst.Fields(1).Value = (x1 * 135900.000031766 + x) / 135900.000031766
rst.Fields(2).Value = (y1 * 135900.000031766 + y) / 135900.000031766
rst.Fields(3).Value = c((x + 1) / 2 - 74, (y + 1) / 2)
End If
rst.Update
rst.MoveNext
Next
Next
Loop
.Close
End With
Автор: aa2ndrew
Дата сообщения: 11.05.2008 19:17
Большое спасибо, dneprcomp.
Просто для таких целей VBA еще не использовал, не знаю возможностей и синтаксиса.
Автор: wakeua
Дата сообщения: 15.05.2008 10:53
Access 2003.
Задача: по нажатию кнопки открыть файл Excel с заданным именем.

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

К сожалению я не знаком с VBA.
Заранее спасибо.
Автор: Vitus_Bering
Дата сообщения: 15.05.2008 11:25
wakeua
Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE c:\1.xls", vbMaximizedFocus
Автор: wakeua
Дата сообщения: 15.05.2008 14:28
Спасибо, работает.
А нет ли какого-то другого способа открытия файла? Смущает необходимость указания полного пути к программе и открываемому файлу. Я так понимаю тут это работает по принципу «Открываем эту программу, а в ней открываем тот файл». Нельзя ли сделать «Этот файл открываем в ассоциативной ему программе»? Таким принципом эксель открывает ссылки на файлы. Т.е. если я перенесу базу данных в другое место, то прийдется править все коды к таким кнопкам.
У меня файл базы идет в связке с папками документов. Путь приходится указывать полностью. Хотя документы находятся в коренной папке базы.
Хорошо бы указывать путь «декабрь 2007\Коммерческое предложение N.xls» вместо «D:\Database\Коммерческие предложения\декабрь 2007\Коммерческое предложение N.xls».
Существует ли такой способ?
Автор: Vitus_Bering
Дата сообщения: 15.05.2008 16:00
wakeua

Код: Sub st()
Shell "EXCEL.EXE " & CurrentPath & "1.xls", vbMaximizedFocus
End Sub

Function CurrentPath() As String
Dim dbs As Database
Dim strng, path As String
Dim position As Integer

Set dbs = CurrentDb
path = dbs.Name
Do Until (InStr(path, "\") = 0)
position = InStr(path, "\")
strng = strng + Left(path, position)
path = Right(path, Len(path) - position)
Loop
Set dbs = Nothing
CurrentPath = strng
End Function
Автор: gloony1
Дата сообщения: 15.05.2008 23:53
Нужна помощь по Access....сделать две таблицы одна с римскими другая с арбскими числами...сделать запрос который отфилтрует определенные арабские числа и эквивалентные им римские и в конце репорт с ними.....может есть уже ченть похожее готовое?
Автор: Meysoncup
Дата сообщения: 16.05.2008 09:27
В форме есть кнопка, которая открывает выполнение запроса. Как сделать, чтоб запрос открывался не в новом окне, а в окне формы? например, в области данных формы?

и ещё: как сделать, чтобы по нажатию кнопки менялся источник записей формы(табличной)

Например с
Select [Таблица].Поле
на
Select[Таблица2].Поле
Автор: MrZeRo
Дата сообщения: 16.05.2008 09:56
Meysoncup
Изменение запроса формы:

Me.RecordSource = "Select[Таблица2].Поле"
Автор: Meysoncup
Дата сообщения: 16.05.2008 10:55
[img] [/img]

Чё то я не догоняю. как сделать, чтоб при нажатии кнопки "сменить источник" менялся источник строк (с подчинённой формы podc на другую)

а вообще надо сделать вот что: при вводе числа в "поле6" и нажатии кнопки "выполнить запрос" повляется запрос в новом окне(можно и запрос на создание таблицы сделать, если это поможет), а надо чтоб он появился в окне, где сейчас podc (подчинённая форма). Как это сделать? или вообще подчинённую форму не использовать?

а вообще, надо сделать аналог этого: хотя бы путь, по которому нужно идти подскажите
[img] [/img]
форма с возможностью(окном) просмотра таблицы бд с выборкой по дате ("с" "по"), кассе, смене, странице, таб №, цеху, с возможностью подсчёта суммы(открывается отчёт). Вся выборка реализуется на галочках или выключателях.
Автор: MrZeRo
Дата сообщения: 16.05.2008 16:29
Meysoncup
Ну тогда
Me.[имя_подчиненной_формы].RecordSource = "Select[Таблица2].Поле"
Автор: Meysoncup
Дата сообщения: 16.05.2008 17:54
[img] [/img]

MrZeRo
Спасибо

Я сделал так: (на примере таб№) в форме(на рисунке) вводится таб №, нажимается кнопка, запускается запрос на создание таблицы(выборка, соотв-но по только что введённому таб№), создаётся таблица и на основе этой таблицы создаётся табличная подчинённая форма, которая уже вставляется в эту, главную форму. То же самое с отбором по дате - создаётся новая уникальная таблица с отбором по дате и т.д.

Но вот какой вопрос - получается выборка либо по таб№, либо по дате. А как сделать выборку или по № или по дате или и по № и по дате?
Автор: MrZeRo
Дата сообщения: 17.05.2008 11:31
Meysoncup
Непонятно, в чем проблема. Если есть возможность менять текст запроса, можно формировать этот текст как надо, с любыми условиями отбора.
Если надо, чтобы подчиненная форма зависела от комбинации двух полей, можно указывать их то ли через запятую, то ли через точку с запятой, надо уточнить.
Автор: Meysoncup
Дата сообщения: 17.05.2008 13:23
Проблема вот в чём: как можно прочитать выше, запросы основаны на создании уникальных таблиц - т.е. при выборке по таб № создаётся таблица "по таб№", при выборке по дате создаётся таблица "по дате" и т.д., потом таблица превращается в подчин-ю форму, которая уже отображается в основной форме(всё это конечно сделано автоматически). Но при таком раскладе пользователь может делать отбор или по одному или по другому параметру.

если же сделать, чтобы запрос был и по тому и по другому - т.е. вначале выполнялся отбор по таб№ с созданием таблицы, а потом(если пользователь захочет) запрос на изменение этой таблицы(отбор по дате), то исчезнет возможность отбора в произвольном порядке (сначала например по дате, а потом по таб№), т.к. в запросе по дате будет написано изменение созданной таблицы, но если перед эти невыполнить отбор по таб№, то таблица не будет создана и изменять будет нечего. Это можно осуществить только при одном условии: что пользователь будет делать выборку либо только по таб№, либо если нужны дополнительные параметры выборки(по дате, по цеху и т.д.), то выборка по этим параметрам будет проходить только ПОСЛЕ выборки по таб№.
Обход этого ограничения - это написание кода на кнопку выборки, который проверял бы, создана уже таблица или нет. Если создана - то изменял бы её в соотв-ии с заданными параметрами, если не создана, то создавал бы её в соотв-ии с заданными параметрами. Как написать код который определяет существует таблица или нет?

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

2 вопроса:
1)Как написать код который определяет существует таблица или нет?

2)как написать, что если значение в поле формы(для запроса) не введено(пустое), то не учитывать его(или подставлять все значения)
пример:

Форма1!Поле1(таб№):введён
Форма1!Поле2(№кассы):не введён

Запрос:
SELECT [База Буфет].[Номер кассы], [База Буфет].[Табельный номер]
FROM [База Буфет]
WHERE ((([База Буфет].[Табельный номер])=[Forms]![Форма1]![Поле1])) AND ((([База Буфет].[Номер кассы])=[Forms]![Форма1]![Поле2])) ;

Что красным - не учитывается если поле2 пусто (или берутся все без исключения значения этого поля)
Что-то типа IF [Поле2]=empty then [Поле2]=all или IF [Поле2]=null then [Поле2]=all
Как это верно написать?
Автор: Meysoncup
Дата сообщения: 18.05.2008 09:58
Всё, почти сделал. Реализовал на Like "*" & [Forms]![Форма1]![Таб№] - если пустое значение - не учитывает(выбирает все), если что-то введено, то учитывает.

Один вопрос - как реализовать это с датой? Точнее с конструкцией Between?
В условие отбора запроса ввожу:


Код: Like (([База].[Дата]) Between [Forms]![Форма1]![Поле24] And [Forms]![Форма1]![Поле29]) & "*"
Автор: MrZeRo
Дата сообщения: 19.05.2008 09:36
Meysoncup
При работе с датами иногда помогает функция преобразования строки в дату: CDate()
Автор: SLACR
Дата сообщения: 29.05.2008 18:02
Всем привет!

Нужна помощь с работой по Access.

Существует 5 разных таблиц, одна из них главная, есть две, которые имеют
в "подчинении" по одной таблице.

Задача (как я это вижу):

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

Идея в проект заложена такая:
-маленький компьютерный магазин
-во время покупки заполнить следущие данные:

Имя
Фамилия
Номера телефонов
Адрес (причем города это комбобокс, а остальной адрес - текст)
Тип купленной запчасти (комбо)
Полное описание/название и параметры купленной запчасти - текст
Время покупки (Now())

Проблема, как я уже писал, возникла с заполнение всех полей как одной записи.
Очень нужно. Подскажите пожалуйста.

(добавленно)
отношения между таблицами:
Автор: dneprcomp
Дата сообщения: 29.05.2008 23:36
SLACR

Цитата:
Проблема, как я уже писал, возникла с заполнение всех полей как одной записи.

Так ведь это не проблема. Это твоя задача. А вот в чем имено проблема?
В целом, такое сделать можно. Причем существует несколько разных путей. Простейшийб, на мой взгляд, это работать напрямую с SQL в коде. На событие кнопки последовательно добавляешь в / редактируешь тейблы. Главное, не забывать об очередности добавок в таблицы. Сначала добавляем в главную. Затем в связаную. А то Referential integrity не даст добавить. Не забываем так же о проверках на существующие записи перед внесение записи.
Автор: SLACR
Дата сообщения: 30.05.2008 11:32
dneprcomp
Во-первых - спасибо, что откликнулся.

Меня поджимают сроки сдачи проекта, поэтому решил немного изменить свою
работу:


и разделить процесс ЗАПОЛНЕНИЯ и ПРОСМОТРА в целях упрощения работы
(моей, а не воображаемого пользователя, хехе)

(добавленно)
Создаю форму NEW_PURCHASE.
Путаница с Validation Rule устранена так: Is Not Null And Like "*[a-z]*"
(при вЫкл. флагах Обязательно к заполнению и Ненулевые строки)

Теперь ломаю голову, как совместить это с соответствующей МАСКОЙ ВВОДА:
нужно, чтобы при вводе было разрешено вводить ПРОИЗВОЛЬНОЕ (в рамках
типа данных) кол-во БУКВ (с бувками разобрался), и при этом первая буква
должна становиться или быть большой.
С маской >L<??? можно ввести не более 4х букв (в комбинации с Validation Rule).
Как сделать >L<произвольное кол-во букв ?
Автор: dneprcomp
Дата сообщения: 30.05.2008 20:08
SLACR
Базы сейчас под рукой нет посмотреть. Но что бы сделать по быстрому и что бы работало можно на потерю фокуса контрола(или на любой другой устраивающий евент) делать control.text=ucase(left(control.text,1)) & mid(control.text,2). Теперь можно обойтись без маски. Ну, может быть дополнительно проверит что первая буква L
Автор: SLACR
Дата сообщения: 30.05.2008 21:20
dneprcomp
Извини за "ламерский" вопрос: а где это прописать? Надеюсь - в таблице?
Вроде в свойствах поля, в таблице нет подходящих пунктов:
Автор: dneprcomp
Дата сообщения: 31.05.2008 01:00
SLACR

Цитата:
а где это прописать?


Цитата:
на потерю фокуса контрола(или на любой другой устраивающий евент)

Автор: GunRose
Дата сообщения: 31.05.2008 18:10
Здравствуйте.
Суть вопроса: мне нужно сделать динамический запрос с несколькими критериями. То есть есть несколько полей, в которых меняются данные (в моем случае пока это 2 поля, одно "тяговый класс", где выбирается тяговый класс машины, второе - диапазон мощности от такого-то до такого-то значения. Мне нужно, чтобы при нажатии на одну кнопку в подчиненной форме появлялся результат запроса. Все как бы работает... но подчиненная форма не обновляется! то есть SQL запрос обновляется, исполняется, а форма не обновляется! что делать? текст SQL-запроса такой:


Цитата:
Private Sub &#202;&#237;&#238;&#239;&#234;&#224;10_Click()
Dim Query As String 'ConstructQuery
Dim PClass, PFrom, PTo As String
Dim SubQ() As String
Dim dbsCurrent As Database
Dim qryTest As QueryDef

Set dbsCurrent = CurrentDb
Set qryTest = dbsCurrent.QueryDefs("DynamicQuery")
ReDim SubQ(0)

Query = "SELECT &#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;.[&#204;&#224;&#240;&#234;&#224; &#242;&#240;&#224;&#234;&#242;&#238;&#240;&#224;], &#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;.[&#210;&#255;&#227;&#238;&#226;&#251;&#233; &#234;&#235;&#224;&#241;&#241;], &#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;.[&#204;&#238;&#249;&#237;&#238;&#241;&#242;&#252;, &#234;&#194;&#242;] FROM [&#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;] WHERE "

' &#234;&#224;&#234; &#225;&#251; &#241;&#228;&#229;&#235;&#224;&#242;&#252; &#242;&#224;&#234;, &#247;&#242;&#238;&#225;&#251; &#236;&#238;&#230;&#237;&#238; &#225;&#251;&#235;&#238; &#247;&#232;&#242;&#224;&#242;&#252; &#242;&#229;&#234;&#241;&#242; &#232;&#231; &#237;&#229;&#241;&#244;&#238;&#234;&#243;&#241;&#240;&#238;&#226;&#224;&#237;&#237;&#238;&#227;&#238; &#234;&#238;&#237;&#242;&#240;&#238;&#235;&#224;?
&#207;&#238;&#235;&#229;&#209;&#238;&#209;&#239;&#232;&#241;&#234;&#238;&#236;2.SetFocus
PClass = &#207;&#238;&#235;&#229;&#209;&#238;&#209;&#239;&#232;&#241;&#234;&#238;&#236;2.Text

If PClass <> "" Then
ReDim Preserve SubQ(UBound(SubQ) + 1)
SubQ(UBound(SubQ) - 1) = "[&#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;].[&#210;&#255;&#227;&#238;&#226;&#251;&#233; &#234;&#235;&#224;&#241;&#241;]=" + PClass
End If

&#207;&#238;&#235;&#229;6.SetFocus
PFrom = &#207;&#238;&#235;&#229;6.Text

If PFrom <> "" Then
ReDim Preserve SubQ(UBound(SubQ) + 1)
SubQ(UBound(SubQ) - 1) = "[&#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;].[&#204;&#238;&#249;&#237;&#238;&#241;&#242;&#252;, &#234;&#194;&#242;]>" + PFrom
End If

&#207;&#238;&#235;&#229;8.SetFocus
PTo = &#207;&#238;&#235;&#229;8.Text

If PTo <> "" Then
ReDim Preserve SubQ(UBound(SubQ) + 1)
SubQ(UBound(SubQ) - 1) = "[&#195;&#243;&#241;&#229;&#237;&#232;&#246;&#251;].[&#204;&#238;&#249;&#237;&#238;&#241;&#242;&#252;, &#234;&#194;&#242;]<" + PTo
End If

For i = 0 To UBound(SubQ) - 1
Query = Query + SubQ(i) + " AND "
Next

'&#238;&#242;&#240;&#229;&#230;&#229;&#236; &#235;&#232;&#248;&#237;&#232;&#233; AND
Query = Mid$(Query, 1, Len(Query) - 5)

'MsgBox (Query)

qryTest.SQL = Query

&#194;&#237;&#229;&#228;&#240;&#229;&#237;&#237;&#251;&#233;4.Requery
End Sub


Извиняюсь за корявые русские названия, сейчас не могу исправить. Но если нужно будет я исправлю.
Автор: dneprcomp
Дата сообщения: 31.05.2008 18:47
GunRose
Как данные попадают в форму и в каких контролах на форме отображаются? Попробуй добавить в конце sub
Код: имя формы.Refresh

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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