Vvmebel.com

Новости с мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba access переход к записи

Vba access переход к записи

Хирург-длятехкт

Профиль
Группа: Участник
Сообщений: 712
Регистрация: 8.11.2005
Где: Н.Новгород

Репутация: нет
Всего: 43

Есть форма «Заявки». Есть таблица с ключевым полем «Код» типа счётчик. Есть на форме «Поле95». Я хочу ввести в это поле нужный код и по нажатию Enter перейти к записи с данным кодом. Номер записи и код строки не совпадают.
Пытался сделать так:

Private Sub Поле95_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
Dim db As DAO.Database
Dim dbRst As DAO.Recordset
Set db = CurrentDb
Set dbRst = db.OpenRecordset(«SELECT Заявки.* FROM Заявки WHERE Заявки.Код=» & Form_Заявки.Поле95.Value, dbOpenDynaset)
dbRst.Move (0)

Set dbRst = Nothing
Set db = Nothing
End If
End Sub

Но по Enter ругается на ошибку синтаксиса (пропущен оператор) в выражении запроса ‘Заявки.Код=’

Это сообщение отредактировал(а) localhost — 25.3.2011, 09:00

Советчик

Профиль
Группа: Модератор
Сообщений: 20437
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 24
Всего: 449

О(б)суждение моих действий — в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция — Администрация форума.

Хирург-длятехкт

Профиль
Группа: Участник
Сообщений: 712
Регистрация: 8.11.2005
Где: Н.Новгород

Репутация: нет
Всего: 43

Статус: Жив

Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 13
Всего: 23

Присоединённый файл ( Кол-во скачиваний: 3 )
___________Microsoft_Office_Access__2_.zip 20,09 Kb

Хирург-длятехкт

Профиль
Группа: Участник
Сообщений: 712
Регистрация: 8.11.2005
Где: Н.Новгород

Репутация: нет
Всего: 43

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль «Помогите!» таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в «Книге отзывов о работе администрации»
  • А вот тут лежит FAQ нашего подраздела

Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

