Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RecordSet зацикливание / 19 сообщений из 19, страница 1 из 1
25.04.2006, 11:05
    #33688044
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Сразу привожу код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
' делаю выборку в рекордсет
l_objRecordSetSecond.Open "SELECT owncenterid, date, state FROM " & ConnectionParam.strTJL & _
     " WHERE tableid=" & l_TableID & _
     " .AND. dbid=" & l_DBID & _
     " .AND. recid=" & l_RECID & _
     " .AND. act<>'P'" & _
     " .AND. state>=0" & _
     " .AND. owncenterid<>" & l_DBIDinPackage, _
     l_objDBCConnection, adOpenDynamic, adLockOptimistic

'...
'...
' потом при определенных условиях, если это необходимо обновляю одно поле
Do Until l_objRecordSetSecond.EOF
             l_objRecordSetSecond.Fields("state").Value = - 1 
             l_objRecordSetSecond.Update
             If (Err <>  0 ) Then
                          l_flagWasError = True
                          Err.Clear
             End If
             l_objRecordSetSecond.MoveNext
Loop


В общем почему-то при определенных условиях цикл обновления зацикливается, т.е. l_objRecordSetSecond.EOF всегда False. А в остальных случаях нет. В чем проблема пока не вижу. Может есть какой другой способ определения кол-ва записей и текущего положения указателя на запись???
...
Рейтинг: 0 / 0
25.04.2006, 11:13
    #33688084
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Do Until l_objRecordSetSecond.EOF заменить на
Do while not l_objRecordSetSecond.EOF
...
Рейтинг: 0 / 0
25.04.2006, 11:59
    #33688320
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
А зачем шило на мыло менять 8) Все равно зацикливается.
Он то зацикливается, то нет.
...
Рейтинг: 0 / 0
25.04.2006, 12:10
    #33688389
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
On Error Resume Next уберите, если он есть.
...
Рейтинг: 0 / 0
25.04.2006, 13:03
    #33688613
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Положение исправилось заменой выборки, а именно вместо определенных полей выбирал все

Было
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
' делаю выборку в рекордсет

l_objRecordSetSecond.Open "SELECT owncenterid, date, state FROM " & ConnectionParam.strTJL & _
     " WHERE tableid=" & l_TableID & _
     " .AND. dbid=" & l_DBID & _
     " .AND. recid=" & l_RECID & _
     " .AND. act<>'P'" & _
     " .AND. state>=0" & _
     " .AND. owncenterid<>" & l_DBIDinPackage, _
     l_objDBCConnection, adOpenDynamic, adLockOptimistic


Стало
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
' делаю выборку в рекордсет
l_objRecordSetSecond.Open "SELECT * FROM " & ConnectionParam.strTJL & _
     " WHERE tableid=" & l_TableID & _
     " .AND. dbid=" & l_DBID & _
     " .AND. recid=" & l_RECID & _
     " .AND. act<>'P'" & _
     " .AND. state>=0" & _
     " .AND. owncenterid<>" & l_DBIDinPackage, _
     l_objDBCConnection, adOpenDynamic, adLockOptimistic


Просто вспомнил, что уже сталкивался с этой ерундой, но как-то забыл между делом. А тут бац и ошибка вылетела, хотя до этого все работало )
Надеюсь, на этом глюков не будет.
...
Рейтинг: 0 / 0
25.04.2006, 13:57
    #33688814
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
MelkiadesOn Error Resume Next уберите, если он есть.т.е.
Код: plaintext
1.
2.
If (Err <>  0 ) Then
   Err.Clear ' !!!!!!!!!!!!!!
End If
...
Рейтинг: 0 / 0
25.04.2006, 14:17
    #33688893
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
В смысле т.е. ...
Да, в проге есть On Error Resume Next, просто писалось все это месяцев 5 назад, я тогда вообще не шарил в этом ) Походу надо выходить из цикла при условии возникновения ошибки. Какими доводами я руководствовался писав тот код уже не помню 8)
...
Рейтинг: 0 / 0
25.04.2006, 14:25
    #33688925
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Просто казалось, что если Recorset не сделает успешный Update, я отловлю эту ошибку, далее очищу объект Err, и перейду на сл. запись, которую тоже попытаюсь модифицировать, и так пока все записи не будут обработаны.
Поэтому и On Error Resume Next и эта проверка.
...
Рейтинг: 0 / 0
25.04.2006, 14:28
    #33688934
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Do Until l_objRecordSetSecond.EOF
l_objRecordSetSecond.Edit
l_objRecordSetSecond.Fields("state").Value = -1
l_objRecordSetSecond.Update
If (Err <> 0) Then
l_flagWasError = True
Err.Clear
End If
l_objRecordSetSecond.MoveNext

Loop
...
Рейтинг: 0 / 0
25.04.2006, 14:37
    #33688971
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Такого метода у моего рекорсета нет - l_objRecordSetSecond.Edit ;)

В общем суть происходящего я так и не понял, хотя и решил проблему. Но это все заставляет призадуматься, - "А будет ли в дальнейшем работать?"
...
Рейтинг: 0 / 0
25.04.2006, 14:54
    #33689016
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
В обработчике надо ставить Resume
Иначе, после ошибки в рекордсете, MoveNext просто не сработает.
...
Рейтинг: 0 / 0
25.04.2006, 14:56
    #33689020
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
M0r0Такого метода у моего рекорсета нет - l_objRecordSetSecond.Edit ;)

В общем суть происходящего я так и не понял, хотя и решил проблему. Но это все заставляет призадуматься, - "А будет ли в дальнейшем работать?"
а нуда это же ADO а не DAO
...
Рейтинг: 0 / 0
25.04.2006, 15:46
    #33689184
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Положите на форму два лабела, два текстбокса и кнопку
И погоняйте программу по F8. Тогда все станет ясно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Private Sub Command1_Click()
   Dim i As Long
   On Error GoTo Err1
   i = Text1.Text
   Label1 = i
   GoTo EndErr1
Err1:
'Такой алгоритм предусмотрен разработчиками языка:
'   Text2 = 0   'Исправляем источник ошибки
'   MsgBox Err.Description, vbExclamation
'   Resume      'и идем назад, к строке что вызвала ошибку.
'Но мы делаем по-другому, корча из алгоритма структурную обработку ошибки
   Label1.Caption = "Ошбика!"
   Resume EndErr1   'Ничего не делать, идем дальше
EndErr1:
   On Error GoTo Err2
   i = Text2.Text
   Label2 = i
   GoTo EndErr2
Err2:
'А можно и так обрабатывать:
   i =  0 
   MsgBox Err.Description & vbCrLf & "Значение проигнорировано!", vbExclamation
'т.е. исправляем ошибку и продолжаем выполнение со следующей строки
   Resume Next
'   Resume EndErr2      'хотя, мне и здесь хочется сделать как раньше
EndErr2:
End Sub
...
Рейтинг: 0 / 0
25.04.2006, 16:14
    #33689286
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
вместо текстбоксов и лайблов можно использовать Debug.Print
и смотреть результат в окне отладки
...
Рейтинг: 0 / 0
25.04.2006, 16:32
    #33689355
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Попробую, но уже завтра, т.к. рабочий день ви енд 8)
...
Рейтинг: 0 / 0
26.04.2006, 09:15
    #33690508
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
M0r0
а какие индексы есть на таблице?

и лучше не используйте adOpenDynamic
...
Рейтинг: 0 / 0
26.04.2006, 12:52
    #33691379
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
Индексов на этой таблице нет вообще. adOpenDynamic нужна так как надо сразу же видеть изменения. В общем проблему решил и остановлюсь на этом решении, а дальше видно будет ;)
...
Рейтинг: 0 / 0
26.04.2006, 12:55
    #33691398
M0r0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
В догонку. Resume тоже не исправляет положение, Recordset все равно остается слепым как крот и не видет количества своих записей, а также не может взвести флаг EOF . Но это все так послесловие.
...
Рейтинг: 0 / 0
26.04.2006, 13:57
    #33691695
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RecordSet зацикливание
M0r0В догонку. Resume тоже не исправляет положение, Recordset все равно остается слепым как крот и не видет количества своих записей, а также не может взвести флаг EOF . Но это все так послесловие.
Измените тип курсора у l_objDBCConnection с серверного на клиентский.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RecordSet зацикливание / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]