|
|
|
|
dem |
Вторник, 13 Декабря 2005, 15:11
|
Участник
Профиль
Группа: Участник
Сообщений: 95
Регистрация: 09.04.2002
Пользователь №: 1853
Конфигурация
Корпус: -- Процессор: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: -- CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Срочно нужна помощь полному чайнику. Программа для Exel. Необходимо, чтобы в первом случае по нжатии кнопки открывалась форма, заполнялись поля часть из записей Access, часть вручную, по нажатию кнопки, данные обрабатываются и заносятся обратно в таблицы Access. Во втором случае данные заносятся в Вордовский файл. Теперь коды Код раздела General Dim bd1 As DAO.Database Dim s1 As String, s2 As String, s3 As String Dim r1 As Recordset, r2 As Recordset, r3 As Recordset, r4 As Recordset Dim k1 As String, k2 As String, k3 As String, k4 As String //объявление используемых переменных в общем разделе, так как они будут использоваться в нескольких процедурах Код для первого случая
Private Sub ComboBox1_Click() Set bd1 = OpenDatabase("d:\w\db1.mdb") k1 = ComboBox1.Text s1 = "select*from[Товары] where [Товар]= """ & k1 & """" Set r1 = bd1.OpenRecordset(s1) TextBox3.Text = r1!Количество TextBox4.Text = Format((r1!Стоимость) / (r1!Количество), "#########") End Sub
Private Sub CommandButton1_Click() With r1 .Edit (Вылетает ошибка 424) !Количество = !Количество + Val(TextBox1.Text) !Стоимость = !Стоимость + Val(TextBox1.Text) * Val(TextBox2.Text) .Update End With Для второго случая Private Sub CommandButton1_Click() Dim bd1 As DAO.Database Dim r1 As Recordset Dim e1 As Word.Application Dim k As String, s As String, m As String Set bd1 = OpenDatabase("d:\w\db1.mdb") Set e1 = CreateObject("Word.Application") e1.Documents.Open Filename:="d:\w\recl.doc" k = UserForm3.ComboBox1.Text s = "Select * From [Товары] Where [Товар]="" &k& """ Set rl = bd1.OpenRecordset(s) m = InputBox("Введите цену товара") e1.Application.Visible = True e1.WindowState = wdWindowStateMaximize e1.Documents("recl").TextBox2.Text = m e1.Documents("recl").TextBox3.Text = r1!Описание (ошибка 91) e1.Documents("recl").TextBox1.Text = r1!Товар End Sub Так в чем же ошибки?
|
|
|
|
|
Ответы
(1 - 9) |
Levon |
Вторник, 13 Декабря 2005, 15:45
|
Участник
Профиль
Группа: Участник
Сообщений: 780
Регистрация: 16.09.2003
Из: Ереван, Армения
Пользователь №: 5872
Конфигурация
Корпус: HP Материнская плата: -- Оперативная память: 512 Мб Видеокарта: Intel(R) 82865G Graphics Controller Жесткий диск (винчестер): WDC WD400BB-60DGA0 37.27 GB (40 015 503 360 bytes) Дисковод: 3.5" CD/DVD: CD Модем: -- Сетевой адаптер: 3Com 3C905TX-based Ethernet Adapter (Generic), Broadcom NetXtreme Gigabit Ethernet for hp Звуковая плата: SoundMAX Integrated Digital Audio Монитор: LCD HP 1730, 19" Операционная система: Windows XP Pro SP1, Winsows 2000 AS SP4, FreeBSD 5.2.1 Прочее: --
|
Сделай вначале On Erroro goto er
затем где нибудь в конце er: MsgBox err.Description
Хоть будешь знать побольше об ошибке ......
--------------------
- Никогда не стоит недооценивать предсказуемость глупости. "Большой Куш/Sntach"
|
|
|
|
|
dem |
Вторник, 13 Декабря 2005, 16:10
|
Участник
Профиль
Группа: Участник
Сообщений: 95
Регистрация: 09.04.2002
Пользователь №: 1853
Конфигурация
Корпус: -- Процессор: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: -- CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Ничего, кроме названий ошибок "Object required " для 424 и "Object variable or With block variable not set" для 91 не показал.
|
|
|
|
|
Квазимодо |
Вторник, 13 Декабря 2005, 16:42
|
Участник
Профиль
Группа: Участник
Сообщений: 162
Регистрация: 25.11.2003
Пользователь №: 6223
Конфигурация
Корпус: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: Нет дисковода CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Извините за чайниковские вопросы, но: 1. А объект r1 к моменту нажатия кнопки CommandButton1 определен? Просто в программе выборка из базы повешена на ComboBox1_Click, а если на этот список не нажимали, то... 2. Цитата Set rl = bd1.OpenRecordset(s) - это неправильно сюда перенеслось или опечатка в программе? Переменная rl (в отличие от r1) нигде не определяется.
--------------------
Я долго учился на чужих ошибках, и теперь мои собственные ошибки не хуже, чем у других.
|
|
|
|
|
Levon |
Вторник, 13 Декабря 2005, 16:45
|
Участник
Профиль
Группа: Участник
Сообщений: 780
Регистрация: 16.09.2003
Из: Ереван, Армения
Пользователь №: 5872
Конфигурация
Корпус: HP Материнская плата: -- Оперативная память: 512 Мб Видеокарта: Intel(R) 82865G Graphics Controller Жесткий диск (винчестер): WDC WD400BB-60DGA0 37.27 GB (40 015 503 360 bytes) Дисковод: 3.5" CD/DVD: CD Модем: -- Сетевой адаптер: 3Com 3C905TX-based Ethernet Adapter (Generic), Broadcom NetXtreme Gigabit Ethernet for hp Звуковая плата: SoundMAX Integrated Digital Audio Монитор: LCD HP 1730, 19" Операционная система: Windows XP Pro SP1, Winsows 2000 AS SP4, FreeBSD 5.2.1 Прочее: --
|
У тебя обект r1 создается после того когда ты кликаешь на комбобоксе ...... Set r1 = bd1.OpenRecordset(s1) Перед тем как нажать на Кнопку ... ты всегда кликаешь Комбобокс ... ??? во втором случае .... посмотри получше что ты открываешь .. Set r l = bd1.OpenRecordset(s) a затем что ты используешь e1.Documents("recl").TextBox3.Text = r 1!Описание Добавлено Levon, Квазимодо, -2 минуты ... :-)
--------------------
- Никогда не стоит недооценивать предсказуемость глупости. "Большой Куш/Sntach"
|
|
|
|
|
dem |
Вторник, 13 Декабря 2005, 17:47
|
Участник
Профиль
Группа: Участник
Сообщений: 95
Регистрация: 09.04.2002
Пользователь №: 1853
Конфигурация
Корпус: -- Процессор: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: -- CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Напоминаю, помощь нужна полному чайнику, так что извините, если вопросы покажутся глупыми. Цитата Перед тем как нажать на Кнопку ... ты всегда кликаешь Комбобокс ... ??? Я не совсем разобрался в терминологии, но похоже, что да, и что мне делать( По второму, l на 1 исправил, но ошибка осталась, правда теперь 13 "Type mismatch " Сообщение отредактировал dem - Вторник, 13 Декабря 2005, 17:52
|
|
|
|
|
Levon |
Среда, 14 Декабря 2005, 8:16
|
Участник
Профиль
Группа: Участник
Сообщений: 780
Регистрация: 16.09.2003
Из: Ереван, Армения
Пользователь №: 5872
Конфигурация
Корпус: HP Материнская плата: -- Оперативная память: 512 Мб Видеокарта: Intel(R) 82865G Graphics Controller Жесткий диск (винчестер): WDC WD400BB-60DGA0 37.27 GB (40 015 503 360 bytes) Дисковод: 3.5" CD/DVD: CD Модем: -- Сетевой адаптер: 3Com 3C905TX-based Ethernet Adapter (Generic), Broadcom NetXtreme Gigabit Ethernet for hp Звуковая плата: SoundMAX Integrated Digital Audio Монитор: LCD HP 1730, 19" Операционная система: Windows XP Pro SP1, Winsows 2000 AS SP4, FreeBSD 5.2.1 Прочее: --
|
Ну для первого случая можешь добавить в процедуру кликания кнопки вот эти строки Set bd1 = OpenDatabase("d:\w\db1.mdb") k1 = ComboBox1.Text s1 = "select*from[Товары] where [Товар]= """ & k1 & """" Set r1 = bd1.OpenRecordset(s1) TextBox3.Text = r1!Количество TextBox4.Text = Format((r1!Стоимость) / (r1!Количество), "#########") они из процедуры кликания комбобокса ....
А для второго случая ошибка вылетает на прежнем месте ... ??
--------------------
- Никогда не стоит недооценивать предсказуемость глупости. "Большой Куш/Sntach"
|
|
|
|
|
dem |
Среда, 14 Декабря 2005, 15:19
|
Участник
Профиль
Группа: Участник
Сообщений: 95
Регистрация: 09.04.2002
Пользователь №: 1853
Конфигурация
Корпус: -- Процессор: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: -- CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Да, спасибо, этот момент я просек, исправил и этот блок заработал, но начали сыпаться ошибки при попытке записи в другу таблицу акцесса: Set r4 = bd1.OpenRecordset("Контракты") With r4 .AddNew .Bookmark = .LastModified !Товар = k1 !Фирма = k2 !Динамика = "Поставка" !Количество = TextBox1.Text !Цена = TextBox2.Text !Дата = Date !Сотрудник = ComboBox3.Text .Update End With В таком виде на строке !Товар = k1 дает ошибку 3020 (Вызов метода Update или CancelUpdate без предварительного вызова метода AddNew или Edit), я попробовал убрать .Bookmark = .LastModified (как я понял он отменяет действие метода .AddNew), за что был естесственно вознагражден на предпоследней строке сообщением об ошибке 3058 (Индекс или ключ не может содержать пустое значение (Null)). Цитата А для второго случая ошибка вылетает на прежнем месте ... ?? Да, она на той же строке e1.Documents("recl").TextBox3.Text = r1!Описание
|
|
|
|
|
Levon |
Среда, 14 Декабря 2005, 16:24
|
Участник
Профиль
Группа: Участник
Сообщений: 780
Регистрация: 16.09.2003
Из: Ереван, Армения
Пользователь №: 5872
Конфигурация
Корпус: HP Материнская плата: -- Оперативная память: 512 Мб Видеокарта: Intel(R) 82865G Graphics Controller Жесткий диск (винчестер): WDC WD400BB-60DGA0 37.27 GB (40 015 503 360 bytes) Дисковод: 3.5" CD/DVD: CD Модем: -- Сетевой адаптер: 3Com 3C905TX-based Ethernet Adapter (Generic), Broadcom NetXtreme Gigabit Ethernet for hp Звуковая плата: SoundMAX Integrated Digital Audio Монитор: LCD HP 1730, 19" Операционная система: Windows XP Pro SP1, Winsows 2000 AS SP4, FreeBSD 5.2.1 Прочее: --
|
А может у тебя несоответствие данных ... ? К примеру тип поля "Товар" - текстовый ... ? Или все-таки числовой ... ? Кстати .. ты все поля заполнеяшь .. ? так как Цитата(dem @ Сегодня, 16:19) Индекс или ключ не может содержать пустое значение (Null) говорит о том что ты даешь значения не всем полям ...... Попробуй ка ты лучше добавить новую строку таким образом ... Set r4 = bd1.OpenRecordset("Контракты") р4.execute "INSERT INTO Контракты(Товар,Фирма, Динамика , и тд.) VALUES (" & k1 & ", " & k2 & ")" и тд ...... Этот куд работает с таблицей напрямую ..... соответственно - быстрее .... может он прокатит без проблемм ..... Но на всякий .. проверь поля которые обязательны для заполнения ... в частности ключевой эллемент таблицы ... как он пулучает значения ... Автонумерация, или вручную ..... ??
--------------------
- Никогда не стоит недооценивать предсказуемость глупости. "Большой Куш/Sntach"
|
|
|
|
|
dem |
Четверг, 15 Декабря 2005, 11:59
|
Участник
Профиль
Группа: Участник
Сообщений: 95
Регистрация: 09.04.2002
Пользователь №: 1853
Конфигурация
Корпус: -- Процессор: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: -- CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --
|
Большое спасибо за подсказки, все работает, за одним небольшим недостатком. Первый раз все записи заносятся куда надо, вносятся изменнения, но при попытке повторного изменения выдает ошибку 3022 (Изменения не были успешно завершены из-за повторяющихся значений в индексе, ключевых полях или связях). Дело в том, что, как я понял, в блоке
Set r4 = bd1.OpenRecordset("Контракты") With r4 .AddNew .Bookmark = .LastModified !Товар = k1 !Фирма = k2 !Динамика = "Поставка" !Количество = TextBox1.Text !Цена = TextBox2.Text !Дата = Date !Сотрудник = ComboBox3.Text .Update End With
метод .Bookmark = .LastModified отвечает за то, чтобы запись была внесена в конец таблицы, соответственно, ключевому полю присваивается номер после предыдущей. Но при использовании данного метода в таком виде перестает работать связка .AddNew ... .Update. Если этот метод убрать, то получается та самая ошибка 3022 при последующей записи (если конечно не исправлять ключ вручную) Как выйти из этой ситуации?
|
|
|
|
|
|
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
|
0 Пользователей:
|
© Copyright by WinCity.Ru 2001 - 2008 | Обратная связьУслуги веб-хостинга предоставлены компанией MTW.RU
|
|
|
|