[ Время генерации скрипта: 0.1217 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Макрокоманда «НаЗапись»

С помощью макрокоманды НаЗапись можно сделать указанную записьтекущая запись в открытой таблице, форме или результирующий набор запроса в классической базе данных Access или веб-приложении Access.

Настройка

В классических базах данных Access макрокоманда НаЗапись имеет указанные ниже аргументы.

Тип объекта, содержащего запись, которую нужно сделать текущей. Выберите элемент Таблица, Запрос, Форма, Представление, Хранимая процедура или Функция в поле Тип объекта. Чтобы выбрать активный объект, оставьте этот аргумент пустым.

Имя объекта, содержащего запись, которую нужно сделать текущей. В поле Имя объекта указаны все объекты текущей базы данных с типом, определяемым аргументом Тип объекта. Если аргумент Тип объекта оставлен пустым, этот аргумент тоже должен быть пустым.

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

Целое число или выражение, результатом которого является целое число. Перед выражением необходимо указывать знак равенства (=). Этот аргумент указывает запись, которую нужно сделать текущей. Аргумент Смещение можно использовать двумя способами.

Если для аргумента Запись задано значение Следующая или Предыдущая, Access перемещается на несколько записей вперед или назад. Количество этих записей определяется аргументом Смещение.

Если для аргумента Запись задано значение Конкретная, Access перемещается к записи с номером, который совпадает со значением аргумента Смещение. Номер записи отображается в поле номера записи внизу окна.

Примечание: Если для аргумента Запись используется значение Первая, Последняя или Новая, Access пропускает аргумент Смещение. Если для аргумента Смещение введено слишком большое значение, Access отображает сообщение об ошибке. Для аргумента Смещение нельзя вводить отрицательные значения.

В веб-приложениях Access макрокоманда НаЗапись имеет только один аргумент.

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

Примечания

Если фокус находится в конкретном элементе управления записи, эта макрокоманда оставляет его в том же элементе управления для новой записи.

Читать еще:  Формат презентации powerpoint 2020

Используя значение Новая для аргумента Запись, можно переместиться в пустую запись в конце формы или таблицы, чтобы ввести новые данные.

В классических базах данных Access эта макрокоманда аналогична нажатию стрелки под кнопкой Найти на вкладке Главная и выбору команды Перейти. Подкоманды Первая запись, Последняя запись, Следующая запись, Предыдущая запись и Создать команды Перейти оказывают на выбранный объект то же действие, что и значения Первая, Последняя, Следующая, Предыдущая и Новая аргумента Запись. Для перемещения к записям можно также использовать кнопки навигации, расположенные внизу окна.

В классических базах данных Access с помощью макрокоманды НаЗапись можно сделать текущей запись в скрытой форме, если указать скрытую форму в аргументах Тип объекта и Имя объекта.

Чтобы выполнить макрокоманду НаЗапись в модуле Visual Basic для приложений (VBA), используйте метод НаЗапись объекта DoCmd.

Vba access переход к записи

Dim rstCurr As DAO.Recordset
Dim dbsCurr As Database

Set dbsCurr = Access.CurrentDb
Set rstCurr = dbsCurr.OpenRecordset(«Имя таблицы», dbOpenDynaset)

rstCurr.AddNew
rstCurr.Fields(«Имя поля«).Value = Time$
rstCurr.Update

Me!Поле1.SetFocus
rstCurr.Fields(«Имя поля«).Value = Me!Поле1.Text

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Несколько не понимаю, что имеется ввиду под словом «окно» и про подчинённость.
Если нужно одновременное открытие какого-то количества форм, то можно сделать так:

Private Sub Form_Open(Cancel As Integer) ‘ Обработчик открытия одной из форм
DoCmd.OpenForm («Форма2«)
DoCmd.OpenForm («Форма3«)
End Sub

А чем не подходит то, что я предложил выше?

А вобщем, нельзя ли конкретнее: что есть и что хотелось бы получить.

А значения куда вводятся. в таблицу, в Едит или ещё куда-нибудь

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Объяви глобальную переменную и её будет видно во всех модулях проекта:
Public B As DAO.Recordset

Если у тебя просто строка, то объяви переменную

—— Модуль 1 ———
public B as string дальше
b = Значение на выходе запроса (строка)

т.е. у тебя значение из запроса попадёт куда нужно.

З.Ы. Если мы опять друг-друга не поняли, то приведи пример куска программы где тебе нужно это сделать.

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Как закопировать таблицу из одной БД в другую ?
Как закопировать наново и как добавить к уже существующей таблице?
я так понял что работа с таблицами полностью реализовано в АДО ?

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ‘ В ADO так делается
‘ ========================================
‘ в модуле
Public cn As New ADODB.Connection
Public cm As New ADODB.Command
Public rs As New ADODB.Recordset

‘ в модуле
sub MakeConnect()
cn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & App.Path & _
«База.mdb;Mode=ReadWrite;Persist Security Info=False»

Set cm.ActiveConnection = cn

Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
end sub

‘ ========================================
‘ в модуле формы

‘ обновление записи
Private Sub btnUpdate_Click()
rs!Поле_1 = Me.Text1.Text
rs!Поле_2 = Me.Text2.Text
rs!Поле_3 = Me.Text3.Text

rs.Update
End Sub

‘ добавление записи
Private Sub btnNew_Click()

On Error Resume Next

cm.Execute
rs.Requery
rs.MoveLast

‘ удаление записи по условию
Private Sub btnDel_Click()
On Error Resume Next
Dim m_CurRec As Long

Dim Response As Integer
Dim Msg As String, Title As String

Msg = «Вы действительно хотите удалить текущую запись ?»
Title = «Внимание»
Response = MsgBox(Msg, vbYesNo + vbCritical + vbDefaultButton2, _
Title)
If Response <> vbYes Then
Exit Sub
End If

m_Bookmark = rs.Bookmark
cm.CommandText = «delete from Таблица_1 where Поле_3='» & me.Text3.Text & «‘
cm.Execute

‘ загрузка обновленного рекордсета
Call LoadDataFromDB

‘ возврат к нужной записи
If m_CurRec >= rs.RecordCount Then
rs.MoveLast
Else
rs.Bookmark = m_Bookmark
End If
End Sub

‘ удаление всех записей
Private Sub btnDelAll_Click()
On Error Resume Next
Dim Response As Integer
Dim Msg As String, Title As String
Msg = «Вы действительно хотите удалить все записи »
Title = «Внимание»
Msg = Msg & » из базы ?»

cm.CommandText = «delete from Таблица_1»

Response = MsgBox(Msg, vbYesNo + vbCritical + vbDefaultButton2, _
Title)
If Response <> vbYes Then ‘ User chose Yes.
Exit Sub
End If

Читать еще:  Select distinct access

Call LoadDataFromDB
End Sub

‘ заргрузка данных в рекордсет и датагрид
Private Sub LoadDataFromDB()
Dim sCmd As String

On Error Resume Next

sCmd = «SELECT Поле_1,Поле_2,Поле_3 from Таблица_1»

If rs.State = adStateOpen Then
rs.Close
End If

Set DataGrig1.DataSource = rs

Добавлено
‘ открытие множества форм frmMyForm

Выполнение SQL запросов к текущей базе данных в среде VBA (Access)

В Microsoft Office Access поддерживается выполнение SQL запросов к текущей базе данных из программного кода на VBA. Рассмотрим, как это можно использовать при разработке приложений баз данных.

Так как запрос выполняется к той же самой базе данный в которой выполняется модуль VBA, для выполнения SQL запроса нет необходимости работать со стандартными в подобных случаях интерфейсами ADO, ODBC и т.д. Всё можно сделать при помощи объектной модели Access.

Как известно SQL запросы можно условно разделить на две большие группы:

  • Запросы, не возвращающие данных (INSERT, UPDATE, DELETE и т.д.);
  • Запросы возвращающие данные (запросы на выборку (SELECT)).
Запросы, не возвращающие данных

Для выполнения запросов к текущей базе данных служит метод Execute объекта CurrentDb. Этот метод принимает в качестве параметра строку с SQL запросом, который необходимо выполнить.

Это простейший запрос. Но, как быть с запросами, которые манипулируют теми или иными данными?

Такие запросы тоже можно выполнить. Для этого нужно просто сформировать соответствующую строку.

Так, например, может быть реализовано добавление записей в таблицу:

А, так их обновление:

Выполнение другие типов запросов не возвращающих данных осуществляется по аналогичным принципам.

Запросы на выборку

Метод Execute объекта CurrentDb не поддерживает выполнение запросов на выборку. Поэтому для них нужен другой подход.

Чтобы работать с выборкой данных необходимо воспользоваться объектом RecordSet, который можно создать при помощи метода OpenRecordSet объекта CurrentDb. Этот метод также принимает в качестве параметра строку с SQL запросом.

После создания RecordSet мы можем перебрать все записи, как это показано ниже.

Помимо простого перебора доступны несколько видов поиска. Но в основном используются два.

Первый вид поиска реализован в виде методов FindFirst, FindLast, FindNext и FindPrevious объекта RecordSet.

Первые два устанавливают курсор на соответственно первую и последнюю записи, соответствующие условию поиска. Условие поиска передаётся в качестве параметра в виде строки. Само условие задаётся по аналогии с предложением WHERE в обычном SQL запросе.

Методы FindNext и FindPrevious устанавливают курсор на следующую и предыдущую записи в соответствии с условием поиска, если такие записи существуют. Условие поиска для этих методов задаётся также, как и для FindFirst и FindLast.

Обратите внимание, что эти четыре метода именно устанавливают указатель на нужную запись, а не производят фильтрацию выборки. Таким образом количество записей выбранных SQL запросом остаётся неизменным.

В следующем примере перебор записей начнётся с записи, у которой id равен 234, так как курсор был перемещён к ней до начала обхода набора записей в цикле.

Access VBA Navigate to a record based on a combobox

Imagine a table(tblEmployee) set up as follows:

  1. EmpID(PrimaryKey)
  2. EmpName(ShortText)
  3. EmpNo(ShortText)
  4. EmpPhoto(Attachment)

On a form I want to be able to select Employee’s Name from a Combobox(EmpName) so that the other controls update and show me the Number and Photo of the selected employee.

I Have made a form(frmEmployee) and selected the the Record Source as:

and added all the fields to the form through «Add existing fields» tab. I then changed the textbox(EmpName) to a combobox with two columns, first of which has a width of zero, and changed the Row Source to :

So the user can see and choose any employee’s name without having to deal with primary keys(EmpID). Also The afterUpdate event of the combobox(EmpName) is like this:

This gets me the functionality I want but Also Whenever I choose another Employee Name from the combobox the current Employee’s Name is Updated to the ID(EmpID) of the newly selected Employee.

Читать еще:  Как поставить фон на презентацию powerpoint

How to fix this? Also is there any other faster better way to do this?

2 ответа

Just use an unbound combo box.

To make your current combo box unbound, just remove the Control Source property.

Since you built the form by adding existing fields and then changed the EmpName to a ComboBox, the ComboBox is still bound to the employee’s name in the database!!

What I mean by that is that if you have John Smith’s record displayed and you select «Peter Griffin» in the combo box, you just changed John’s name to «Peter Griffin». The functionality you’re after is built nicely into Access already. Here’s the «standard» way of doing it.

1) Create a form (this will be a subform in a second). Call it frmEmployeeDetail . Specify the Record Source as tblEmployee and add all the employee fields to it just like you did before.

