Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
1

Rs.EditMode или как обновить данные в Базе Данных VBA (Excel to Access)

05.11.2015, 15:57. Показов 3673. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно обновить или перезаписать данные в таблице:
Структура БД:
Таблицы с полями: (id Счетчик, name Char, dd Int, itime datetime, otime datetime)
Обновлению подлежит только время.
1. Соединился с БД.
2. Сделал выборку SQl запросом.
Visual Basic
1
("SELECT * FROM test WHERE name = "user1" And dd = 1")
3. Открыл rs.Open

Visual Basic
1
2
3
4
5
6
rs.EditMode
For i = 0 To 1
        rs.Fields(3) = .Cells(1, 3).Value
        rs.Fields(4) = .Cells(1, 4).Value
Next
rs.Update
Как делается это правильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2015, 15:57
Ответы с готовыми решениями:

Обновить данные в таблице Access на основе данных из Excel
Добрый день, подскажите, пожалуйста, как решить задачу: Есть книга Excel "C:\Data\Новые...

Как в базе данных Access 2003 создать отчет Excel
Всем доброго дня я создал базы данных на Access 2003 основная задача БД это фильтрации поиск но...

Обновить данные в таблице excel на основе даннх из Access
Уважаемые форумчане. Помогите пожалуйста решить следующую проблему. Есть база данных аксес....

Как редактировать данные в базе данных MS Access с помощью Delphi?
Как редактировать данные в базе данных ms access с помощью delphi

16
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
05.11.2015, 16:16 2
Если хотите просто вставить данные на лист Excel то используйте. Работает очень быстро.

Visual Basic
1
Cells(1, 1).CopyFromRecordset rs
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 798
05.11.2015, 16:59 3
Роман, у человека обратная операция - он изменяет данные в БД, опираясь на значения ячеек.
Вопрос к mostApi: строка одна всегда редактируется? Т.е. запрос не может вернуть более одной строки из БД? И какой практический смысл в цикле от 0 до 1, если переменная i нигде не используется?
Напишите своими словами по шагам, что надо сделать.
0
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
05.11.2015, 17:08 4
Роман, у человека обратная операция - он изменяет данные в БД, опираясь на значения ячеек.
Извиняюсь сглупил)
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 08:27  [ТС] 5
The_Prist, да, Вы точно подметили...
Мне необходимо обновить имеющиеся данные в базе...

Строка с данными постоянна, изменение значений только itime и otime... , относительно проверки совпадения с name и dd...

В идеале в базе будет только одна необходимая строчка, см.Рисунок
Но в дальнейшем, возможно будет несколько строчек на одного Работника и dd, т.е. Работник1 пришел на работу dd = 1 (первого числа), но он несколько раз выходил, отмечался за территорию, соотвественно записей с name="Работник1" And dd=1 будет несколько, разное будет естественно id, itime, otime...
Миниатюры
Rs.EditMode или как обновить данные в Базе Данных VBA (Excel to Access)  
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 08:35  [ТС] 6
Цитата Сообщение от Roman_rc Посмотреть сообщение
Если хотите просто вставить данные на лист Excel то используйте. Работает очень быстро.
Visual Basic
Выделить код
1
Cells(1, 1).CopyFromRecordset rs
- т.к. база сейчас пустая, на рабочих листах Книги Excel я знаю весь рабочий диапазон ячеек, по Вашему принципу сделаю цикл вставку данных со всех листов, чтоб заполнить Базу.

Попутный вопрос: в базе Access id с ключем (счетчик) - возможно автозаполнение (автоинкермент)?! Что-то не нашел как задать!
На текущий момент перед вставкой заглядываю запросом в базу, выясняю порядковый номер последней записи в базе, соответственно формирую номер id, после чего произвожу вставку...
0
шапоклякистка 8-го дня
3680 / 2240 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.11.2015, 09:09 7
Цитата Сообщение от mostApi Посмотреть сообщение
возможно автозаполнение (автоинкермент)?!
Если счетчик последовательный, то не просто возможно, а так и есть.
Впрочем, если случайный - то тоже так и есть, только номер не угадаешь )

Добавлено через 2 минуты
Вопрос: а нет желания вместо экспорта в vba Excel сделать импорт силами Access?

для *.xls

SELECT *
FROM [ИмяЛиста$] IN 'путь\имяфайла.xls'[Excel 8.0; HDR=FALSE;]

Для файлов *.xlsx

SELECT *
FROM [ИмяЛиста$] IN 'путь\имяфайла.xlsx'[Excel 12.0 XML; HDR=No;]

Параметр HDR равный Yes задает, что первая строка в диапазоне это названия полей. Если HDR=No, то весь диапазон это данные.
Добавлено через 49 секунд
Автор гениальной цитаты mobile
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 09:28  [ТС] 8
Цитата Сообщение от texnik-san Посмотреть сообщение
Вопрос: а нет желания вместо экспорта в vba Excel сделать импорт силами Access?
нет, спасибо))
Большая часть работы сделана, не хочется передумывать весь алгоритм работы...
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 11:35  [ТС] 9
Что это значит?
Миниатюры
Rs.EditMode или как обновить данные в Базе Данных VBA (Excel to Access)  
0
шапоклякистка 8-го дня
3680 / 2240 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.11.2015, 11:42 10
Много вариантов. Может быть, у вас в качестве рекордсета необновляемый запрос (например, с внешними связями или группировкой), или вы его открыли в режиме, не позволяющем запись.

