Непонятная проблема с ЯнусГридом

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Непонятная проблема с ЯнусГридом

Сообщение alibek » 03.07.2006 (Пн) 16:36

Какая-то непонятность с ним возникает.

Вот есть у меня основная форма, на форме размещен JanusGrid. В форме есть такой код:
Код: Выделить всё
...
  Set cmd = New ADODB.Command
  cmd.CommandType = adCmdStoredProc
  cmd.CommandText = "qCardData_GetByID"
  cmd.Parameters.Append cmd.CreateParameter("varCardID", adInteger, adParamInput, , ID)
  Set cmd.ActiveConnection = objConnection
  Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseServer
  rs.CursorType = adOpenKeyset
  rs.LockType = adLockReadOnly
  rs.Open cmd
  Set cmd = Nothing
  grdCardData.HoldFields
  grdCardData.HoldSortSettings = True
  Set grdCardData.ADORecordset = rs
...


Код работает, грид отображает данные.

Есть другая форма, открываемая из основной. В ней тоже есть грид и используется такой код:
Код: Выделить всё
Private Sub RefreshGrid()
Dim rs As ADODB.Recordset, cmd As ADODB.Command
If varCardID = 0 Then
  grdDetails.HoldFields
  grdDetails.HoldSortSettings = True
  Set grdDetails.ADORecordset = Nothing
Else
  Set cmd = New ADODB.Command
  cmd.CommandType = adCmdStoredProc
  cmd.CommandText = "qCardData_GetByID"
  cmd.Parameters.Append cmd.CreateParameter("varCardID", adInteger, adParamInput, , varCardID)
  Set cmd.ActiveConnection = objConnection
  Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseClient
  rs.CursorType = adOpenKeyset
  rs.LockType = adLockReadOnly
  rs.Open cmd
  Set cmd = Nothing
  Set rs.ActiveConnection = Nothing
  grdDetails.HoldFields
  grdDetails.HoldSortSettings = True
  Set grdDetails.ADORecordset = rs
  grdDetails.LoadEntireRecordset
  Set rs = Nothing
End If
RefreshTotals
End Sub


Этот код тоже работает и отображает данные.

Глюк тут в следующем.
После того, как я из основной формы открыл вспомогательную, код в основной форме выдает ошибку:
Код ошибки: -2147467259 ( 0x80004005 ) , 0 ( 0x00000000 )
Неопознанная ошибка
Источник ошибки: Microsoft JET Database Engine
Состояние SQL: 3219

Код ошибки: -2147467259 ( 0x80004005 ) , -85919008 ( 0xFAE0FAE0 )
Недопустимая операция.
Источник ошибки: Microsoft JET Database Engine
Состояние SQL: 3219

Код ошибки: -2147467259 ( 0x80004005 ) , -85919008 ( 0xFAE0FAE0 )
Недопустимая операция.
Источник ошибки: Microsoft JET Database Engine
Состояние SQL: 3219


Причем, эта ошибка постоянная, т.е. после перезапуска программы она не исчезает.
Она исчезает только если этот параметрический запрос выполнить в Access.
После запуска запроса из Access код из основной формы снова работает, до тех пор, пока не вызовется вспомогательная форма.

В чем собака зарыта?
Виноват наверняка ЯнусГрид, но не пойму, что ему не нравится.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.07.2006 (Пн) 16:56

Вести с полей.
Если в основной форме использовать клиентский курсор, а не серверный, то ошибки не возникает.
Но все-таки интересно, из-за чего она возникает.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Непонятная проблема с ЯнусГридом

Сообщение Andrey Fedorov » 04.07.2006 (Вт) 8:51

alibek писал(а):Виноват наверняка ЯнусГрид, но не пойму, что ему не нравится.


Виноват не он и это практически точно. Ошибка ведь Jet-a.

Вообще вся его (Grid-a) функция сводится лишь к чтению нужных записей переданного тобой Recordset-a - он ведь не открывает его заново. Похоже что-то случается именно с твоим Recordset-ом, но что сказать из приведенного кода сложно - непонятно собственно взаимодействие форм - вот если бы ты смог сваять примитивный примерчик с какой-либо простенькой базой в комплекте, чтобы его можно было глянуть...

На какой хоть строке у тебя все валится?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.07.2006 (Вт) 10:42

Валится в основной программе, на строчке rs.Open cmd
Как бы дико это не звучало, но у меня такое впечатления, что сабж возникает из-за того, что при повторном отрытии (когда первый рекордсет серверный, а второй клиентский) меняются флаги сохраненного запроса и он перестает считаться adCmdStoredProc. А при повторном открытии в Access тот автоматически исправляет флаги.
Примерчик сейчас накидаю.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.07.2006 (Вт) 11:13

Вот.
Запусти, походи по первому гриду.
Затем нажми кнопку.
После этого попробуй еще раз походить по первому гриду.
Эффект сохраняется и после перезапуска программы.
Открытие запроса qCardInfo в Access исправляет ошибку.
У вас нет доступа для просмотра вложений в этом сообщении.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.07.2006 (Вт) 12:31

alibek писал(а):Открытие запроса qCardInfo в Access исправляет ошибку.


Да... Интересный глючок. Чего ради вьюшка Access-a то модифицируется, кстати?

Кстати, замени в первой форме:

Код: Выделить всё
Private Sub RefreshInfo()
    Dim cmd As New ADODB.Command
    With cmd
        .CommandType = adCmdStoredProc
        .CommandText = "qCardData"
        .Parameters.Append .CreateParameter("varCardID", adInteger, adParamInput, , CLng(GridEX1.Value(4)))
        Set .ActiveConnection = objConnection
    End With
   
    With GridEX2
        .HoldFields
        .HoldSortSettings = True
        Set .ADORecordset = cmd.Execute
    End With
End Sub


И все будет работать, да и проще заодно...

Кстати, я как-то больше прывык всегда выполнять cmd через Execute, а не через Open. Так что можешь везде сделать аналогично ;) :wink:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.07.2006 (Вт) 12:46

А вот целиком поправленный проект - кода, согласись, заметно меньше, а делается то-же самое...
У вас нет доступа для просмотра вложений в этом сообщении.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.07.2006 (Вт) 15:22

В Recordset.open <ADODB.Command> (вместо Set Recordset = Command.Execute) есть определенный смысл, если нужно сохранить некоторые параметры рекордсета, которые в других случаях сбрасываются.
Заменять не буду :)
Во-первых, проблема решается выставлением клиентского курсора для обоих гридов, во-вторых, возможно я захочу использоваться отвязанные рекордсеты.

Пример сейчас погляжу.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.07.2006 (Вт) 17:48

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


С Execute все пвышенаписанное прекрасно делается... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList