|
|
|
| Объясните, пожалуйста, на пальцах, что такое рекордсет и с чем его едят.
понимаю, что это набор данных, вроде бы научился считать количество строк в рекордсете.
а вот как например вывести данны набор данных, скажем в listbox на форме программно незнаю. | |
|
| |
|
|
|
| Рекордсет - это виртуальная таблица данных содержащая данные возвращаемые запросом на котором он(рекордсет) открыт
по нему можно перемещаться, в нем можно производить поиск, добавлять, удалять и изменять записи ну и еще много чего
Сохранение данных в реальных таблицах (тех которые присутствуют в запросе на котором открыт рекордсет) происходит при вызове определенных методов (update, UpdateBatch)
Следует учесть что объект Recordset существует в двух библиотеках (ADODB и DAO) и соответственно рекордветы бывают двух типов каждый из которых, кроме одинаковых, имеет свои методы.
все это очень подробно описано в документации по обеим библиотекам
что бы присвоить списку ADODB.recordset нужно его открыть и свойсвту recordset списка присвоить открытый recordset
Dim rst As adodb.Recordset
Set rst = New adodb.Recordset
rst.Open "select поле from таблица", CurrentProject.Connection, adOpenStatic, adLockReadOnly
Set Me.list1.Recordset = rst
|
для dao.recordset
dim rst ds dao.recordset
set rst = currentDb.OpenRecordset("select поле from таблица")
Set Me.list1.Recordset = rst
|
| |
|
| |
|
|
|
| виртуальная таблица
в листбокс или комбобокс можно вывести используя свойство этих контролов
тип источника строк - список значений
а источник строк ввести через ;
в vba примерно так
me![поле со списком1].rowsource = "1;2;3;4;5;6;7;8;9"
понятно что rowsource можно собрать пробежав циклом по рекордсету
(если надо выводить на экран 2 столбца - то данные пишутся через 1 т.е данные из первого столбца потом данные из второго столбца и так по кругу например "1;первый;2;второй;3;третий"
количество столбцов в этом случае ставится 2 и задается ширина столбцов в см через ;
кроме того можно данные из рекордсета грузануть во временную таблу
и обновить rowsource листбокса или комбобокса при условии что эти контролы смотрят на эту временную таблу
вариантов множество | |
|
| |
|
|
|
| Спасибо за отклики, вроде бы получилось.
еще один вопрос, есть возможность дать несколько толковых ссылок в инете почитать про DAO, VBA? только на русском языке. несколько ресурсов нашел, но хочется еще что нибудь посмотреть - где может более наглядно рассказывается...
если нет,то нет... | |
|
| |
|
|
|
| http://hiprog.com/forum/read.php?id_forum=1&id_theme=4005&page=1 | |
|
| |
|
|
|
|
| у меня возник вопрос.
когда мы пишем
dim db as database
dim rst as recordset
set db="....."
set rst=db.openrecordset(...)
ну и допустим
set me.поле.recordset=rst
то потом мы закрываем рекордсет и базу
RST.Close
db.Close
Set db = Nothing
Set RST = Nothing
это правильно?
а если написать без переменной RST
а просто
set.поле.recordset=db.openrecordset(....)
будет достаточно только
db.Close
Set db = Nothing
?
или нет?
или при закрытии db у нас закрываются и все открытые рекордсеты? | |
|
| |
|
|
|
| db.Close - никогда не делал.
Set db = Nothing - уничтожает ссылку на currentdb но не закрывает открытые рекордсеты.
можно написать
set поле.recordset=db.openrecordset(....)
тогда рекордсет разрушиться при закрытии формы | |
|
| |
|
|
|
| и сново я со своими вопросами , так как пока не вкуриваю.
если рекордсет - это таблица.
то если у меня есть 2 рекордсета - это значит 2 таблицы.
соответсвенно наверняка можно сделать запрос из этих двух рекордсетов чтобы получить результирующую табличку.
я так понимаю обычным SELECT сделать нельзя указав во FROM рекордсеты? | |
|
| |
|
|
|
| >я так понимаю обычным SELECT сделать нельзя указав во FROM рекордсеты?
А смысл?
SELECT можно употребить к таблицам и запросам.
Типа
"Select tbl.fields1 from tbl where tbl.fields2=100;"
|
>наверняка можно сделать запрос из этих двух рекордсетов чтобы получить результирующую табличку.
Попробуйте в конструкторе запросов связать нужные 2 таблицы и посмотрите, что получится.
Выберет из таблицы Tbl все поля fields1, для которых верно условие fields2=100.
Рекордсету можно назначить такую выборку, но не наоборот. | |
|
| |
|
|
|
| Recordset - это виртуальный набор записей. Обычно уже содержащий нужные данные из нужных таблиц.
т.е. создаете нужную строку SQL и уже с помощью нее открывает нужный рекордсет.
Select из рекордсета не получится. | |
|
| |
|
|
|
| еще есть Union Select - объединяет данные из нескольких Select либо составной Select в него входит еще несколько Select | |
|
| |
|
|
|
| тогда попробую описать свою задачу, может поможете найти правильный путь. для начала вопрос.
если я делаю запрос через связанные таблицы, то у меня на удаленной машине в другом городе база работает медленно. если я делаю через:
Set db1 = DBEngine.Workspaces(0).OpenDatabase(....)
Set RST = db.OpenRecordset(.....)
то все работает веселее и быстрее.
Почему?
вся база хранится у меня в одном файле.
плюс ежемесячно у меня от контрагента приходит файл с 2 500 000 записей, которые я сохраняю в отдельном mdb файле по оределенному правилу. соответственно таких файлов несколько. и открывается мне нужный файл по заданным условиям и оттуда берется кусок данных.
таким образом у меня есть рекордсет из основной базы и есть рекордсет из отдельного файла. теперь мне надо их сопоставить друг другу через одно поле.
как решение расматриваю через временные таблицы(сделал ), но может есть еще решения? | |
|
| |
|
|
|
| Сам очень долго не мог найти, так чтобы для чайников. В книгах сложно сразу все понять что к чему, а тут чел классно описал
1 Public Function MakeConection(n As Integer, karta As Long) As Double
2 If (n >= 1) Then
3 Dim i As Integer
4 Dim s As Double
5 ReDim mass(0 To n - 1) As Double
6 Dim rst As ADODB.Recordset
7 Set rst = New ADODB.Recordset
8 rst.Open "SELECT [Исходящие звонки].Kode, [Исходящие звонки].Звонок, [Исходящие
9 звонки].[Результат]" & _
10 "FROM [Исходящие звонки]" & _
11 "WHERE ((([Исходящие звонки].Kode) = " & karta & " ) And (([Исходящие звонки].[Результат]) 12 Is Not Null))" & _
13 "ORDER BY [Исходящие звонки].Звонок;", CurrentProject.Connection
14 s = 0
15 i = 0
16 rst.MoveFirst
17 Do Until rst.EOF
18 mass(i) = rst(2)
19 s = s + mass(i) / (n - i)
20 rst.MoveNext
21 i = i + 1
22 Loop
23 rst.Close
24 Set rst = Nothing
25 MakeConection = s
26 Else: MakeConection = 99
27 End If
28 End Function
вот ссылка, где он все рассписал, что означает каждая строчка- что к чему.
http://societykey.blogspot.com/2012/12/VBA-programmirovanie.html | |
|
| |