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

» VBA for Access

Автор: Audciz
Дата сообщения: 20.02.2007 18:44

Цитата:
Где и какой модуль надо подключить?

Всё. Разобрался сам.
Автор: AZzzzz
Дата сообщения: 08.03.2007 02:56
У меня след. вопрос: как написать на vba: если таблица существует, то ее удалить.
Автор: AndVGri
Дата сообщения: 08.03.2007 18:58
AZzzzz
Можно вот так, например:

Public Sub DeleteTable(ByVal DeletedTableName As String)
Dim mdb As DAO.Database
Dim pTables As DAO.TableDefs
Dim pTable As DAO.TableDef

Set mdb = Application.CurrentDb
Set pTables = mdb.TableDefs

For Each pTable In pTables
If pTable.Name = DeletedTableName Then
pTables.Delete pTable.Name
End If
Next pTable
End Sub
Автор: gorthaur
Дата сообщения: 13.03.2007 12:10
Проблема. Имеется таблица, её поля неизвестны. Допустим это Поле1, Поле2, Поле3, но об этом можно узнать только во время выполнения. Нам нужно в форме реализовать ввод данных в таблицу. Т.е. при запуске мы должны получить 3 поля ввода. Если в таблице 4 столбца, то, соответственно, 4 поля ввода и т.д. Помогите, пожалуйста, а то что-то ничего не выходит
Автор: xxyy
Дата сообщения: 13.03.2007 14:57
Есть Форма, в ней есть ПолеСоСписком11. ИсточникСтрок для ПоляСоСписком является таблица “NN1”. Хотелось бы знать код VBA для следующего события: в Форме нажимается Кнопка, для которой установлена процедура обработки ее нажатия. Процедура должна изменить УсловиеОтбора в Запросе ZNN1. Народ подскажите как сделать в программировании не селён.
Автор: altaph
Дата сообщения: 13.03.2007 16:02
xxyy
например

Код:
Dim dbs As Database
Dim Queries As DAO.QueryDefs
Set dbs = CurrentDb
Set Queries = dbs.QueryDefs
Queries("ZNN1").SQL = ПолеСоСписком11.RowSource
Автор: xxyy
Дата сообщения: 14.03.2007 08:40
altaph

спасиб щас попробую, ещё вопрос где можно качнуть книгу по VBA for Access 2003??
Автор: gorthaur
Дата сообщения: 14.03.2007 18:04
Ладно. Хотя бы ответьте на вопрос, почему у меня в Me.Controls.Add вылетает ошибка "Method or data member not found"?
Вырезка из листинга


Код: Private Sub Form_Load()
Dim lbl As Label
Set lbl = Me.Controls.Add("Forms.Label.1", "Lbl")
End Sub
Автор: Dixi257
Дата сообщения: 14.03.2007 19:53
gorthaur

Цитата:
Имеется таблица, её поля неизвестны

А сколько может быть полей максимум? Иногда проще набросать сразу много контролов, потом их показывать и связывать динамически с реальными полями.
Автор: gorthaur
Дата сообщения: 14.03.2007 23:23
В том то и дело, что их количество не ограничено сверху
Автор: AndVGri
Дата сообщения: 15.03.2007 05:15
gorthaur

Access похоже не позволяет добавлять Control в runtime в форму. Так что будь как "волшебник", конструируй форму

Dim pForm As Form
Dim pLabel As Label
Dim pTextBox As TextBox

Set pForm = Application.CreateForm()

Set pTextBox = Application.CreateControl(pForm.Name, acTextBox, , , , 400, 400, 1000, 300)
Set pLabel = Application.CreateControl(pForm.Name, acLabel, , , , 400, 200, 1000, 200)
pLabel.Caption = "MyLabel"
DoCmd.OpenForm pForm.Name, acNormal
Автор: Dixi257
Дата сообщения: 15.03.2007 14:20
gorthaur


Цитата:
В том то и дело, что их количество не ограничено сверху


Кажется мне, что ты задачу усложняешь. Ну не разместишь ты 100 000 полей на экране. и уже при 300-400 полях Форма такая будет создаваться и работать крайне медленно. Нужно упростить условия, ограничить количество полей. Ну если уж очень хочется, используй действительно createcontrol. Только я бы рассматривал такой вариант в последнюю очередь. И при этом все равно ОБЯЗАТЕЛЬНО нужна проверка на количество создаваемых полей, иначе в один прекрасный момент система зависнет нафиг. Не убедил?
Автор: altaph
Дата сообщения: 15.03.2007 19:11
gorthaur

