Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как?
 
 автор: Аленка   (05.10.2008 в 11:53)   личное сообщение
 
 

If Me.[поле1] = "изменено" And [поле2] = -1 Then
Me.[контроль].Value = Me.[срок].Value
End If

Нажимаю я эту кнопку. Выполняется этот код. И после этого по идее во всех записях, которые я отметила в поле "Поле2" должны измениться поля Контроль на значение в поле Срок.
И все хорошо, если бы не одно НО. изменение происходит ТОЛЬКО в текущей записи, на которой установлен фокус.

А КАК СДЕЛАТЬ, ЧТОБЫ ИЗМЕНЕНИЯ ПРОИСХОДИЛИ ВО ВСЕХ ОТМЕЧЕННЫХ ЗАПИСЯХ?

  Ответить  
 
 автор: Аленка   (05.10.2008 в 11:59)   личное сообщение
 
 

Тут нужен цикл. Правильно? Какой?
do loop во всех его разновидностях не подходит. так?
значит for next?

А количество значений как тогда определить по количеству всех значений в форме? Чтобы он по всем пробежался. Ведь логическое значение будет иметь значение Правда не по всех записях подряд, а в разнобой.

  Ответить  
 
 автор: Аленка   (05.10.2008 в 12:13)   личное сообщение
 
 

И плюс, чтобы по полю54 после этого еще происходила сразу и автоматическая сортировка, так как у меня при выполнении кода будет меняться значение поля54.
Это как написать?

  Ответить  
 
 автор: ovr   (05.10.2008 в 12:17)   личное сообщение
 
 

Если я правильно понял задачу то тебе надо:
открыть Recordset (rs1)
Инструкциуей Select делаешь выборку из нужной таблицы
а дальше
Do While Not rs1.EOF
..код что тебе надо изменить
rs1.MoveNext ' В итоге в цикле переберешь весь набор записей
Loop

  Ответить  
 
 автор: Аленка   (05.10.2008 в 12:42)   личное сообщение
 
 

у меня с рекордсетами пока не совсем лады.
А примерчик можно?
То есть вот что нужно (названия полей я упрощю):

Поле1 логическое (Да или нет)
Поле2 дата1
Поле3 дата2
Поле 4 состояние дат (значения Изменено или Не изменено)

Нужно:
Если поле1 = -1 (то есть ДА) и поле4 = "Изменено" тогда
поле2 = поле3
поле4 = "не изменено"
применение сортировки по полю4

Из этого я не знаю, как сделать цикл и сортировку.
Сортировку пробую делать так:
Me.Orderby= поле4
Me.Orderbyon = true
так он при этом наоборот сортирует в беспорядочном поряде, извините за тофтологию.
а цикл через рекордсет - это пока мне не под силу. за примерчик будут крайне признательна.

  Ответить  
 
 автор: ovr   (05.10.2008 в 13:17)   личное сообщение
 
 

Сейчас сделаю С рекордсетами все не так сложно (когда поймешь то все начнешь делать в коде!!) Единственно я все делаю в 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

Ну как (если что не понято то спрашивай)

  Ответить  
 
 автор: ГлазастыйМышь   (05.10.2008 в 13:19)   личное сообщение
 
 

а не проще через запрос на изменение?

DoCnd.execute "Update то-то то-то Where [поле1] = 'изменено' And [поле2] = -1"

  Ответить  
 
 автор: ovr   (05.10.2008 в 13:51)   личное сообщение
 
 

В данном конкретном случае конечно проще
Но если какую-то строку надо изменить по другому условию или изменять разные поля при разных условиях то через ADO мне кажется гораздо удобнее и наглядней чем через SQL
хотя и наверно медленней

  Ответить  
 
 автор: Аленка   (05.10.2008 в 13:59)   личное сообщение
 
 

Тякс, пойду разбираться. Пока вопросов нет. А ГлазастомуМышу советую написать еще одно сообщение, а то у тебя 666 сообщений. Не страшно?

  Ответить  
 
 автор: Аленка   (05.10.2008 в 14:28)   личное сообщение
31 Кб.
 
 

а может посмотрите примерчик?
когда я делаю с рекордсетом,пишет, что аргументы имеют неверный тип, выходят за пределы допустимого диапазона или конфликтуют друг с другом.

  Ответить  
 
 автор: ovr   (05.10.2008 в 14:30)   личное сообщение
 
 

Сейчас гляну (сначало так всегда не переживай)

  Ответить  
 
 автор: ovr   (05.10.2008 в 14:52)   личное сообщение
 
 

ты не создала подключение к базе
при загрузке формы должен выполнится код

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"

'теперь подключились к базе

Вперед (если что пиши)

  Ответить  
 
 автор: Аленка   (05.10.2008 в 15:01)   личное сообщение
 
 

То есть вот этот код поместить в событие формы "Загрузка". Да?
Я так и сделала, но при загрузке формы пишет Object Required

  Ответить  
 
 автор: ovr   (05.10.2008 в 15:15)   личное сообщение
 
 

переменные
dim my_DBConn As ADODB.Connection
Dim db_file As String

должны быть описаны в секции GENERAL формы чтобы быть доступными любой подпрограмме внутри формы
выполни все пошагово чтоб увидеть строку в которой происходит ошибка
Пиши (все получится!!! зато потом ты с базами будешь делать все что захочешь)

  Ответить  
 
 автор: ovr   (05.10.2008 в 15:25)   личное сообщение
 
 

Да кстати в окне редактора кода проверь есть ли у тебя ссылка(Tools-References) на библиотеку Microsoft ActiveX Data Objects 2.5 Library (можно 2,7 ) если нет то поставь галочку

  Ответить  
 
 автор: Аленка   (05.10.2008 в 15:37)   личное сообщение
 
 

ссылка есть на 2.8.

  Ответить  
 
 автор: Аленка   (05.10.2008 в 15:39)   личное сообщение
 
 

у меня эти переменные описаны как раз в этой секции, то есть доступны по идее во всем модуле формы. Но эффект тот же. А аксеса у Вас нет, уважаемый OVR?
В любом случае спасибо за помощь. Боялась я этих рекордсетов, но теперь, судя по всему, придется с ними разобраться.

  Ответить  
 
 автор: ovr   (05.10.2008 в 15:50)   личное сообщение
 
 

Сейчас попробую твою форму
я правда только таблицы создаю в Accesse а так все в VB
Все заработает !!

  Ответить  
 
 автор: ovr   (05.10.2008 в 16:10)   личное сообщение
 
 

Соединение создалось!! Жди

  Ответить  
 
 автор: ovr   (05.10.2008 в 16:34)   личное сообщение
34 Кб.
 
 

Итак лови все работает
посмотри код кнопки 43
в db_file = "D:\fabrika\1\изменение срока назначения дела 2000.mdb"
это то место куда я скинул твою базу
ты должна указать свой полный путь к базе !!!!!!!!!!!!!!!
подключение к базе я вставил в кнопку но правильнее в загрузку формы
Пиши что вышло у тебя

  Ответить  
 
 автор: Аленка   (05.10.2008 в 17:07)   личное сообщение
 
 

Я ставлю галочки там, где должно произойти изменение даты, но не везде это происходит. Почему-то это происходит лишь в некоторых записях. Но не во всех отмеченных.
Не происходит изменний в записи, которая была отмечена последней, не важно, в каком месте эта запись располжена, снизу или сверху. То есть независимо от того, в каком направлении отмечались записи, последняя выбранная не работает.

И еще вопрос. У меня база находится на флэшке. На домашнем и рабочем компьютеах флешка распознается под разными буквами. Поэтому если я укажу полный путь с буквой, то его придется все время менять. Можно ли это исправить? Моя база будет работать только на флешке. На локальных дисках такие базы я не держу.
СПАСИБО!

  Ответить  
 
 автор: ovr   (05.10.2008 в 17:32)   личное сообщение
38 Кб.
 
 

Я так понял что сдвиги есть
далее я там кинул тебе на форму кнопочку нажимаешь и указываешь букву диска(только букву) код я подправил
(путь к базе будет действовать в текущем сеансе т.е. при открытие базы надо указать
букву)
Пиши что получилось

  Ответить  
 
 автор: Аленка   (05.10.2008 в 17:58)   личное сообщение
 
 

на новой кнопке нет событий. она пустая.
но сам код есть. так что я присвоила. все в порядке. наверное, это из-за открытия в аксес 2007

пишет "недопустимое имя файла"
вот здесь
my_DBConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & db_file & ";" & _
"Persist Security Info=False"


Уважаемый OVR, а может быть что-то попроще? Просто я пока в рекордсетах плаваю совсем.
А цикл без рекордсета вообще невозможно?
А for each без рекордсета? Или с помощью SQL?
А то вы тут мучаетесь со мной, мучаетесь. Спасибо Вам огромное. Замучила, наверное.

  Ответить  
 
 автор: ovr   (05.10.2008 в 18:33)   личное сообщение
 
 

Ничего страшного (ведь все уже почти сделали)
итак ты вводишь букву в текстовое поле (например G без двоеточия)
а на кнопке43 у тебя есть код
db_file =disk & ":\путь к твоему фаилу"
ты просто не изменила эту строку
к примеру у тебя база называется База.mdb и лежит
на G в папке Base тогда
db_file =disk & ":\Base\База.mdb"

поставь перед my_DBConn.Open оператор MSGbox db_file
и ты увидишь свой путь

у тебя все получится!!!
Пиши пока не поймешь можешь в личку все вопросы чем смогу помогу

  Ответить  
 
 автор: Аленка   (05.10.2008 в 18:41)   личное сообщение
 
 

букву я ввожу без двоеточия. здесь все ясно.
путь к файлу я тоже изменила. я сразу заметила, что там была fabrika, как у Вас. а я это изменила на свой путь.
если я ставлю MSGbox db_file или просто msgbox перед my_DBConn.Open, мне выдается сообщение о синтаксической ошибке.

  Ответить  
 
 автор: ovr   (05.10.2008 в 18:50)   личное сообщение
 
 

Нет не перед буквально а отдельной командой
вот так
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"
Или укажи мне где она у тебя лежит

  Ответить  
 
 автор: Аленка   (05.10.2008 в 20:01)   личное сообщение
 
 

:\_ACCDBRFT

  Ответить  
 
 автор: ovr   (05.10.2008 в 20:30)   личное сообщение
 
 

Чудесно !! У тебя очень длинное имя базы "изменение срока назначения дела 2000.mdb"
лучше покороче и латинскими (теперь у тебя все по взрослому должно быть )
итак полный путь к твоей базе это (например флешка это буква G)
db_file="G:\_ACCDBRFT\изменение срока назначения дела 2000.mdb"
у нас вот так
db_file=Disk & ":\_ACCDBRFT\изменение срока назначения дела 2000.mdb" (такой должна быть у тебя эта строка
переменной Disk присваевается буква с помощью кнопки 49 кажется
т.е запустила форму Сначала нажала кнопку выбора диска указала диск Жмешь ОК
и потом уже жмешь на свою кнопку!! Все Будет работать!! у меня же пашет
Кстати это практически самое муторное при освоении подключений к базе из кода
Давай вперед Пиши

  Ответить  
 
 автор: Аленка   (05.10.2008 в 21:39)   личное сообщение
 
 

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

  Ответить  
 
 автор: ovr   (05.10.2008 в 21:54)   личное сообщение
 
 

Попробуй в конце процедуры нажатия твоей кнопки ввести
me.refresh
кстати название формы у тебя тоже супер (Fc_Affairs_контроль_изм_назначенного_срока)
Представь тебе нано будет сослаться на имя этой формы
Бери за правило Все имена вводить латинскими и покороче
Избежишь многих проблем
Пиши я буду до 23 ну там завтра
Спрашивай Все не стесняйся

  Ответить  
 
 автор: Аленка   (05.10.2008 в 21:58)   личное сообщение
 
 

Отлично. Заработало.
Не обижайтесь, но я самый, самый последний вопрос задам. Хорошо?
А можно как-то обойтись без имени файла? Например, как-то указать, что этот рекордсет из ТЕКУЩЕЙ БД?
Просто каждый раз вот так вводить букву диска. Это же очень неудобно.

  Ответить  
 
 автор: ovr   (05.10.2008 в 22:23)   личное сообщение
 
 

ну по поводу что вопрос последний ты погорячилась ( если хочешь научится работать с кодом)
так что чем больше вопросов тем больше знаешь
теперь по поводу указания пути к базе (именно к базе а не к рекордсету!!)
чтобы создать рекордсет нужно открыть соединение с базой! А база может быть установлена где угодно
Ты мыслишь правильно в VB есть комманда App.Path которая как раз и возвращяет путь
сейчас попробую ее в аксесе

  Ответить  
 
 автор: ovr   (05.10.2008 в 22:30)   личное сообщение
 
 

Увы в прямую в аксесе 2000 не работает
Но я гдето видел как это делается
завтра Найдем куда она денется
Попробуй у себя msgbox App.Path что будет

  Ответить  
 
 автор: Аленка   (05.10.2008 в 23:01)   личное сообщение
 
 

у меня акЦес 2007, а не 2000. может в нем можно?
а насчет msgbox App.Path - я это попробую. немного позже. а то сейчас надо убежать на полчасика.

  Ответить  
 
 автор: Аленка   (05.10.2008 в 23:03)   личное сообщение
 
 

А насчет вопросов, то это я в этой теме вроде бы собиралась последний вопрос задавать.
А так, конечно, буду задавать и задавать.
И спасибо огромное всем, кто мне помогает!!!!!
Вам персональное огромное спасибо. Вы сегодня со мной столько мучаетесь.

  Ответить  
 
 автор: ovr   (05.10.2008 в 23:24)   личное сообщение
 
 

Нашел как сделать чтоб не вводить диск Все очень просто!!!
Я просто в аксесе не работаю
так вот комманд CurrentDB().name возвращает путь к текущей базе!!!
db_file=CurrentDb().name и все!!!
До завтра

  Ответить  
 
 автор: Аленка   (06.10.2008 в 10:01)   личное сообщение
 
 

на 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

  Ответить  
 
 автор: Анатолий (Киев)   (06.10.2008 в 11:26)   личное сообщение
 
 

1. В Access соединение с текущей БД уже существует. Это CurrentProject.Connection.
2. Вместо открытия нового Recordset-а можно использовать свойства формы Recordset или RecordsetClone.
3. Последняя отмеченная запись не обрабатывается потому, что запись еще не сохранена. Сначала нужно выполнить Me.Dirty = False или Me.Refresh.
4. ГлазастыйМышь вам правильно посоветовал. Эту задачу проще и быстрее решить выполнением запроса "UPDATE..."

  Ответить  
 
 автор: Анатолий (Киев)   (06.10.2008 в 11:26)   личное сообщение
 
 

.

  Ответить  
 
 автор: Lukas   (06.10.2008 в 12:01)   личное сообщение
 
 


которые я отметила в поле "Поле2" должны измениться поля Контроль на значение в поле Срок

А не проще выполнять присвоение значения полю "контроль" на событии элемента управления "Поле2"? Не надо будет ни циклов, ни рекордсетов, ни коннектов?

  Ответить  
 
 автор: Аленка   (06.10.2008 в 12:03)   личное сообщение
 
 

Спасибо за советы.

  Ответить  
 
 автор: Аленка   (06.10.2008 в 12:06)   личное сообщение
 
 

Lukas, кажется, проще. Но на какое событие вешать? Мне ведь надо так, чтобы событие произошло ПОСЛЕ нажатия кнопки. Ведь пометив запись, я еще не собираюсь ничего менять. Ведь я могу ошибочно ее пометить. Поэтому событие должно произойти только после того, как я отмечу все необходимые записи и после этого нажатием на кнопку я укажу, что событие должно произойти.

В общем, мне сначала надо все это дело осознать и попробовать. А то для моего нынешнего уровня многова-то всего. я пойду сама все это осознавать. Дабы пищу для размышлений вы мне дали хорошую
СПАСИБО всем!
Но если что, я буду обращаться еще по этой теме, хорошо?

  Ответить  
 
 автор: Аленка   (06.10.2008 в 12:58)   личное сообщение
 
 

А вот еще . А как с помощью кнопки снять галочки с Поля2? То есть чтобы логическое поле во всех записях приобрело значение 0?
Если я пишу Поле2=0, то это касается только текущего поля. А если я хочу установить логическое значение на 0 во всех записях?

  Ответить  
 
 автор: Pasat   (06.10.2008 в 14:31)   личное сообщение
 
 

Если чек бокс в подч.форме а кнопка в основной, то можно так
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateQuery", acViewNormal, acEdit
DoCmd.SetWarnings False
Me.Subform.Requery

  Ответить  
 
 автор: Аленка   (06.10.2008 в 21:56)   личное сообщение
 
 

в основной форме

  Ответить  
 
 автор: Pasat   (06.10.2008 в 21:58)   личное сообщение
 
 

Что в основной форме ?

  Ответить  
 
 автор: Аленка   (07.10.2008 в 06:39)   личное сообщение
 
 

поле с логическим значением в основной форме.

  Ответить  
 
 автор: pasat   (07.10.2008 в 09:34)   личное сообщение
 
 

Попробуй так (чек бокс в ленточной форме - она же оснавная)
DoCmd.SetWarnings False 
DoCmd.OpenQuery "UpdateQuery", acViewNormal, acEdit 
DoCmd.SetWarnings False 
Me.Requery  


Кнопку лучше ставить в примечаниии или заголовке
Предварительно нужно создать запрос на обнавление UpdateQuery, который должен обнавлять нужные записи

  Ответить  
 
 автор: Аленка   (08.10.2008 в 00:28)   личное сообщение
 
 

спасибо

  Ответить  
 
 автор: Аленка   (08.10.2008 в 17:55)   личное сообщение
 
 

все получилось с помощью запроса на обновление. быстро и удобно.
главное, я увидела в запросах на обновление очень удобную веЗЧЬ. почему я раньше их боялась?
в общем, классно. СПАСИБО всем!
с рекордсетами все равно надо разбираться. они же тоже нужны.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList