IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   VBA, Access, MSDN и прочие неприятности (http://www.imho.ws/showthread.php?t=93698)

Raven B. 05.10.2005 00:18

VBA, Access, MSDN и прочие неприятности
 
Доброго времени суток.

Есть access и база данных в нем. Точнее пока ее нет. Но будет.
В форме есть незамысловатый контрол - TextBox.
Еще там есть строка ввода и кнопка.
При загрузке формы в TextBox грузится содержимое столбца таблицы.
По нажатии кнопки в эту таблицу добавляется то что в строке ввода.
Естественно надо обновиьт содержимое TextBox. Вот тут у меня ступор.
Никаких тебе рефрещей. Только какой то подозрительный .Requery.

Естественное решение вопроса - открываем MSDN и смотрим. Вот тут и появляется целый ряд вопросов:

1. В MSDN я не нашол у TextBox такого метода. Его нет. Такого метода вообще нет. Фильтровал по Visual Basic. Искал по TextBox и .Requery. MSDN за апрель 2003. В MSDN что информации о классах VBA нет ?

2. Есль ли какой то специализированый форум по VBA. А еще лутше по VBA и Access ? Вопросов у меня судя по всему будет много...

3. Как эту гадость обновлять то ?

На всяк случай привожу текущий код формы:

Код:

Option Compare Database

Private Sub proff_in_b_Click()
On Error GoTo Err_proff_in_b_Click

 Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
 Const DataSource = "Data Source=com_db.mdb"
 Dim Connection As New ADODB.Connection
 Dim RecordSet As New ADODB.RecordSet
 Dim qwery As String
 On Error GoTo Finally
 Call Connection.Open(Provider & DataSource)
 MsgBox "connected"
 proff_in.SetFocus
 qwery = "INSERT INTO proff_T (proff) values (" + proff_in.Text + ")"
 Call RecordSet.Open("proff_t", Connection, adOpenKeyset, adLockOptimistic)
 Call RecordSet.AddNew("proff", proff_in.Text)
 
 RecordSet.Close
 Connection.Close
 
 proff_list.Requery
 
 

Finally:
 If (Err.Number <> 0) Then
 MsgBox Err.Description
 End If
    DoCmd.GoToRecord , , acNewRec

Exit_proff_in_b_Click:
    Exit Sub

Err_proff_in_b_Click:
    MsgBox Err.Description
    Resume Exit_proff_in_b_Click
   
End Sub

Private Sub proff_del_b_Click()
On Error GoTo Err_proff_del_b_Click


    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70

Exit_proff_del_b_Click:
    Exit Sub

Err_proff_del_b_Click:
    MsgBox Err.Description
    Resume Exit_proff_del_b_Click
   
End Sub
Private Sub proff_upd_b_Click()
On Error GoTo Err_proff_upd_b_Click


    DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70

Exit_proff_upd_b_Click:
    Exit Sub

Err_proff_upd_b_Click:
    MsgBox Err.Description
    Resume Exit_proff_upd_b_Click
   
End Sub

При этом на http://msdn.microsoft.com/archive/de.../D6/S5B1DB.asp
метод вроде нашло.
Что то я ничего не понял...

Raven B. 05.10.2005 01:42

Сходу еще один вопрос.
Не бейте сильно :
Как и где тут обьявитьглобальную переменную ?
Хотелось бы соединятся с базой ОДИН раз при загрузке формы, ане каждый раз когда кнопку жмут. ибо последнее - бред.

НО при этом

Код:

Private Sub Form_Load()
 Global Connection As New ADODB.Connection
 Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
 Const DataSource = "Data Source=com_db.mdb"
 Connection.Open (Provider & DataSource)

 On Error GoTo Finally

Exit Sub

Finally:
 If (Err.Number <> 0) Then
 MsgBox Err.Description
 End If
    DoCmd.GoToRecord , , acNewRec
End Sub

Выдает ошибку. Говорит что нельзя обявлять глобальные переменные в методах контролов. насколько я понял. Так где же их обьявлять то ?
Если вынести процедуру в модуль то обьявление ошибки не выдает, но переменную из другого модуля не видно....

npoka3a 05.10.2005 19:03

А сделать в проекте файл типа класс не пробовал?

Raven B. 05.10.2005 19:17

Нет. А как это применимо в данном случае ?
В том смысле что зачем мне новый класс ?

Это относится к какой из проблем :
1. Обновление TextBox.
2. Создание глобальной переменной ?

Очень надеюсь на ваши пояснения. :beer:
А то :help:

С уважением. Ворон.

Al-x 05.10.2005 21:39

Глобальные переменные в VBA (если я правильно помню:)) объявляются вне процедуры так:
Код:

