Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: RecordSet - помогите , плиз :(
 
 автор: Krusz   (03.08.2011 в 09:42)   личное сообщение
 
 

Объясните, пожалуйста, на пальцах, что такое рекордсет и с чем его едят.
понимаю, что это набор данных, вроде бы научился считать количество строк в рекордсете.
а вот как например вывести данны набор данных, скажем в listbox на форме программно незнаю.

  Ответить  
 
 автор: osmor   (03.08.2011 в 10:33)   личное сообщение
 
 

Рекордсет - это виртуальная таблица данных содержащая данные возвращаемые запросом на котором он(рекордсет) открыт
по нему можно перемещаться, в нем можно производить поиск, добавлять, удалять и изменять записи ну и еще много чего
Сохранение данных в реальных таблицах (тех которые присутствуют в запросе на котором открыт рекордсет) происходит при вызове определенных методов (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

  Ответить  
 
 автор: snipe   (03.08.2011 в 10:54)   личное сообщение
 
 

виртуальная таблица

в листбокс или комбобокс можно вывести используя свойство этих контролов
тип источника строк - список значений
а источник строк ввести через ;

в vba примерно так
me![поле со списком1].rowsource = "1;2;3;4;5;6;7;8;9"

понятно что rowsource можно собрать пробежав циклом по рекордсету

(если надо выводить на экран 2 столбца - то данные пишутся через 1 т.е данные из первого столбца потом данные из второго столбца и так по кругу например "1;первый;2;второй;3;третий"
количество столбцов в этом случае ставится 2 и задается ширина столбцов в см через ;

кроме того можно данные из рекордсета грузануть во временную таблу
и обновить rowsource листбокса или комбобокса при условии что эти контролы смотрят на эту временную таблу

вариантов множество

  Ответить  
 
 автор: Krusz   (05.08.2011 в 10:43)   личное сообщение
 
 

Спасибо за отклики, вроде бы получилось.
еще один вопрос, есть возможность дать несколько толковых ссылок в инете почитать про DAO, VBA? только на русском языке. несколько ресурсов нашел, но хочется еще что нибудь посмотреть - где может более наглядно рассказывается...
если нет,то нет...

  Ответить  
 
 автор: osmor   (05.08.2011 в 14:24)   личное сообщение
 
 

http://hiprog.com/forum/read.php?id_forum=1&id_theme=4005&page=1

  Ответить  
 
 автор: Krusz   (09.08.2011 в 08:40)   личное сообщение
 
 

Спасибо

  Ответить  
 
 автор: Krusz   (16.08.2011 в 08:53)   личное сообщение
 
 

у меня возник вопрос.
когда мы пишем
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 у нас закрываются и все открытые рекордсеты?

  Ответить  
 
 автор: osmor   (16.08.2011 в 10:13)   личное сообщение
 
 

db.Close - никогда не делал.
Set db = Nothing - уничтожает ссылку на currentdb но не закрывает открытые рекордсеты.
можно написать
set поле.recordset=db.openrecordset(....)
тогда рекордсет разрушиться при закрытии формы

  Ответить  
 
 автор: Krusz   (18.08.2011 в 12:26)   личное сообщение
 
 

и сново я со своими вопросами , так как пока не вкуриваю.
если рекордсет - это таблица.
то если у меня есть 2 рекордсета - это значит 2 таблицы.
соответсвенно наверняка можно сделать запрос из этих двух рекордсетов чтобы получить результирующую табличку.
я так понимаю обычным SELECT сделать нельзя указав во FROM рекордсеты?

  Ответить  
 
 автор: Дядя Федор   (18.08.2011 в 12:56)   личное сообщение
 
 

>я так понимаю обычным SELECT сделать нельзя указав во FROM рекордсеты?

А смысл?

SELECT можно употребить к таблицам и запросам.
Типа

"Select tbl.fields1 from tbl where tbl.fields2=100;"


>наверняка можно сделать запрос из этих двух рекордсетов чтобы получить результирующую табличку.

Попробуйте в конструкторе запросов связать нужные 2 таблицы и посмотрите, что получится.

Выберет из таблицы Tbl все поля fields1, для которых верно условие fields2=100.
Рекордсету можно назначить такую выборку, но не наоборот.

  Ответить  
 
 автор: osmor   (18.08.2011 в 13:48)   личное сообщение
 
 

Recordset - это виртуальный набор записей. Обычно уже содержащий нужные данные из нужных таблиц.
т.е. создаете нужную строку SQL и уже с помощью нее открывает нужный рекордсет.
Select из рекордсета не получится.

  Ответить  
 
 автор: kot_k_k   (18.08.2011 в 13:58)   личное сообщение
 
 

еще есть Union Select - объединяет данные из нескольких Select либо составной Select в него входит еще несколько Select

  Ответить  
 
 автор: Krusz   (18.08.2011 в 14:28)   личное сообщение
 
 

тогда попробую описать свою задачу, может поможете найти правильный путь. для начала вопрос.
если я делаю запрос через связанные таблицы, то у меня на удаленной машине в другом городе база работает медленно. если я делаю через:
Set db1 = DBEngine.Workspaces(0).OpenDatabase(....)
Set RST = db.OpenRecordset(.....)
то все работает веселее и быстрее.
Почему?
вся база хранится у меня в одном файле.
плюс ежемесячно у меня от контрагента приходит файл с 2 500 000 записей, которые я сохраняю в отдельном mdb файле по оределенному правилу. соответственно таких файлов несколько. и открывается мне нужный файл по заданным условиям и оттуда берется кусок данных.
таким образом у меня есть рекордсет из основной базы и есть рекордсет из отдельного файла. теперь мне надо их сопоставить друг другу через одно поле.
как решение расматриваю через временные таблицы(сделал ), но может есть еще решения?

  Ответить  
 
 автор: alexmartinboy   (09.04.2013 в 17:28)   личное сообщение
 
 

Сам очень долго не мог найти, так чтобы для чайников. В книгах сложно сразу все понять что к чему, а тут чел классно описал
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

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList