powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO рекордсет как источник формы: как сделать клон?
12 сообщений из 37, страница 2 из 2
ADO рекордсет как источник формы: как сделать клон?
    #32611278
йййй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю. Вот так вот у меня работает - в mdb с ADO. И фильтрация нормально учитывается, и сортировка, и выделение

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Option Compare Database
Option Explicit

Private mrstClone As ADODB.Recordset

Private Sub Form_Load()
    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection
    cnn.Open "трампампам"
    
    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    rst.Open "Select t.id, t.a From t", cnn, adOpenKeyset, adLockReadOnly
    
    Set Me.Recordset = rst
    
    Set mrstClone = New ADODB.Recordset
    mrstClone.CursorLocation = adUseClient
    mrstClone.Open "Select t.id, t.a From t", cnn, adOpenKeyset, adLockReadOnly
End Sub

Private Sub id_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    CalcSum
End Sub

Private Sub a_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    CalcSum
End Sub

Private Sub CalcSum()
    With mrstClone
        If Me.FilterOn Then
            .Filter = Replace(Me.Filter, "Форма1.", "")
        Else
            .Filter = ""
        End If
    
        If Me.OrderByOn Then
            .Sort = Replace(Me.OrderBy, "Форма1.", "")
        Else
            .Sort = ""
        End If
        
        Dim s As Double
        If Not (.EOF And .BOF) Then
            .MoveFirst
            .Move Me.SelTop -  1 
            
            Dim i As Long
            For i =  1  To Me.Form.SelHeight
                s = s + Nz(.fields("a"),  0 )
                .MoveNext
            Next i
        End If
    End With
    Me.Parent!txtSum = s
End Sub

Писалось быстро на коленке, сильно не смеяться :)

З.Ы. Может действительно лучше использовать DAO и запросы к серверу?
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611318
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не вижу компактного решения для использования запроса к серверу в клонированной форме. Либо такой запрос должен возвращать все записи с сервера, а сабформу вешать на линк - работает медленно и моргает при прокрутке, либо в запрос надо вписывать параметры, тогда он не годится как источник клонированной формы.
Не для клонов, и там, где не требуется редактирование, я второй вариант и использую.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611427
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня так не получается, на форме есть еще пачка параметров настройки, которые влияют на выведение информации в сабформе, значит, мне нужно по требованию обновлять набор записей (кроме прописывания его при открытии), а я не умею, не получается, держать открытое соединение. Даже если я декларирую conn как Public, все равно в процедурах его значение Nothing.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611475
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то у меня не получается держать открытый рекордсет на уровне формы. Когда управление переходит к другой процедуре, рекордсет оказывается Nothing. Поэтому сумму в приведенном примере посчитать невозможно. Что я делаю неправильно?
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611928
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поднимаю тему. Почему в модуле формы переменная, определенная на уровне формы, не имеет значения по завершении работы процедуры, в которой значение было присвоено? Так и должно быть и в приведенном здесь примере ошибка, или я просто что-то делаю неправильно?
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611950
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется в виду переменная mrstClone? Возможно, потому, что она объявлена как private, а в модуле, из которого ведется проверка ее содержимого, нет строки
Option Explicit
? Т.е. там эта переменная не находится и соответственно создается as variant.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611958
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, myrstclone - это йййй. Ну не важно, все равно возможно по этой причине.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32611999
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня объявлено как Public и эта опция есть, но все равно по жизни как то у меня ни разу не получилось (к своему стыду) использовать в форме значение глобальной переменной в разных процедурах. Проблема не только в этом примере. Значение пусто, если в текущей процедуре оно не присвоено. Вот такой у меня пробел в знаниях.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32612023
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В форме напиши:
Код: plaintext
1.
2.
3.
4.
public form1s as string

private sub Btn1_Click()
form1s="Проверка"
endsub

В другом модуле напиши
Код: plaintext
1.
2.
public sub aaa()
  msgbox Forms("Форма1").form1s
end sub

Нажми Ctrl-G, напиши
aaa
Нажми Enter. Название переменной надо предварять обращением к форме. Можно вместо Forms("Форма1") писать Form_Форма1 (см faq по экземплярам, п 4.3.)
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32612564
йййй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То, что я привел - это модуль подчиненной формы. Адын в адын. Усе работает.

В ней есть Private-переменная mrstClone. Открывается этот рекордсет при открытии формы. Пока форма не закрыта - рекордсет есть. Снаружи он не виден (потому как Private), если надо к нему вне формы обращаться - сделайте Public Property

Наверное можно и не держать постоянно этот рекордсет, вместо него использовать конструкцию
Set mrstClone = Me.Recordset.Clone
или
Set mrstClone = Me.RecordsetClone
Главное - скопировать строку фильтра и строку сортировки с формы в этот рекордсет, тем самым добиться от ADO-шного клона поведения, изначально присутствующего в формах на DAO-шных рекордсетах.

По поводу всего остального:
Я не вижу компактного решения для использования запроса к серверу в клонированной форме
Не понял. Что такое клонированная форма?
на форме есть еще пачка параметров настройки, которые влияют на выведение информации в сабформе, значит, мне нужно по требованию обновлять набор записей (кроме прописывания его при открытии)
Не понял - как это связано с ADO или DAO? ADO-рекордсет (в качестве источника формы) у вас сам все параметры просекает и сам обновляется? Не верю.
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32612844
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На AfterUpdate параметров повторяется загрузка рекордсета из процедуры.
А на OnOpen подчиненной формы у меня вообще невозможно процедуру запустить, потому что (почему, не знаю) у клонированной формы материнской Unbound'ы с параметрами еще не нарисовались и обращение к ним вызывает ошибку(.
Клоны форм - вот только что фигурировала ссылка http://www.sql.ru/faq/faq_topic.aspx?fid=240
А вообще подробно описано у Гетца.

Может быть у меня такая проблема с глобальной переменной именно потому, что форма клонированная и по сути безымянная?
...
Рейтинг: 0 / 0
ADO рекордсет как источник формы: как сделать клон?
    #32613565
йййй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытался сотворить все то же самое для DAO.Recordset на основе хп с параметрами. Что-то не вышло ни фига
Создаю временную QueryDef, устанавливаю св-во Connect, в SQL пишу вызов хп и значения параметров, открываю DAO рекордсет, вешаю на него форму, пока все ок. Как только пытаюсь сортировать или фильтровать - "не существует источник записей sp_test 1"
Чета я наверное не то делаю?

Но ADO-шный вариант у меня все равно работает.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO рекордсет как источник формы: как сделать клон?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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