2) Now create an unbound form (a form that has nothing for the Record Source ). Add your ComboBox to it. Set the Row Source to show names just like you did before, but leave the Control Source blank! You don’t want this ComboBox changing any underlying data. You just want it to sit there and look pretty for now. Make sure you set Bound Column to 1. That way the «value» of the ComboBox is the EmpID of whatever name you select. Name the ComboBox cmbEmpID .

3) On the unbound form you just created, add a subform (This will be the form you created in step 1). For Source Object put frmEmployeeDetail . For Link Master Fields put cmbEmpID . For Link Child Fields put EmpID .

Now whenever you select a name on the ComboBox, it sets the value of cmbEmpID to whatever Employee ID you just selected. Since you linked that to the subform, the subform will show whatever data matches the ComboBox (because that’s what subforms do. )

As far as formatting, you can remove the borders, etc. from the subform and easily blend it right into the «Master» form so that it just looks like one nice form. Best part: All built-in. No code.

Создан 16 окт. 17 2017-10-16 06:49:26 xpofer

I like this approach as well, but since i leads to have more objects I will go with Erik’s suggestion. Anyway in your experience, which approach is database manageability wise, better in the long run, to write less code or have less objects? – Soheyl Rahnama 16 окт. 17 2017-10-16 07:18:59

Either way. A large table like an employee table, I like your original approach (with Erik’s suggestion to unbind the combo box). With smaller «category» type tables (like «Employee Departments», «Job TItles», etc.—Tables that only have less than 30 or so entries and are fairly static), I like to use my way. I use a list box instead of a combo box so I can see all the entries and select the one that I want to set a definition for. I like this approach for those sorts of tables mostly because those «category» type tables are generally used to populate drop-down menus elsewhere – xpofer 16 окт. 17 2017-10-16 07:25:47

. in your GUI. So being able to see those options in a list box where I can see all the options, adjust the list order, etc on the «Master» form but set the individual behavior attributes of each option on subform side, I find very useful. You’re right though. On a big not-so-static table where you are looking up data, your approach is really simpler. And now you understand why it wasn’t working, so it’s all preference from here. – xpofer 16 окт. 17 2017-10-16 07:29:15

Ссылка на основную публикацию
Adblock
detector
×
×