Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordcount в цикле. определение количества записей recordset. / 15 сообщений из 15, страница 1 из 1
19.01.2019, 13:16
    #39761842
mikle08es2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
Добрый день. Есть запрос на вывод данных в Excel:

sq = "SELECT dbo_DATA.DATE, dbo_DATA.DATE, [Спр_кодов 80020 и ASKP].[Наименование объекта], dbo_DATA.REGID, [Спр_кодов 80020 и ASKP].[Тип объекта], [Спр_кодов 80020 и ASKP].[Уровень напряжения], [Спр_кодов 80020 и ASKP].Направление, Спр_ЧПН.Час, dbo_DATA.COUNT, dbo_DATA.H1, dbo_DATA.H2, dbo_DATA.H3, dbo_DATA.H4, dbo_DATA.H5, dbo_DATA.H6, dbo_DATA.H7, dbo_DATA.H8, dbo_DATA.H9, dbo_DATA.H10, dbo_DATA.H11, dbo_DATA.H12, dbo_DATA.H13, dbo_DATA.H14, dbo_DATA.H15, dbo_DATA.H16, dbo_DATA.H17, dbo_DATA.H18, dbo_DATA.H19, dbo_DATA.H20, dbo_DATA.H21, dbo_DATA.H22, dbo_DATA.H23, dbo_DATA.H24, dbo_DATA.H25, dbo_DATA.H26, dbo_DATA.H27, dbo_DATA.H28, dbo_DATA.H29, dbo_DATA.H30, dbo_DATA.H31, dbo_DATA.H32, dbo_DATA.H33, dbo_DATA.H34, dbo_DATA.H35, dbo_DATA.H36, dbo_DATA.H37, dbo_DATA.H38, dbo_DATA.H39, dbo_DATA.H40, dbo_DATA.H41, dbo_DATA.H42, dbo_DATA.H43, dbo_DATA.H44, dbo_DATA.H45, dbo_DATA.H46, dbo_DATA.H47, dbo_DATA.H48 "
sq = sq & "FROM (dbo_DATA LEFT JOIN Спр_ЧПН ON dbo_DATA.DATE = Спр_ЧПН.Дата) INNER JOIN [Спр_кодов 80020 и ASKP] ON dbo_DATA.REGID = [Спр_кодов 80020 и ASKP].Идентификатор "
sq = sq & "WHERE (((dbo_DATA.Date)>=#" & f_date_am(d1) & "# And (dbo_DATA.Date)<=#" & f_date_am(d2) & "#) AND (([Спр_кодов 80020 и ASKP].[Отчет, где используется])=""баланс""));"

Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then
zap.MoveFirst
While zap.EOF <> True
For i = 1 To 56
j = 2 + zap.RecordCount
l2.Cells(j, i) = zap.Fields(i).Value
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing


И все вроде хорошо, все работает. Но выводит вез сортировки по нужны полям.
Добавляю последней строкой сортировку по нужным полям:
sq = sq & "ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;"

И начинаются проблемы. Поскольку recordcount не считает число записей до обращения к ним. Из- за добавления строки с сортировкой : sq = sq & "ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;" , обращение ко всем записям произошло. И нарушаются параметры вывода в цикле

Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then
zap.MoveFirst
While zap.EOF <> True
For i = 1 To 56
j = 2 + zap.RecordCount
l2.Cells(j, i) = zap.Fields(i).Value
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing

Ведь каждый раз zap.RecordCount не становится на один больше ,а это теперь просто конечное число записей. Какой выход из ситуации???

Попытался переписать цикл:

Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then
zap.MoveFirst
While zap.EOF <> True
For i = 1 To 56
For j = 3 To zap.RecordCount
l2.Cells(j, i) = zap.Fields(i).Value
Next j
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing


Но проблема в другом условие While zap.EOF <> True никогда не выполняется. цикл получается бесконечный.
Как решить вопрос с сортировкой по первому пути? или как поставить условие While по второму пути?
...
Рейтинг: 0 / 0
19.01.2019, 13:59
    #39761844
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
mikle08es2Добрый день. Есть запрос на вывод данных в Excel:
Код: sql
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.
sq = "SELECT dbo_DATA.DATE, dbo_DATA.DATE, 
[Спр_кодов 80020 и ASKP].[Наименование объекта], dbo_DATA.REGID,
 [Спр_кодов 80020 и ASKP].[Тип объекта], 