Добавлено через 20 секунд
Или да, с блокировкой.
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 12:39  [ТС] 11
texnik-san,
- понял, у меня был открыт
Visual Basic
1
cn.Open
, а нужно было
Visual Basic
1
rs.Open
и
Visual Basic
1
Set rs = New ADODB.Recordset
- ))

Добавлено через 54 минуты
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ComboBox1.ListIndex = 0
 
For i = 1 To 12 'если 11 то норм, не ругается, но не дописывает одну строчку с данными
 
ComboBox2.ListIndex = 0
 
For Z = 1 To 31 'если 30 то норм, не ругается, но не дописывает одну строчку с данными
 
Set rs = New ADODB.Recordset
rs.Open Source:=TextBox2.Value, ActiveConnection:=cn, CursorType:=adOpenStatic, LockType:=adLockOptimistic
rs.AddNew
            rs.Fields(3) = .Cells(1, ComboBox2.ListIndex * 3 + 3).Value
            rs.Fields(4) = .Cells(1, ComboBox2.ListIndex * 3 + 4).Value
rs.Update
ComboBox2.ListIndex = ComboBox2.ListIndex + 1 'ругаемся тут
Next Z
ComboBox1.ListIndex = ComboBox1.ListIndex + 1 'ругаемся тут
Next i
- зациклил, все пишется как нужно, но ... ругается, как верно задать лимит? Или может что упустил?
0
шапоклякистка 8-го дня
3680 / 2240 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.11.2015, 13:03 12
А от 0 до 30 не пробовали? ))
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
06.11.2015, 13:25  [ТС] 13
Цитата Сообщение от mostApi Посмотреть сообщение
Visual Basic
1
For i = 1 To 12 'если 11 то норм, не ругается, но не дописывает одну строчку с данными
Visual Basic
1
For Z = 1 To 31 'если 30 то норм, не ругается, но не дописывает одну строчку с данными
texnik-san, пробовал, не ругается, но и не дописывает последнюю строку с данными...
Получается, мне нужно получить лимит для каждого диапазона...

Добавлено через 9 минут
Visual Basic
1
On Error Resume Next
- творит чудеса!))
Но вопрос отрыт!))
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 798
06.11.2015, 23:07 14
В цикле все та же ошибка - зачем переменные циклов, если Вы их не используете никак внутри цикла?
Я если честно все равно не понимаю - Вам одну строку все же внести надо или несколько? И что в combobox-ах хранится? Почему цикла два и при этом запись в БД производится на основании только одного из них?
То, что ругается - это правильно. У КомбоБокса с 0 начинается индексация. Следовательно лучше вообще не полагаться на константы, а использовать в цикле данные самого КомбоБокса:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Set rs = New ADODB.Recordset
rs.Open Source:=TextBox2.Value, ActiveConnection:=cn, CursorType:=adOpenStatic, LockType:=adLockOptimistic
 
For i = 0 To ComboBox1.ListCount - 1
    For Z = 0 To ComboBox2.ListCount - 1
        rs.AddNew
        rs.Fields(3) = .Cells(1, ComboBox2.List(Z) * 3 + 3).Value
        rs.Fields(4) = .Cells(1, ComboBox2.List(Z) * 3 + 4).Value
        rs.Update
        'ComboBox2.ListIndex = ComboBox2.ListIndex + 1 'ругаемся тут - потому что нафиг ненужная фигня. Я намекаю-намекаю, что надо переменные цикла использовать....
    Next Z
    'ComboBox1.ListIndex = ComboBox1.ListIndex + 1 'ругаемся тут
Next i
Так же вынес назначение rs за циклы - зачем нагружать систему созданием объекта при каждом проходе цикла, если подключение все равно одно используется и не меняется в процессе?
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
07.11.2015, 08:39  [ТС] 15
The_Prist, пока ждал Вашего ответа, сделал запись (экспорт) всей таблицы в базу по циклу..., все отлично, но с использованием пропуска ошибок... (это просто вставка новой записи в чистую БД).

Мне нужно понять - как редактировать?!
Жду помощи...
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 798
07.11.2015, 12:54 16
Цитата Сообщение от mostApi Посмотреть сообщение
Жду помощи...
А мы как должны понять как Вам редактировать, если Вы ни на один мой вопрос не ответили? Желания сидеть и гадать что Вы там в комбобоксах задаете и что откуда забираете нет ни малейшего.
0
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
09.11.2015, 08:23  [ТС] 17
The_Prist, Есть табель учета Рабочего времени... (Картинка)
ComboBox-м заганяются списки циклами по столбцу 2 и строке 10...
На основании индексов ComboBox-ов получаю координаты ячеек, и двигаюсь по ним для редактирования нужных ячеек...
На текущий момент все загнал данные циклом в базу данных, и все могу считывать с нее...
Нужна необходимость менять отдельные записи в БД.
(жирным) то что я меняю, записываю - считываю в БД, все остальное пока считаю средствами Excel.
Миниатюры
Rs.EditMode или как обновить данные в Базе Данных VBA (Excel to Access)  
0
09.11.2015, 08:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2015, 08:23
Помогаю со студенческими работами здесь

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

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

Доступ к базе данных под Access из VBA
Народ ! Объясните тупому почему из VBA под Access не могу получить доступ к открытой базе данных...

Как экспортировать данные из Excel в базу данных MS Access?
В файле Excel есть таблица с ФИО преподавателей. Нужно из этой таблицs перенести данные в базу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru