powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Удаление всех записей из recordset'а
25 сообщений из 26, страница 1 из 2
Удаление всех записей из recordset'а
    #32772005
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Требуеся очистить рекордсет (отвязанный). Поясняю - заполняем -выбрасываем на лист Excel, чистим и так 15 раз на лист. (Дело в Акцессе, и не надо топик в Офис тянуть!)
Порывшись в хелпе, пришел к выводу, что кроме тупого перебора записей с rst.Delete, сособов сделать сие махом нет.
Если кто-нибуть разуверит в этом, буду рад.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772009
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на первый взгляд - если в лоб - то как будто, действительно нет.

Однако
1) если рекордсет достаточно "длинный", то быстрее будет закрыть текущий и пересоздать его с использованием кешированной коллекции Fields.

2)Думаю, что в широком диапазоне количества передаваемых строк
двумерный массив суммарно выиграет ( скорость добавления выше, скорость присвоения та же или выше, - некотрые потери на передаче значения, которые почти всегда перекроются прочими плюсами)


(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772016
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется - это только на первый взгляд.

щаз попробую очки протереть...



(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772018
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Короткий - 4 записи
2. Думаю, проиграю. По моим наблюдениям, CopyFromRecordset в екселе быстрее заполнения ячеек из массива. Да и при возне с переменным числом полей (а дело обстоит именно так), массив мне жизнь не облегчит, скорее усложнит.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772022
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очки не помогли - нельзя, в обчем.

4 строк? - если не затруднит - показал бы код рекордсетный - а я бы положил массивный - а ты бы померял...
думаю, длинного цикла не потребуется, стобы рекордсет обогнать...

(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772034
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander G
предложение с извинениями снято.

Однако, если рекордсет набирается локально через AddNew - почти всегда готов вернуться к теме.

Разное количество полей -
Все равно ведь Close появляется (?) - так стоит ли Delete того ?



(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772036
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаем массив 100х100 и аналогичный рекордсет (скорость их создания неинтересна) и выкладываем на лист екселя (а вот скорость этого и интересует)
Код: 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.
Dim arr( 100 ,  100 ) As Integer
Dim i As Integer
Dim y As Integer
For i =  1  To  100 
 For y =  1  To  100 
    arr(i -  1 , y -  1 ) =  1 
 Next y
Next i
'=============================
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
For i =  1  To  100 
    rst.Fields.Append "f" & i, adInteger
Next i
rst.Open
For i =  1  To  100 
 rst.AddNew
 For y =  1  To  100 
  rst.Fields("f" & y) =  1 
 Next y
Next i
'===================================
Dim App As Excel.Application
Dim Wkb As Excel.Workbook
Dim sht As Excel.Worksheet
Dim time As Date
Set App = CreateObject("Excel.Application")
Set Wkb = App.Workbooks.Add
Set sht = Wkb.sheets( 1 )
'теперь 2 варианта выкладки на лист
'=================================================
dttime = Now()
sht.Range("A1").CopyFromRecordset rst
Debug.Print Second(Now() - dttime)  'показал 0
'=====================================
dttime = Now()
With sht
For i =  1  To  100 
For y =  1  To  100 
.Cells(i, y) = arr(i -  1 , y -  1 )
Next
Next
End With
Debug.Print Second(Now() - dttime) 'показал    12 
Ежли что, отвечу завтра - у меня скоро 3 ночи
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772038
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу извинить, пока набирал, актуальность пропала :)
дело в том, что нужно 4 набора с разными полями выкинуть по 4 раза...
ну в общем проще, конечно написать за пару минут процедурку
for i=1 to 4
rst.delete
........
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772042
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я щаз гляну - ничаво не пропало...
вот только это почему скорость формирования не интересна - с этим я никак
согласиться не могу - это нечестно.
я вот за опчее время волну - юсь

(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772045
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander G

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

Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
Option Compare Database
Option Explicit
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Function getColNameByNum(colNum As Long, Optional bAbsolute As Boolean = True)
'возвращает имя столбца в стиле A1 по его номеру
'проверка на 255 отсутствует.
'если bAbsolute=True то имя столбца предваряется знаком абсолютной ссылки $
Const numCh As Long =  26 &
Const charOffset As Long =  64 &

  Dim fL As Long, sL As Long
  If bAbsolute Then getColNameByNum = "$"
  
  fL = colNum \ numCh '26&
  sL = colNum Mod numCh '26&
  
  
  If fL >  0  Then
    If sL >  0  Then
      getColNameByNum = getColNameByNum & Chr(fL + charOffset) & Chr(sL + charOffset)
    Else
     If fL -  1  >  0  Then
       getColNameByNum = getColNameByNum & Chr(fL -  1  + charOffset)
     End If
     getColNameByNum = getColNameByNum & "Z"
    End If
  Else
    getColNameByNum = getColNameByNum & Chr(sL + charOffset)
  End If
  
End Function

Sub sub2()
  Dim arr( 100 ,  100 ) As Integer
Dim i As Integer
Dim y As Integer
For i =  1  To  100 
 For y =  1  To  100 
    arr(i -  1 , y -  1 ) =  1 
 Next y
Next i
'=============================
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
For i =  1  To  100 
    rst.Fields.Append "f" & i, adInteger
Next i
rst.Open
For i =  1  To  100 
 rst.AddNew
 For y =  1  To  100 
  rst.Fields("f" & y) =  1 
 Next y
Next i
'===================================
Dim App As Excel.Application
Dim Wkb As Excel.Workbook
Dim sht As Excel.Worksheet
Dim dttime As Long
Set App = CreateObject("Excel.Application")
Set Wkb = App.Workbooks.Add
Set sht = Wkb.sheets( 1 )
'теперь 2 варианта выкладки на лист
'=================================================
dttime = timeGetTime
sht.range("A1").CopyFromRecordset rst
Debug.Print timeGetTime - dttime  'показал 64 - 65
'==================================
Dim strAdr As String

dttime = timeGetTime
With sht
  strAdr = "$A$1:" & getColNameByNum( 100 ) & "$1"
  .range(strAdr).value2 = arr
'For i = 1 To 100
'For y = 1 To 100
'.Cells(i, y) = arr(i - 1, y - 1)
'Next
'Next
End With
Debug.Print timeGetTime - dttime 'показывает 4-3
'Debug.Print Second(Now() - dttime) 'показал   12


App.Visible = True

End Sub



(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772046
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соврал, конечно, второпях - разница всего втрое

для сассива диапазон неправильно у меня был сформирован
д.б.
Код: plaintext
1.
  strAdr = "$A$1:" & getColNameByNum( 100 ) & "$101"
  .range(strAdr).value2 = arr
тогда реккордсет - 60-65
массив - 19-22

(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772073
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если же считать по "полным накладным расходам" - порядок все-таки набегает.

15 для массива и 150 для рекордсета

Код: 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.
58.
59.
60.
61.
62.
63.
64.
Sub sub3()

'===================================
Dim App As Excel.Application
Dim Wkb As Excel.Workbook
Dim sht As Excel.Worksheet, sht2 As Excel.Worksheet
Dim dttime As Long
Set App = CreateObject("Excel.Application")
Set Wkb = App.Workbooks.Add
Set sht = Wkb.sheets( 1 ) 'лист для рекордсета
Set sht2 = Wkb.sheets( 2 ) ' лист для массива
'массив со всеми накладными расходами

dttime = timeGetTime

ReDim arr( 100 ,  100 ) As Integer
Dim i As Integer
Dim y As Integer
For i =  1  To  100 
 For y =  1  To  100 
    arr(i -  1 , y -  1 ) = i *  100  + y
 Next y
Next i

Dim strAdr As String
strAdr = "$A$1:$CV100"

sht2.range(strAdr).value2 = arr

Debug.Print timeGetTime - dttime



'=============================
'рекордсет со всеми накладными расходами
dttime = timeGetTime

Dim rst As ADODB.Recordset
Dim tF As ADODB.Fields

Set rst = New ADODB.Recordset

For i =  1  To  100 
  
    rst.Fields.Append "f" & i, adInteger
Next i
rst.Open

Set tF = rst.Fields

For i =  1  To  100 
 rst.AddNew
 For y =  1  To  100 
   tF(y -  1 ).Value =  100  * i + y
 Next y
Next i


sht.range("A1").CopyFromRecordset rst
Debug.Print timeGetTime - dttime  'показал 0
'==================================

App.Visible = True

End Sub


(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32772158
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убедил, массив быстрее. :)
1.почему меня данном случае не волнует скорость формирования - время получения данных для заполнения (открытие рекордсетов, dcount'ы и dsum'ы) у меня на порядки больше времени формирования (секунды и миллисекунды)
а уж учитывая размерность ~ 4x30, тем более можно пренебречь
2. Все же предпочитаю удобство работы с рекордсетом возне с массивом.
или дать
rst.AddNew
rst!SumЛяляля=Dsum(........)
rst!SumЛяляляВтомЧисле=....
..............
или держать в уме позицию в массиве этого Ляляля и усложнять код, делая его малочитаемым, тут каждый
выбирает сам, я в конкретной ситуации предпочитаю проиграть 50 миллисекунд.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32782942
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander G

И все-таки, ответ на исходный вопрос я дал неверный...

вот код по удалению группы записей...

Код: 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.
Sub TestRecordSet2()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

'получилось при заказе такого типа блокировки
rst.LockType = adLockBatchOptimistic

Dim i As Long, y As Long

For i =  1  To  100 
    rst.Fields.Append "f" & i, adInteger
Next i
rst.Open
For i =  1  To  100 
 rst.AddNew
 For y =  1  To  100 
  rst.Fields("f" & y) = i *  1000  + y
 Next y
Next i

rst.Filter = adFilterPendingRecords
rst.Delete adAffectGroup
'тут показывает неясно что - фантом
Debug.Print rst.RecordCount, rst.AbsolutePosition
'снимаем  фильтр
rst.Filter = vbNullString
'проверяем, что получилось...
Debug.Print rst.RecordCount, rst.AbsolutePosition
rst.Close
End Sub

ключ к ответу найден на http://www.able-consulting.com

PS
если увидишь это сообщение - поставь метку.


(с выражением лица)
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783284
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сделал так.
Код стал короче и красивее - сократился на 4 строки. :). Ну не нравилось мне эстетическое ощущение, возникавшее при взгляде на процедуру с циклом, хоть и 4 записи. :)
Это из единственной мысли оставшейся после прослушивания курса марксистско-ленинской эстетики (был такой в институте)- "При восприятии объекта субъектом возникает эстетическое ощущение" :)
Конечно, на скорости мало сказалось - отчет формируется 3-6 минут (из-за выдирки данных).
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783300
Евгений1234-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, чего-то не понял.
Код: plaintext
Rst.Requery
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783303
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1234-5Может, чего-то не понял.
Код: plaintext
Rst.Requery

ошибка 3219
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783320
Евгений1234-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1234-5
авторМожет, чего-то не понял.
Rst.Requery

ошибка 3219

Справку почитай. Там надо новый запрос, а тебе надо ставить старый вместо нового.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783325
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1234-5
Справку почитай. Там надо новый запрос, а тебе надо ставить старый вместо нового.
Первая строка топика: Требуеся очистить рекордсет ( отвязанный ).
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783406
Евгений1234-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то Alexander G
Ты будешь матерится, но я не знаю что такое рекордсет отвязанный.

ЗЫ.
ADOB ? наверное, но никогда с этой моделью не работал.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783411
Евгений1234-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то Alexander G
Ты будешь матерится, но я не знаю что такое рекордсет отвязанный.

ЗЫ.
ADOB ? наверное, но никогда с этой моделью не работал.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783417
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вторая секция в моем посте от 7 ноя 04, 17:45 - формируется на голом месте рекордсет без источника и заполняется данными.
Т.е. в данном случае он используется как массив.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783421
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если ёксель, TransferSpreadsheet не покатит? он то быстрее, как ни крути.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32783436
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я вбрасываю на готовый шаблон отчета (Excel шаблон заказчика, как всегда, мало поддающийся логике программиста, с закидонами) в определенные места мои рекордсеты. На шаблоне еще сотни ячеек с формулами, суммирующими вброшенные данные. Если еще буду вычислять все эти суммы и средние в акцессе, получится еще медленнее (и весьма), пробовал.
...
Рейтинг: 0 / 0
Удаление всех записей из recordset'а
    #32784463
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я увидел, что ты увидел.

а снять фильтр формально правильнее
Код: plaintext
1.
rst.Filter = adFilterNone
а удалить скопом при таком варианте можно еще так

Код: plaintext
1.
rst.CancelBatch
rst.MoveFirst
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Удаление всех записей из recordset'а
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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