[Спр_кодов 80020 и ASKP].[Уровень напряжения],
 [Спр_кодов 80020 и ASKP].Направление, Спр_ЧПН.Час,
 dbo_DATA.COUNT, dbo_DATA.H1, dbo_DATA.H2, dbo_DATA.H3, 
dbo_DATA.H4, dbo_DATA.H5, dbo_DATA.H6, dbo_DATA.H7, 
dbo_DATA.H8, dbo_DATA.H9, dbo_DATA.H10, dbo_DATA.H11, 
dbo_DATA.H12, dbo_DATA.H13, dbo_DATA.H14, dbo_DATA.H15,
 dbo_DATA.H16, dbo_DATA.H17, dbo_DATA.H18, dbo_DATA.H19,
 dbo_DATA.H20, dbo_DATA.H21, dbo_DATA.H22, dbo_DATA.H23, 
dbo_DATA.H24, dbo_DATA.H25, dbo_DATA.H26, dbo_DATA.H27, 
dbo_DATA.H28, dbo_DATA.H29, dbo_DATA.H30, dbo_DATA.H31, 
dbo_DATA.H32, dbo_DATA.H33, dbo_DATA.H34, dbo_DATA.H35, 
dbo_DATA.H36, dbo_DATA.H37, dbo_DATA.H38, dbo_DATA.H39,
 dbo_DATA.H40, dbo_DATA.H41, dbo_DATA.H42, dbo_DATA.H43,
 dbo_DATA.H44, dbo_DATA.H45, dbo_DATA.H46, dbo_DATA.H47, dbo_DATA.H48 "
sq = sq & "FROM (dbo_DATA LEFT JOIN Спр_ЧПН ON dbo_DATA.DATE = Спр_ЧПН.Дата)
 INNER JOIN [Спр_кодов 80020 и ASKP] 
ON dbo_DATA.REGID = [Спр_кодов 80020 и ASKP].Идентификатор "
sq = sq & "WHERE (((dbo_DATA.Date)>=#" & f_date_am(d1) & "#
 And (dbo_DATA.Date)<=#" & f_date_am(d2) & "#) 
AND (([Спр_кодов 80020 и ASKP].[Отчет, где используется])=""баланс""));"

Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then 
zap.MoveFirst 
While zap.EOF <> True 
For i = 1 To 56 
j = 2 + zap.RecordCount 
l2.Cells(j, i) = zap.Fields(i).Value 
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing


mikle08es2И все вроде хорошо, все работает. Но выводит вез сортировки по нужны полям.
Добавляю последней строкой сортировку по нужным полям:
Код: sql
1.
sq = sq & "ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;"


mikle08es2И начинаются проблемы. Поскольку recordcount не считает число записей
до обращения к ним. Из- за добавления строки с сортировкой :
Код: sql
1.
sq = sq & "ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;" 


, обращение ко всем записям произошло. И нарушаются параметры вывода в цикле
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then 
zap.MoveFirst 
While zap.EOF <> True 
For i = 1 To 56 
j = 2 + zap.RecordCount 
l2.Cells(j, i) = zap.Fields(i).Value 
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing


mikle08es2Ведь каждый раз zap.RecordCount не становится на один больше ,а это теперь просто конечное число записей. Какой выход из ситуации???
Попытался переписать цикл:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then 
zap.MoveFirst 
While zap.EOF <> True 
For i = 1 To 56 
For j = 3 To zap.RecordCount 
l2.Cells(j, i) = zap.Fields(i).Value 
Next j
Next i
zap.MoveNext
Wend
End If
Set zap = Nothing


mikle08es2Но проблема в другом условие While zap.EOF <> True никогда не выполняется. цикл получается бесконечный.
Как решить вопрос с сортировкой по первому пути? или как поставить условие While по второму пути?
...
Рейтинг: 0 / 0
19.01.2019, 15:17
    #39761859
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
DarkMan,
не помешал бы пробел перед order
sq = sq & " ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;"
...
Рейтинг: 0 / 0
19.01.2019, 15:20
    #39761860
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
DarkMan,

да и это не логично
Set zap = CurrentDb.OpenRecordset(sq)
If zap.RecordCount <> 0 Then
zap.MoveFirst
j=2
do While zap.EOF =false
j=j+1
For i = 1 To 56
l2.Cells(j, i) = zap.Fields(i).Value
Next i
zap.MoveNext
loop
End If
Set zap = Nothing
...
Рейтинг: 0 / 0
19.01.2019, 15:31
    #39761861
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
ПЕНСИОНЕРКАDarkMan,
не помешал бы пробел перед order
sq = sq & " ORDER BY dbo_DATA.DATE, dbo_DATA.REGID;"
Вы меня не прекращаете радовать своим чувством юмора. Если Вы чмели заметить ,я лишь отредактировал сообщение ТС , заключив код в тэги CSV . :))
...
Рейтинг: 0 / 0
19.01.2019, 15:33
    #39761862
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
Пенсионерка,
Кстати чего и Вам желал бы. Сами понимате,что отредактированные сообщения оегче читать.
...
Рейтинг: 0 / 0
19.01.2019, 15:37
    #39761863
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
mikle08es2Но проблема в другом условие While zap.EOF <> True никогда не выполняется. цикл получается бесконечный.

А ты то хоть смотрел что в zap.RecordCount перед тем как его использовать ?
В твоем варианте там может быть все что угодно и даже минус 1
Как минимум не хватает MoveLast
Замечания к RecordCount
...
Рейтинг: 0 / 0
19.01.2019, 16:23
    #39761868
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
mikle08es2,
Выдержка из HELP:" Свойство RecordCount не показывает, сколько записей содержится в динамическом или статическом объекте Recordset до обращения ко всем записям. "
Вы же обращаетесь в процедуре к этому свойству(которое до получения его значения будет при наличии записей=1. Позтому j = 2+ zap.RecordCount аналогично j=2+1.)
и вообще можно и такую конструкцию:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
a=1
j=3 'как я понял это столбец
Do Until rs.EOF
L2.cells(a,j)=RS![поле]
a=a+1
rs.MoveNext
Loop 
...
Рейтинг: 0 / 0
19.01.2019, 16:50
    #39761875
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
вернее так:
a=1
j=3 'как я понял это столбец
Do Until rs.EOF
L2.cells(a,j)=RS!Fields(a)' или RS!Fields(a+самиОпределите)
a=a+1
rs.MoveNext
Loop
...
Рейтинг: 0 / 0
19.01.2019, 16:56
    #39761877
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
mikle08es2Поскольку recordcount не считает число записей до обращения к ним. какая гадость, эта ваша заливная рыба ©
...
Рейтинг: 0 / 0
19.01.2019, 17:06
    #39761881
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
mikle08es2,
можно решить проблему так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
' ...
const StroDobav&=2
dim NomStrok&, i%
With zap 
.movelast
NomStrok=.recordcount+1
do until .BOF
l2.rows(StroDobav).Insert
l2.Cells(StroDobav, 1) =NomStrok
                     For i = 2 To 57
                        l2.Cells(StroDobav, i) = .Fields(i-1)
                     Next
NomStrok=NomStrok-1
.movePrevious
Loop
end with


чем удобно - это может быть накопительный файл - куда ссыпаются данные в постоянном потоке и при этом свежие данные всегда сверху и нумерация идет по нарастающей.
и лучше все таки избавиться от таких перлов: "...dbo_DATA.DATE, dbo_DATA.DATE..."
"dbo_DATA.COUNT" - не нужно использовать зарезервированные слова
...
Рейтинг: 0 / 0
19.01.2019, 23:46
    #39761935
mikle08es2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
vmag,
Там число записей, около 20 000
...
Рейтинг: 0 / 0
20.01.2019, 00:18
    #39761947
mikle08es2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
ПЕНСИОНЕРКА,
Спасибо, как всегда помогли.


Все гениальное просто, особенно когда хорошо в чем то разбираешься.
...
Рейтинг: 0 / 0
20.01.2019, 00:19
    #39761949
mikle08es2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordcount в цикле. определение количества записей recordset.
alecko,

спасибо, вроде тоже работает.
...
Рейтинг: 0 / 0
21.01.2019, 11:13
    #39762259
Recordcount в цикле. определение количества записей recordset.
1. У Recordset-а есть св-во AbsolutePosition. Показывает значения от 0 до RecordCount-1. В вашем случае он бодходит вам идеально.
2. Зачем вы, вообще, пошли по пути поячеечного внесения данных? Это, как минимум, долго.
Если нет МЕМО полей, то метод листа CopyFromRecordset зальет вам все данные одной строкой кода.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordcount в цикле. определение количества записей recordset. / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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