Public VarName As String
А по поводу Requery (в принципе) - а как иначе получить измененные данные из таблицы, если не выполнить запрос ешё раз? Можно конечно proff_list.Text = proff_in.Text, но это уже совсем из другой оперы...

Raven B. 06.10.2005 02:25

Public VarName As String
- сейчас попробую.

А по поводу Requery (в принципе) - а как иначе получить измененные данные из таблицы, если не выполнить запрос ешё раз?
-Никак. По логике должно работать. Но не работает. Не обновляется TextBox с таким кодом. Точнее обновляется но с "задержкой". Тоесть:

1. Нажал на кнопку. видимого эффекта нет.
2. Нажал еще раз появилось то что сохранил в прошлый раз.
3. Нажал еще раз появилось то что сохранил в прошлый раз.

Тоесть

RecordSet.Close
Connection.Close
proff_list.Requery

Нехватает. Нужно еще чего то. Но что ?

Raven B. 06.10.2005 14:07

На
Цитата:

Private Sub Form_Load()
Public Connection As New ADODB.Connection
Ругается что:
Цитата:

Invalid attribute in Sub function

Al-x 06.10.2005 18:38

Попробуй так (объявит глобальную переменную вне процедуры):
Код:

Public Connection As Variant
Private Sub Form_Load()
 Set Connection = New ADODB.Connection
 Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
 Const DataSource = "Data Source=com_db.mdb"
 Connection.Open (Provider & DataSource)

 On Error GoTo Finally

Exit Sub

Finally:
 If (Err.Number <> 0) Then
 MsgBox Err.Description
 End If
    DoCmd.GoToRecord , , acNewRec
End Sub

ИМХО, использовать связанные таблицы проще, чем подключать их "руками".

По поводу обновления - сейчас уже и не вспомню почему так делал, но когда мне надо было обновить список я делал так (strFilter - SQL запрос):
Код:

    If SysCmd(acSysCmdGetObjectState, acForm, "frmExportWord") Then _
    Forms!frmExportWord.lbxDatalist.RowSource = strFilter


Raven B. 07.10.2005 01:25

1. Не помогло. Не видит оно этой переменной.
2. Не ругалось, о и не работало. К своему стыду вынужден заметить что не понял что и как оно должно было сделать...

Al-x 07.10.2005 10:28

С Public... я пробовал в Access 2003 - у меня он переменную видел.
Обновление скопировал из одного старого проекта.
Можешь базу выложить (2 файла - com_db.mdb и другой *.mdb в котором код)? Или там один файл?

Raven B. 07.10.2005 17:33

Там один файл.
Сейчас еще раз попробую с public...
Вроде все зделал как ты посоветовал...

Al-x 07.10.2005 21:37

Цитата:

Raven B.:
Там один файл
Тогда зачем к нему коннект создавать? Можно просто с локальными талицами работать например так:
Код:

Private Sub proff_in_b_Click()
 Dim qwery As String
 On Error GoTo Finally

 proff_in.SetFocus
 qwery = "INSERT INTO proff_T ( proff ) VALUES ('" + proff_in.Text + "');"
 DoCmd.RunSQL (qwery)
 
 proff_list.Requery
End Sub


Raven B. 12.10.2005 22:58

Спасибо.
ОБНОВЛЕНИЕ РАБОТАЕТ !!!!
проблема похоже было в использованиии ADO/
Но конечно лутше без ADO. Просто во всех книгах которые мне в руки попадали я сталкивался только с соединением через ADO и DAO. А appliction для Access нигде описано не было. =(
Правда появились вопросы по DoCmd.RunSQL =(
Изложил в новой теме так как вроде бы к этой не относятся.


Часовой пояс GMT +4, время: 21:36.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.