пример кода с createcontrol

Код:
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim I As Integer
Dim Tbl As String

Tbl = "Table1" ' имя искомой таблицы

Set frm = CreateForm()
frm.Caption = "My Form"
frm.RecordSource = Tbl

'ширина, высота и пробел между элементами
Dim W As Integer, H As Integer, G As Integer
W = 700
H = 500
G = 15

Set rst = New ADODB.Recordset
rst.Open Tbl, CurrentProject.Connection

With frm.DefaultControl(acTextBox)
.Width = W
.Height = H
End With

For I = 0 To rst.Fields.Count - 1
Set fld = rst.Fields(I)
With CreateControl( _
FormName:=frm.Name, _
ControlType:=acTextBox, _
Section:=acDetail, _
Left:=10, _
Top:=I * (H + G))

.Name = fld.Name
.ControlSource = fld.Name
End With
Next I

rst.Close
Set fld = Nothing
Set rst = Nothing
Автор: gorthaur
Дата сообщения: 15.03.2007 19:39
Всем ответившим большое спасибо
Автор: dneprcomp
Дата сообщения: 16.03.2007 00:30
gorthaur
Как Dixi257 уже заметил, ты пробуешь решить задачу в лоб, силой. К примеру, такую задачу можно решить, используя только 2 контрола. Лист и техт бокс. В листе отмечаем какое поле редактируется; в техт боксе заносим собственно техт. Естественно, это не удобный дизайн. Можно подумать об использовании грида, о различых комбинациях контролов. Главное, обдумать задачу и найти преемлемое решение.
Автор: gorthaur
Дата сообщения: 19.03.2007 17:08
Надеюсь, я ещё не всем здесь надоел
Вопрос: как разместить в SubForm только что программно созданную форму?

Код:
Dim frm As Form
Set frm = CreateForm
Me!Subform.SourceObject = frm.Name
Автор: AndVGri
Дата сообщения: 19.03.2007 17:41
gorthaur
Уважаемый, Вы опять наступаете на теже "грабли". Формы Access не эквивалентны формам в VBA. В Access нельзя добавлять control в runtime. Subform - control. Поэтому сначала добавьте его
Application.CreateControl "myWorkform", acSubform ...

Цитата:
Me!Subform.SourceObject = frm.Name

А здесь, зачем Вы передаёте строку названия формы, когда требуется объект типа формы?

Может Вам имеет смысл поставить полную справку по Access и внимательнее её просмотреть? В VBA можно получить контекстную справку по свойствам и методам объектов.
Автор: gorthaur
Дата сообщения: 19.03.2007 18:53
AndVGri
Выдержка из справки по Access (SourceObject Property):

Цитата:
Read/write String
...
Enter the name of the form or report that is the source of the subform or subreport...

И т.д.

По поводу добавления контрола. Заколдованный круг получается, однако. Для того, чтобы добавить run-time подформу, мне нужно добавить acSubform, но я не могу сделать этого run-time и т.д.

Ладно, опишу задачу более подробно. Нужно иметь возможность подключиться к произвольной таблице в произвольной базе данных (имя таблицы и путь к файлу базы вводятся во время выполнения) и организовать изменение/добавление/удаление и т.д. данных. Подключение и получение информации я сделал. Мне нужно просто иметь возможность реализовать ввод данных. И вот здесь-то появляется проблема, ибо Access VBA не предоставляет разработчику функцию изменения формы во время выполнения Может у кого есть идеи, как обойти это ограничение?
Автор: AndVGri
Дата сообщения: 19.03.2007 20:22
gorthaur

Цитата:
Read/write String
...
Enter the name of the form or report that is the source of the subform or subreport...

Примите мои извинения, до этого пункта не дочитал.

А по Вашему вопросу, так продолжайте конструирование, как пример:

Dim pMainForm As Form
Dim pSubForm As Form
Dim pSubFormControl As SubForm
Dim FormName As String

'Создаём подформу
Set pSubForm = Application.CreateForm()
'Добавляем элементы и настраиваем подформу
'...
FormName = pSubForm.Name
DoCmd.Save acForm, FormName
DoCmd.Close acForm, FormName, acSaveYes

'Создаём главную форму
Set pMainForm = Application.CreateForm()
'Добавляем элементы и настраиваем главную форму
'....
'собственно, добавляем в главную форму подформу
Set pSubFormControl = Application.CreateControl(pMainForm.Name, acSubform, , , , 100, 100, 1000, 1000)
pSubFormControl.SourceObject = FormName
DoCmd.Save acForm, pMainForm.Name

'Запускаем хозяйство
DoCmd.OpenForm pMainForm.Name
Автор: gorthaur
Дата сообщения: 19.03.2007 23:39
Спасибо, попробую
Автор: filemoto
Дата сообщения: 20.03.2007 13:17
Dixi257
Дружище, выручай...
Помнишь ты както высылал мне пример БД, где при выборе категории, комбобокс подкатегории отображал только записи принадлежащие категории.
Плиз, злобный вирь погрыз комп... всё что мог спас, а твой пример на рабочем столе лежал, а со стола ничего не спас...
попытался скачать со слил.ру, куда ты его помещал, но файл уже недоступен.
Может у тебя осталась копия?
Как ты это делал, можешь вспомнить?
Автор: Dixi257
Дата сообщения: 20.03.2007 21:16
gorthaur

Цитата:
и организовать изменение/добавление/удаление и т.д. данных

Хм... Я конечно опять не в кассу... Но, складывается впечатление, что ты делаешь универсальный просмотрщик/редактор баз данных. Тут бы хорошо использовать какой-будь "Грид"-контрол. Тот же самый мелкомягкий грид можно попробывать, та очень гладко на ходу можно поля добавлять, и редактировать в нем достаточно удобно. Ну и еще куча коммерческих гридов весьма навороченных есть. На счет бесплатных, затрудняюсь...
Автор: gorthaur
Дата сообщения: 21.03.2007 09:20
Dixi257
В том-то и дело, что из бесплатных ничего хорошего не нашел. К тому же гораздо лучше в моём случае пойдёт представление в анкетной форме (т.е. контролы располагаются вертикально). Да, это универсальный просмотрщик/редактор с некоторыми дополнительными свойствами. Проблема только в том, что я до этого Access и Basic вообще в глаза не видел А после C++ как-то не очень идёт.
Автор: Dixi257
Дата сообщения: 21.03.2007 12:15
gorthaur
Так, а задачу обязательно реализовывать в Access, может быть сделать отдельный самодостаточный (зависящий от системных DLL) экзешник? Можно на VB (не путалть с VBA). Чем же и CPP не приглянулся для таких целей? Тем более, что надо то всего строку подключения сформировать для JET драйвера, если речь идет только о базах .MDB
По поводу реализации на VB или CPP пиши на ящик, подскажу что смогу.
Автор: gorthaur
Дата сообщения: 21.03.2007 14:56
Dixi257
Да я бы сам с удовольствием на С++ написал, только меня никто не спрашивал Все равно спасибо за предложение
Автор: filemoto
Дата сообщения: 26.03.2007 11:06
Dixi257
Привет!
Скажи, тебе удалось что-то сделать с той БД?
Автор: filemoto
Дата сообщения: 01.04.2007 17:45
Dixi257
благодарю.

вопрос в студию: кидаю на форму два текстбокса.
как заставить в одном отображать количество записей в определённой таблице, а во втором текстбоксе, количество записей с применением фильтра по одному из полей? например, количество записей в которых поле статус = "Готово"?

Автор: jONES1979
Дата сообщения: 02.04.2007 08:40
Dixi257 это просто
=DCount("code_item";"Tree")
=DCount("code_item";"Tree"; "dir = 0")

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

Автор: filemoto
Дата сообщения: 02.04.2007 11:44
jONES1979
это наверное предназначалось для меня.
спасибо. помогло.

скажите, а как отследить смену записи на форме?
т.е. к примеру форма отображает запись номер один, у меня в пикчербоксе отображается картинка соответствующая номеру записи. потом перехожу на вторую запись, а картинка не изменяется, хотя этой записи соответствует другая картинка. так вот как заставить пикчербокс реагировать на смену записей?
Автор: jONES1979
Дата сообщения: 02.04.2007 21:06
filemoto

Цитата:
как отследить смену записи на форме?
событие формы "Текущая запись" Form_Current()

что значит записи соответсвует? для blob-полей с картинками из БД есть контрол с названием "Присоединённая рамка объекта" представляющая из себя OLE-контейнер.
...если же просто разные картинки, из файлов к примеру, то

Код: Private Sub Form_Current()
if условие then
Me.Рисунок296.Picture ="C:\Picture Files\Logo2.gif"
else
Me.Рисунок296.Picture ="C:\Picture Files\Logo1.gif"
end if
End Sub

Страницы: 1234567891011121314151617

Предыдущая тема: Delphi+ADO


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