Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2012, 00:36   #1
Y4va
Новичок
Джуниор
 
Регистрация: 22.06.2012
Сообщений: 1
Вопрос DAO, Recordset, текущий элемент

Здравствуйте! Помогите пожалуйста, никак не получается разобраться. На форме есть таблица (три поля idPerson идентификатор, FNPerson текст, LNPerson текст), четыре кнопки и поле с текстом addFN. Первая функция для кнопки «Добавить». Всё добавляет правильно, но запись появляется в таблице только если закрыть форму и открыть её заново. Вторая функция – для кнопки «Удалить». Она удаляет всегда первую запись, хотя должна бы удалять текущую. Видимо, текущая – всегда первая, изменить это вручную у меня не получается. Третья функция – для кнопки «Редактировать». С ней проблема та же, что и с предыдущей, редактируется всегда первая запись. Четвёртая функция - для кнопки «Найти». Здесь у меня основательные проблемы с синтаксисом, видимо.

Private Sub bAdd_Click() 'обновляет только если закрыть и открыть форму
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fid As Field
Dim fidn As Field
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
rs.AddNew
rs.Fields("FNPerson").Value = addFN.Value
rs.Update
End Sub

Private Sub bDel_Click() 'удаляет первую запись
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
rs.Delete
End Sub

Private Sub Edit_Click() 'редактирует первую запись
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
rs.Edit
rs.Fields("FNPerson").Value = addFN.Value
rs.Update
End Sub

Private Sub search_Click() ‘?
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
Dim s As String
s = addFN.Value
rs.FindFirst "[FNPerson] = '" & Me![addFN] & "'"
End Sub
Y4va вне форума Ответить с цитированием
Старый 22.06.2012, 11:53   #2
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

Добрый день.
Может как-то так попробовать:
1. После процедуры закрыть и открыть форму (я думаю что это не на что не повлияет)
2. Как то так:
Код:
Private Sub bDel_Click() 'удаляет первую запись
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
rs.movelast'переход на последнюю строку
rs.Delete
End Sub
3.
Код:
Private Sub Edit_Click() 'редактирует первую запись
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
rs.movelast'переход на последнюю строку
rs.Edit
rs.Fields("FNPerson").Value = addFN.Value
rs.Update
End Sub
4.Попробуйте как-то так (но я не уверен)
Код:
Private Sub search_Click() ‘?
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = Access.CurrentDb
Set rs = db.OpenRecordset("Persons")
Dim s As String
s = addFN.Value
rs.movefirst
do until rs.eof
if rs![FNPerson]='" & Me![addFN] & "'" then
rs.edit
end if
End Sub
gluk_fm вне форума Ответить с цитированием
Старый 22.06.2012, 22:47   #3
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Y4va.
"..не получается разобраться. На форме есть таблица.."
очевидно Вы хотели сказать "есть таблица подключенная к форме в качестве источника данных"
"проблема" в отсутствии связи рекордсета формы и используемого Вами внешнего DAO рекордсета.
думаю на данном этапе проще обращаться не к внешнему а к собственному набору записей формы:

bAdd_Click набор записей (рекордсет) отображаемый формой после добавления (удаления, изменения) в источнике
необходимо обновить, с этим справится команда Requery, но после её выполнения (как и после открытия)
всегда первая запись становится текущей. Для добавления исправить ситуацию может подобная конструкция:
Код:
    Set rs = Me.RecordsetClone
'обновление    
    Me.Requery
'переход к последней записи
    rs.MoveLast
'важная деталь: кликая по форме выбранная запись становится текущей
'при перемещении по рекордсету текущая запись не меняется необходим 
'явный переход в форме
    Me.Bookmark = rs.Bookmark
bDel_Click так-же можно выполнить обращаясь к рекордсету формы
Код:
    Set rs = Me.RecordsetClone
    rs.Delete
Edit_Click смотри bDel_Click, т.е.:
Код:
    Set rs = Me.RecordsetClone
    rs.Edit
    rs.Fields("FNPerson").Value = addFN.Value
    rs.Update
search_Click как понимаете тоже удобнее выполнять в подключенном наборе записей:
Код:
        strCriteria = "[FNPerson] = '" & Me![addFN] & "'"
        Set rs = Me.RecordsetClone
        rs.FindFirst strCriteria
        If Not rs.NoMatch Then Me.Bookmark = rs.Bookmark
        rs.Close
в дополнение ещё пара полезных строк, возвращающих текущее положение курсора после обновления:
Код:
Dim v
    v = rs.Bookmark
    Me.Requery
    Me.Bookmark = v
Успехов Вам.
Евгений.

P.S. для удобочитаемости выкладываемый код заключайте в тэги [соde] ... [/соde].
для этого на панели инструментов расположена кнопка - #

Последний раз редактировалось Teslenko_EA; 22.06.2012 в 22:55.
Teslenko_EA вне форума Ответить с цитированием
Старый 23.06.2012, 15:25   #4
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Y4va, если у таблицы (источника) есть идентификатор записи (ключевое поле kod)
и в конструкции используется подчиненная форма (sf1), код может быть таким:
Код:
Option Compare Database
Option Explicit
Private Sub bAdd_Click()
    editTable 0, Me.addFN & ""
End Sub
Private Sub bDel_Click()
    editTable Nz(Me.sf1!kod, 0), ""
End Sub
Private Sub bUpdate_Click()
Dim s As String
    s = Nz(Me.sf1!kod, 0)
    If Not s = "0" Then editTable s, Me.addFN & ""
End Sub
Sub editTable(sRow$, sText$)
Dim db As DAO.Database, rs As DAO.Recordset, r As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("select * from Persons where kod=" + sRow)
    If Val(sRow) = 0 And Not Len(sText) = 0 Then  'новая запись
        rs.AddNew
        rs![FNPerson] = sText
        sRow = rs("kod")
        rs.Update
        Me.sf1.Form.Requery
        Set r = Me.sf1.Form.Recordset
        r.FindFirst "kod=" + sRow
        Set r = Nothing
    ElseIf Len(sText) = 0 Then 'удаление
        If Not rs.EOF Then rs.Delete: Me.sf1.Requery
    ElseIf Not Len(sText) = 0 Then 'изменение
        If Not rs.EOF Then
            rs.Edit
            rs![FNPerson] = sText
            rs.Update
        End If
        'при обновлении достаточно "перерисовать" форму
        Me.sf1.Form.Refresh
        'или обновить родителя - контрол sf1
        Me.sf1.Requery
    End If
    rs.Close
    Set rs = Nothing: Set db = Nothing
End Sub
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить элемент элемент одномерного массива? Паскаль Женька Good Помощь студентам 5 21.12.2011 00:07
Одномерный массив. Необходимо заменить последний положительный элемент на второй элемент массива кумитэ Паскаль, Turbo Pascal, PascalABC.NET 1 19.12.2011 16:44
DAO php class Abuhamed PHP 8 31.10.2011 23:19
Delphi + Oracle + DAO habias2006 БД в Delphi 4 12.08.2010 16:38
Service и Dao Jakethefish Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 3 13.06.2010 13:59