|
|
|
| If Me.[поле1] = "изменено" And [поле2] = -1 Then
Me.[контроль].Value = Me.[срок].Value
End If
Нажимаю я эту кнопку. Выполняется этот код. И после этого по идее во всех записях, которые я отметила в поле "Поле2" должны измениться поля Контроль на значение в поле Срок.
И все хорошо, если бы не одно НО. изменение происходит ТОЛЬКО в текущей записи, на которой установлен фокус.
А КАК СДЕЛАТЬ, ЧТОБЫ ИЗМЕНЕНИЯ ПРОИСХОДИЛИ ВО ВСЕХ ОТМЕЧЕННЫХ ЗАПИСЯХ? | |
|
| |
|
|
|
| Тут нужен цикл. Правильно? Какой?
do loop во всех его разновидностях не подходит. так?
значит for next?
А количество значений как тогда определить по количеству всех значений в форме? Чтобы он по всем пробежался. Ведь логическое значение будет иметь значение Правда не по всех записях подряд, а в разнобой. | |
|
| |
|
|
|
| И плюс, чтобы по полю54 после этого еще происходила сразу и автоматическая сортировка, так как у меня при выполнении кода будет меняться значение поля54.
Это как написать? | |
|
| |
|
|
|
| Если я правильно понял задачу то тебе надо:
открыть Recordset (rs1)
Инструкциуей Select делаешь выборку из нужной таблицы
а дальше
Do While Not rs1.EOF
..код что тебе надо изменить
rs1.MoveNext ' В итоге в цикле переберешь весь набор записей
Loop | |
|
| |
|
|
|
| у меня с рекордсетами пока не совсем лады.
А примерчик можно?
То есть вот что нужно (названия полей я упрощю):
Поле1 логическое (Да или нет)
Поле2 дата1
Поле3 дата2
Поле 4 состояние дат (значения Изменено или Не изменено)
Нужно:
Если поле1 = -1 (то есть ДА) и поле4 = "Изменено" тогда
поле2 = поле3
поле4 = "не изменено"
применение сортировки по полю4
Из этого я не знаю, как сделать цикл и сортировку.
Сортировку пробую делать так:
Me.Orderby= поле4
Me.Orderbyon = true
так он при этом наоборот сортирует в беспорядочном поряде, извините за тофтологию.
а цикл через рекордсет - это пока мне не под силу. за примерчик будут крайне признательна. | |
|
| |
|
|
|
| Сейчас сделаю С рекордсетами все не так сложно (когда поймешь то все начнешь делать в коде!!) Единственно я все делаю в VB6 поэтому код немного отличается от код VBA ACCSESS
если не поймешь спрашивай
итак поехали
рекордсет-- Набор записей из определенной таблицы или нескольких таблиц
для его открытия:
Dim rs1 As New ADODB.Recordset
With rs1
.ActiveConnection = my_DBConn 'строка подключения к твоей базе
.CursorType = adOpenStatic '
.LockType = adLockOptimistic
.SOURSE="SELECT Поле1.(имя твоей таблицы) ,Поле2.(имя твоей таблицы),Поле3.(имя твоей таблицы) ,Поле4.(имя твоей таблицы) FROM (имя твоей таблицы)
.OPEN
'В итоге получили набор записей по указаным полям из твоей таблицы
'если вставишь
MSGBOX .RecorCount ' то увидишь количество записей (выбранных строк)
'Теперь перебираем все записи (это цикл)
DO WHILE Not .EOF ' условие перебрать все записи пока не дойдем до конца
' внутри цикла делаем наши дела для каждой строки
IF .Fields("Поле1")=-1 AND .Fields("Поле4")="Изменено" THEN
.Fields("Поле2")=.Fields("Поле3")
.Fields("Поле4")="не изменено"
end if
.MoveNext ' именно этой командой переходишь к следуещей записи
LOOP
'в итоге изменила все значения как тебе надо
'и наконец
.Update
.cloze
END With
Ну как (если что не понято то спрашивай) | |
|
| |
|
|
|
| а не проще через запрос на изменение?
DoCnd.execute "Update то-то то-то Where [поле1] = 'изменено' And [поле2] = -1"
|
| |
|
| |
|
|
|
| В данном конкретном случае конечно проще
Но если какую-то строку надо изменить по другому условию или изменять разные поля при разных условиях то через ADO мне кажется гораздо удобнее и наглядней чем через SQL
хотя и наверно медленней | |
|
| |
|
|
|
| Тякс, пойду разбираться. Пока вопросов нет. А ГлазастомуМышу советую написать еще одно сообщение, а то у тебя 666 сообщений. Не страшно? | |
|
| |
|
|
|
|
| Сейчас гляну (сначало так всегда не переживай) | |
|
| |
|
|
|
| ты не создала подключение к базе
при загрузке формы должен выполнится код
dim my_DBConn As ADODB.Connection
Dim db_file As String
' Пишем строку пути к твоей базе.
db_file = App.Path
If Right$(db_file, 1) <> "\" Then db_file = db_file & "\"
db_file = db_file & "изменение срока назначения дела 2000.mdb"
' Открываем соединение с базой.
Set my_DBConn = New ADODB.Connection
my_DBConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & db_file & ";" & _
"Persist Security Info=False"
'теперь подключились к базе
Вперед (если что пиши) | |
|
| |
|
|
|
| То есть вот этот код поместить в событие формы "Загрузка". Да?
Я так и сделала, но при загрузке формы пишет Object Required | |
|
| |
|
|
|
| переменные
dim my_DBConn As ADODB.Connection
Dim db_file As String
должны быть описаны в секции GENERAL формы чтобы быть доступными любой подпрограмме внутри формы
выполни все пошагово чтоб увидеть строку в которой происходит ошибка
Пиши (все получится!!! зато потом ты с базами будешь делать все что захочешь) | |
|
| |
|
|
|
| Да кстати в окне редактора кода проверь есть ли у тебя ссылка(Tools-References) на библиотеку Microsoft ActiveX Data Objects 2.5 Library (можно 2,7 ) если нет то поставь галочку | |
|
| |
|
|
|
|
| у меня эти переменные описаны как раз в этой секции, то есть доступны по идее во всем модуле формы. Но эффект тот же. А аксеса у Вас нет, уважаемый OVR?
В любом случае спасибо за помощь. Боялась я этих рекордсетов, но теперь, судя по всему, придется с ними разобраться. | |
|
| |
|
|
|
| Сейчас попробую твою форму
я правда только таблицы создаю в Accesse а так все в VB
Все заработает !! | |
|
| |
|
|
|
| Соединение создалось!! Жди | |
|
| |
|
34 Кб. |
|
| Итак лови все работает
посмотри код кнопки 43
в db_file = "D:\fabrika\1\изменение срока назначения дела 2000.mdb"
это то место куда я скинул твою базу
ты должна указать свой полный путь к базе !!!!!!!!!!!!!!!
подключение к базе я вставил в кнопку но правильнее в загрузку формы
Пиши что вышло у тебя | |
|
| |
|
|
|
| Я ставлю галочки там, где должно произойти изменение даты, но не везде это происходит. Почему-то это происходит лишь в некоторых записях. Но не во всех отмеченных.
Не происходит изменний в записи, которая была отмечена последней, не важно, в каком месте эта запись располжена, снизу или сверху. То есть независимо от того, в каком направлении отмечались записи, последняя выбранная не работает.
И еще вопрос. У меня база находится на флэшке. На домашнем и рабочем компьютеах флешка распознается под разными буквами. Поэтому если я укажу полный путь с буквой, то его придется все время менять. Можно ли это исправить? Моя база будет работать только на флешке. На локальных дисках такие базы я не держу.
СПАСИБО! | |
|
| |
|
38 Кб. |
|
| Я так понял что сдвиги есть
далее я там кинул тебе на форму кнопочку нажимаешь и указываешь букву диска(только букву) код я подправил
(путь к базе будет действовать в текущем сеансе т.е. при открытие базы надо указать
букву)
Пиши что получилось | |
|
| |
|
|
|
| на новой кнопке нет событий. она пустая.
но сам код есть. так что я присвоила. все в порядке. наверное, это из-за открытия в аксес 2007
пишет "недопустимое имя файла"
вот здесь
my_DBConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & db_file & ";" & _
"Persist Security Info=False"
Уважаемый OVR, а может быть что-то попроще? Просто я пока в рекордсетах плаваю совсем.
А цикл без рекордсета вообще невозможно?
А for each без рекордсета? Или с помощью SQL?
А то вы тут мучаетесь со мной, мучаетесь. Спасибо Вам огромное. Замучила, наверное. | |
|
| |
|
|
|
| Ничего страшного (ведь все уже почти сделали)
итак ты вводишь букву в текстовое поле (например G без двоеточия)
а на кнопке43 у тебя есть код
db_file =disk & ":\путь к твоему фаилу"
ты просто не изменила эту строку
к примеру у тебя база называется База.mdb и лежит
на G в папке Base тогда
db_file =disk & ":\Base\База.mdb"
поставь перед my_DBConn.Open оператор MSGbox db_file
и ты увидишь свой путь
у тебя все получится!!!
Пиши пока не поймешь можешь в личку все вопросы чем смогу помогу | |
|
| |
|
|
|
| букву я ввожу без двоеточия. здесь все ясно.
путь к файлу я тоже изменила. я сразу заметила, что там была fabrika, как у Вас. а я это изменила на свой путь.
если я ставлю MSGbox db_file или просто msgbox перед my_DBConn.Open, мне выдается сообщение о синтаксической ошибке. | |
|
| |
|
|
|
| Нет не перед буквально а отдельной командой
вот так
Dim rs1 As New ADODB.Recordset
db_file = Disk & ":\fabrika\1\твой путь и имя базы 2000.mdb" ' App.Path
' Open the database connection.
Set my_DBConn = New ADODB.Connection
MsgBox db_file
my_DBConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & db_file & ";" & _
"Persist Security Info=False"
Или укажи мне где она у тебя лежит | |
|
| |
|
|
|
|
| Чудесно !! У тебя очень длинное имя базы "изменение срока назначения дела 2000.mdb"
лучше покороче и латинскими (теперь у тебя все по взрослому должно быть )
итак полный путь к твоей базе это (например флешка это буква G)
db_file="G:\_ACCDBRFT\изменение срока назначения дела 2000.mdb"
у нас вот так
db_file=Disk & ":\_ACCDBRFT\изменение срока назначения дела 2000.mdb" (такой должна быть у тебя эта строка
переменной Disk присваевается буква с помощью кнопки 49 кажется
т.е запустила форму Сначала нажала кнопку выбора диска указала диск Жмешь ОК
и потом уже жмешь на свою кнопку!! Все Будет работать!! у меня же пашет
Кстати это практически самое муторное при освоении подключений к базе из кода
Давай вперед Пиши | |
|
| |
|
|
|
| терь работает. Спасибо огромное.
Только еще вопросик, можно?
Как сделать так, чтобы сразу все обновилось. Сейчас после нажатия кнопки обновляется только после того, как я установлю курсор на одно из полей. | |
|
| |
|
|
|
| Попробуй в конце процедуры нажатия твоей кнопки ввести
me.refresh
кстати название формы у тебя тоже супер (Fc_Affairs_контроль_изм_назначенного_срока)
Представь тебе нано будет сослаться на имя этой формы
Бери за правило Все имена вводить латинскими и покороче
Избежишь многих проблем
Пиши я буду до 23 ну там завтра
Спрашивай Все не стесняйся | |
|
| |
|
|
|
|
| ну по поводу что вопрос последний ты погорячилась ( если хочешь научится работать с кодом)
так что чем больше вопросов тем больше знаешь
теперь по поводу указания пути к базе (именно к базе а не к рекордсету!!)
чтобы создать рекордсет нужно открыть соединение с базой! А база может быть установлена где угодно
Ты мыслишь правильно в VB есть комманда App.Path которая как раз и возвращяет путь
сейчас попробую ее в аксесе | |
|
| |
|
|
|
| Увы в прямую в аксесе 2000 не работает
Но я гдето видел как это делается
завтра Найдем куда она денется
Попробуй у себя msgbox App.Path что будет | |
|
| |
|
|
|
| у меня акЦес 2007, а не 2000. может в нем можно?
а насчет msgbox App.Path - я это попробую. немного позже. а то сейчас надо убежать на полчасика. | |
|
| |
|
|
|
|
| Нашел как сделать чтоб не вводить диск Все очень просто!!!
Я просто в аксесе не работаю
так вот комманд CurrentDB().name возвращает путь к текущей базе!!!
db_file=CurrentDb().name и все!!!
До завтра | |
|
| |
|
|
|
| на MDB работает db_file = CurrentDb().name
а вот на ACCDB (аксес 2007) вот на этой строке пишет, что не может распознать формат базы данных.
my_DBConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & db_file & ";" & _
"Persist Security Info=False"
Я так понимаю, здесь нужно изменить версию этого самого провайдера? А какая должна быть в 2007 аксесе?
Если я меня версию провайдера, то он говорит, что не может найти провайдера. В референсах я подключила MS OLEDB.....8.0 | |
|
| |
|
|
|
| 1. В Access соединение с текущей БД уже существует. Это CurrentProject.Connection.
2. Вместо открытия нового Recordset-а можно использовать свойства формы Recordset или RecordsetClone.
3. Последняя отмеченная запись не обрабатывается потому, что запись еще не сохранена. Сначала нужно выполнить Me.Dirty = False или Me.Refresh.
4. ГлазастыйМышь вам правильно посоветовал. Эту задачу проще и быстрее решить выполнением запроса "UPDATE..." | |
|
| |
|
|
|
|
|
которые я отметила в поле "Поле2" должны измениться поля Контроль на значение в поле Срок
|
А не проще выполнять присвоение значения полю "контроль" на событии элемента управления "Поле2"? Не надо будет ни циклов, ни рекордсетов, ни коннектов? | |
|
| |
|
|
|
| Спасибо за советы. | |
|
| |
|
|
|
| Lukas, кажется, проще. Но на какое событие вешать? Мне ведь надо так, чтобы событие произошло ПОСЛЕ нажатия кнопки. Ведь пометив запись, я еще не собираюсь ничего менять. Ведь я могу ошибочно ее пометить. Поэтому событие должно произойти только после того, как я отмечу все необходимые записи и после этого нажатием на кнопку я укажу, что событие должно произойти.
В общем, мне сначала надо все это дело осознать и попробовать. А то для моего нынешнего уровня многова-то всего. я пойду сама все это осознавать. Дабы пищу для размышлений вы мне дали хорошую
СПАСИБО всем!
Но если что, я буду обращаться еще по этой теме, хорошо? | |
|
| |
|
|
|
| А вот еще . А как с помощью кнопки снять галочки с Поля2? То есть чтобы логическое поле во всех записях приобрело значение 0?
Если я пишу Поле2=0, то это касается только текущего поля. А если я хочу установить логическое значение на 0 во всех записях? | |
|
| |
|
|
|
| Если чек бокс в подч.форме а кнопка в основной, то можно так
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateQuery", acViewNormal, acEdit
DoCmd.SetWarnings False
Me.Subform.Requery
|
| |
|
| |
|
|
|
| в основной форме | |
|
| |
|
|
|
|
| поле с логическим значением в основной форме. | |
|
| |
|
|
|
| Попробуй так (чек бокс в ленточной форме - она же оснавная)
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateQuery", acViewNormal, acEdit
DoCmd.SetWarnings False
Me.Requery
|
Кнопку лучше ставить в примечаниии или заголовке
Предварительно нужно создать запрос на обнавление UpdateQuery, который должен обнавлять нужные записи | |
|
| |
|
|
|
|
| все получилось с помощью запроса на обновление. быстро и удобно.
главное, я увидела в запросах на обновление очень удобную веЗЧЬ. почему я раньше их боялась?
в общем, классно. СПАСИБО всем!
с рекордсетами все равно надо разбираться. они же тоже нужны. | |
|
| |