Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Моя функция возвращает рекордсет, который присваиваю в качестве источника формы. Все работает. Но стоит перейти на другую форму, данные в форме исчезают - отображается #Name?
В чем причина?

Вот как присваиваю
    Set f = Screen.ActiveForm.Controls("ActivitiesList")
    Set f.Form.Recordset = Module1.ActivitySearch(dateFrom, dateTill, types, Status, accountID, group)

Вот моя функция
Public Function ActivitySearch(StartDate As Date, endDate As Date, types As String, Status As String, _
        Account As Integer, group As String) As Recordset
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    Dim rst
    With cmd
        .CommandText = "dbo.xActivitySearch"
        .CommandType = adCmdStoredProc
        .ActiveConnection = CurrentProject.Connection
        '.Parameters.Append .CreateParameter("@return", adInteger, adParamReturnValue, 0)
        .Parameters.Append .CreateParameter("@startDate", adDate, adParamInput, , StartDate)
        .Parameters.Append .CreateParameter("@endDate", adDate, adParamInput, , endDate)
        .Parameters.Append .CreateParameter("@type", adVarWChar, adParamInput, 100, types)
        .Parameters.Append .CreateParameter("@status", adVarWChar, adParamInput, 100, Status)
        .Parameters.Append .CreateParameter("@accountID", adInteger, adParamInput, , Account)
        .Parameters.Append .CreateParameter("@group", adVarWChar, adParamInput, 100, group)
        Set rst = .Execute
    End With
    Set ActivitySearch = rst
 End Function
31 окт 06, 16:03    [3336540]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
... As DAO.Recordset или
... As ADODB.Recordset ?
а в коде нигде не закрываешь его случайно?
_____________________________________
Мое конг-фу сильнее твоего
31 окт 06, 16:30    [3336813]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
У меня ADP проект. Это ADO? :)
Нигде не закрываю!
31 окт 06, 16:38    [3336911]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
aleks2
Guest
А проще нЭ пробовали?

Set f = Screen.ActiveForm.Controls("ActivitiesList")
f.Form.RecordSource = "dbo.xActivitySearch" _
    +" @startDate="+Cstr(dateFrom) _
    +", @endDate ="+... 
31 окт 06, 18:34    [3337824]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Поправка: Cstr(dateFrom) -> см. форматирование дат для скуля в факе.
1 ноя 06, 08:41    [3338817]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
aleks2
А проще нЭ пробовали?

Попробовал:
    s = "dbo.xActivitySearch" _
        + " @startDate=#" + Format(dateFrom, "mm/dd/yy") + "#" _
        + ", @endDate=#" + Format(dateTill, "mm/dd/yy") + "#" _
        + ", @type='" + types + "'" _
        + ", @status='" + Status + "'" _
        + ", @accountID=" + LTrim(RTrim(Str(accountID))) _
        + ", @group='" + group + "'"
f.Form.RecordSource = s
формируется строка
"dbo.xActivitySearch @startDate=#11/01/05#, @endDate=#11/01/06#, @type='325 ', @status='323 322 ', @accountID=0, @group='a'"

Вываливается ошибка:
The expression you entered refers to an object that is closed or doesn't exists

Хотя процедура точно существует, т.к. если задать только
s = "dbo.xActivitySearch"
, то идет запрос параметров
1 ноя 06, 11:23    [3339757]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Ну что же делать!?
1 ноя 06, 15:44    [3342296]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27549
Denis Bondar
Ну что же делать!?
В параметрах @type и @status заметны пробелы в конце строки, а в @accountID вы их удаляете: LTrim(RTrim(Str(accountID)). Не может быть, что @Type и @status тоже требуют очистки от концевых пробелов?
1 ноя 06, 17:15    [3343208]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27549
И еще одно замечание. Для слияния строк вы пользуетесь оператором "+", но! Если хотя бы одно из составлющих имеет пустое значение, то и вся строка будет пустой. Для слияния лучше использовать амперсанд "&".
1 ноя 06, 18:17    [3343731]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Спасибо за замечания!

Ни @type Ни @status не требуют отчиски хвостовых пробелов. A @accountID - поле цифровое, и автоматически отчистил его от пробелов.

Пустых значений быть не может - такова логика приложения
1 ноя 06, 19:03    [3343925]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
prustr
Member

Откуда: C-Петербург
Сообщений: 954
Денис, непонятно у тебя заработало?
По идее не должно.
Ты присваиваешь рекордсету значение локальной перемоенной функции.
Пока стек не засорен, ты видишь эти данные, потом нет...
Надо создать переменную рекордсет в области видимости вызывающей процедуры
2 ноя 06, 01:55    [3344783]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
prustr
Денис, непонятно у тебя заработало?
По идее не должно.
Ты присваиваешь рекордсету значение локальной перемоенной функции.
Пока стек не засорен, ты видишь эти данные, потом нет...
Надо создать переменную рекордсет в области видимости вызывающей процедуры


Не работает! :(
Попытался создать переменную в области видимости - не помогло. Где-то чего-то не допонимаю :)
создал переменную в форме, в которой отображается рекордсет
Public rstSearchRes As New Recordset
изменил присваивание:
    Set Form_ActivitiesSearchResultA.rstSearchRes = Module1.ActivitySearch(dateFrom, dateTill, types, Status, accountID, group)
    Set f.Form.Recordset = Form_ActivitiesSearchResultA.rstSearchRes
Не помогает!
И со стеком не понятно! Почему он засоряется, если у меня ссылка на рекордсет есть?!
2 ноя 06, 11:09    [3345871]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Я имел в виду ссылка на рекорсет в
f.Form.Recordset 
2 ноя 06, 11:11    [3345892]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
prustr
Member

Откуда: C-Петербург
Сообщений: 954
Попробуй объявить переменную rst в Форме.
Убери
Dim rst
из функции.
Тогда новый экземпляр rst будет создаваться в области видимости формы и жить пока форма жива
А так у тебя
Public rstSearchRes As New Recordset
уже создан экземпляр без ничего, потом ты просто ссылку меняешь, суть та же -- истинный рекордсет лежит в стеке функции и умирает вместе с закрытием функции, но ты его некоторое время видишь, ибо стек еще не затерт
2 ноя 06, 11:24    [3345994]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
prustr
Member

Откуда: C-Петербург
Сообщений: 954
Да, и тогда тебе надо убрать возврат из функции рекордсета, возвращай например признак, что все ОК
2 ноя 06, 11:31    [3346055]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Попробовал - не получается :(
Что то я перемудрил...

Вот еще раз весь код.

В модуле Module1
Public Sub ActivitySearch(StartDate As Date, endDate As Date, types As String, Status As String, _
        Account As Integer, group As String)
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    With cmd
        .CommandText = "dbo.xActivitySearch"
        .CommandType = adCmdStoredProc
        .ActiveConnection = CurrentProject.Connection
        .Parameters.Append .CreateParameter("@startDate", adDate, adParamInput, , StartDate)
        .Parameters.Append .CreateParameter("@endDate", adDate, adParamInput, , endDate)
        .Parameters.Append .CreateParameter("@type", adVarWChar, adParamInput, 100, types)
        .Parameters.Append .CreateParameter("@status", adVarWChar, adParamInput, 100, Status)
        .Parameters.Append .CreateParameter("@accountID", adInteger, adParamInput, , Account)
        .Parameters.Append .CreateParameter("@group", adVarWChar, adParamInput, 100, group)
        Set Form_ActivitiesSearchResultA.rstSearchRes = .Execute
    End With
 End Sub

В модуле ModuleCMD:
Public Function ActivitySearchA()
    Dim txt As TextBox, cb As ComboBox, lb As ListBox
    Dim dateFrom As Date, dateTill As Date, accountID As Integer, group As String, types As String, Status As String
    Dim intCurrentRow As Integer, f As SubForm
    
    Set txt = Screen.ActiveForm.Controls("dateFrom")
    dateFrom = CDate(txt.Value)
    Set txt = Screen.ActiveForm.Controls("dateTill")
    dateTill = CDate(txt.Value)
    Set cb = Screen.ActiveForm.Controls("cbAccount")
    If Not IsNull(cb) = True Then
        accountID = cb
    End If
    Set cb = Screen.ActiveForm.Controls("cbGroup")
    group = cb
    Set lb = Screen.ActiveForm.Controls("lbType")
    For intCurrentRow = 0 To lb.ListCount - 1
        If lb.Selected(intCurrentRow) Then
            types = types & lb.Column(0, intCurrentRow) & " "
        End If
    Next intCurrentRow
    If types = "" Then
        MsgBox "Please mark something in Types field"
        Exit Function
    End If
    Set lb = Screen.ActiveForm.Controls("lbStatus")
    For intCurrentRow = 0 To lb.ListCount - 1
        If lb.Selected(intCurrentRow) Then
            Status = Status & lb.Column(0, intCurrentRow) & " "
        End If
    Next intCurrentRow
    If Status = "" Then
        MsgBox "Please mark something in Status field"
        Exit Function
    End If
    DoCmd.OpenForm "ActivitiesSearchResultA"
    Set f = Screen.ActiveForm.Controls("ActivitiesList")
    Call Module1.ActivitySearch(dateFrom, dateTill, types, Status, accountID, group)
    Set f.Form.Recordset = Form_ActivitiesSearchResultA.rstSearchRes
    
End Function

В форме Form_ActivitiesSearchResultA:
Public rstSearchRes As New Recordset

Работает это следующим образом:
пользователь в форме Form_ActivitiesSearchA выбирает критерии поиска, нажимает на лэйбл, который запускает макрос, который запускает ModuleCMD.ActivitySearchA
В результате работы функции, отображается форма Form_ActivitiesSearchResultA с результатом поиска

Идея была разнести по модулям:
доступ к данным - Module1
логика - ModuleCMD
модули формы - только внешний вид
2 ноя 06, 12:32    [3346539]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
prustr
Member

Откуда: C-Петербург
Сообщений: 954
Вроде все правильно.. убери может NEW в В форме Form_ActivitiesSearchResultA:
Public rstSearchRes As New Recordset

зачем раньше времени пустой экземпляр создавать и поробуй еще после

Set f.Form.Recordset = Form_ActivitiesSearchResultA.rstSearchRes
Написать
Set Form_ActivitiesSearchResultA.rstSearchRes = Nothing

Мало ты эту ссылку потом еще где то юзаешь?
2 ноя 06, 12:51    [3346701]     Ответить | Цитировать Сообщить модератору
 Re: исчезает рекордсет?  [new]
Denis Bondar
Member

Откуда:
Сообщений: 49
Уряяяя! Заработала!!!!
Ну я дурак! на OnActivate у формы стояло Requery! Убрал и стало мне счастье.

Спасибо всем! Не знаю что бы делал без этого форума! Столько раз выручал!
Еще раз спасибо!
2 ноя 06, 12:58    [3346770]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить