Количество записей в рекордсете

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Количество записей в рекордсете

Сообщение sergey-911 » 16.03.2005 (Ср) 7:43

Доброго времени суток уважаемые. :D
Собственно, проблема заключается в следующем:
нужно в ходе заполнения таблицы для пользователя отобразить прогресс бар, информирующий о ходе выполнения данного процесса.
Для этого, перед основным оператором Select (с условием), я запускаю еще один Select Count (с тем же условием), который выводит количество строк.
Но ведь можно, каким либо образом вывести число строк именно свойствами рекордсета, или еще каким-либо образом, чтобы не запускать вспомогательный Select, выводящий число записей. Ведь на его выполнение уходит время.
Как реализовать это.
Простите за ламерский вопрос.
С уважением, Сергей.

Костя
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 14.02.2005 (Пн) 6:45
Откуда: Новосибирск

Сообщение Костя » 16.03.2005 (Ср) 8:22

rs.recordcount
Всё бывает!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2005 (Ср) 8:47

Только убедись, что курсор клиентский.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.03.2005 (Ср) 10:51

Либо, если это свойство возвращает тебе -1, после получения рекордсета сделай:
Код: Выделить всё
Rec.MoveLast
Rec.MoveFirst

Говорят, помогает.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Количество записей в рекордсете

Сообщение Andrey Fedorov » 16.03.2005 (Ср) 11:04

sergey-911 писал(а):Для этого, перед основным оператором Select (с условием), я запускаю еще один Select Count (с тем же условием), который выводит количество строк.


И что, сильная разница во времени между двумя этими запросами?
Она может быть заметна если только ты тянешь с сервера огромадное количество записей.

До конца выполнения запроса время его выполнения ты не узнаешь, да и даже абсолютно одинаковоый запрос может выполняться разное время (загрузка сервера, сети). Так что подобие прогрессбара рисовать можно примерно орентируясь, к примеру на время выполнения ранее выполненого запроса. А еще лучше вместо прогрессбара выводить какую-нибудь анимацию (GIF или AVI), которая показывает что программа работает и выполняет запрос...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 16.03.2005 (Ср) 18:43

Всем доброго времени суток.

Код: Выделить всё
rs.recordcount

у меня всегда выдает -1 (по видимому ошибку).
Код: Выделить всё
rs.MoveLast
rs.MoveFirst

не помогает.
В чем подвох?

Andrey Fedorov
Разница заметна существенно.
Мне и самому прогресс бар выводить не нравится. Для его отображения я вывожу вспомогательную форму с прогрес баром, которая, по всей видимости и ест ресурсы, плюс еще и дополнительный запрос... В сумме - приличная задержка.
Если тебе не в лом - скинь исходник с анимацией. Буду крайне признателен. Мне эта заморочка - покоя не дает приличное время.

Ни кто не знает, как прогресс бар отобразить в окне статуса миди формы?

А "rs.recordcount" я пробовал и прежде, чем обратиться за помощью на форум. Результат был тот же "-1".


В общем, вопрос остается открытым...
С уважением, Сергей.

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Сообщение Andrev » 16.03.2005 (Ср) 18:55

Насколько я помню рекордсеты, свойство .RecocordCount выдает количество записей в рекордсете, к которым обратился пользователь. Таким образом, при вызове метода .MoveLast ма перемещаем указатель на последнюю запись, иными словами, мы как бы перебираем весь рекордсет. В принципе, если необходимо узнать только количество записей в рекордсете, этого достаточно. Но если затем необходимо будет работать с этим рекордсетом, то нам необходимо вызвать метод .MoveFirst для перемещения указателя на первую запись.
В этой жизни нет ничего невозможного. Если у вас что-то не получается, значит, вы что-то делаете не так.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 16.03.2005 (Ср) 23:58

Andrev
Я это понимаю. Но "rs.recordcount" Выдает ошибку. Вышли исходник - тогда я пойму, как свойство "rs.recordcount" работает. Сейчас же - я, мягко говоря, сомневаюсь в этом высказывании....
С уважением, Сергей.

Костя
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 14.02.2005 (Пн) 6:45
Откуда: Новосибирск

Сообщение Костя » 17.03.2005 (Чт) 5:45

У меня rs.recordcount = -1 выдавал в том случае, когда первая строка была пустой (не знаю почему, но в одной из oracl'овских баз первая строка всегда была пустой). Я эту проблему решил програмно удаляя первую строчку при загрузке. Потом у меня шла сортировка и обновление, и только после этого rs.recordcount.
Всё бывает!

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 17.03.2005 (Чт) 6:53

Костя
У меня во всех строках находится информация. Пустых нет. Сетка заполняется полностью, если я все правильно понял.
С уважением, Сергей.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 17.03.2005 (Чт) 8:04

Про progressbar: Если у тебя есть открытый результирующий запрос с нужными записями которые ты загоняешь в таблицу. То делать можно примерно так:
Код: Выделить всё
form1.progressbar1.min=1
form1.progressbar1.max=rs.recordcount
rs.movefirst
i=1
do until rs.eof
  form1.progressbar1.value=i
  ...заполняешь таблицу текущей записью
  rs.movenext
  i=i+1
loop
rs.close

А почему у тебя выдает - 1, не понятно - покажи свой код: как подключаешься к базе, как открываешь recordset и выполняешь запрос. Будет понятнее.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 8:23

.RecordCount = -1 в том случае, когда это неприменимо; например используется серверный курсор.
Используй клиентский курсор или делай select count()
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.03.2005 (Чт) 10:28

sergey-911 писал(а):Если тебе не в лом - скинь исходник с анимацией.


Держи - собрал простенький...
Вложения
PB.RAR
(20.44 Кб) Скачиваний: 2516
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 17.03.2005 (Чт) 22:18

Всем доброго времени суток и спасио огромное. Сегодня посмотреть не могу - пришли друзья. Посмотрю завтра. :D
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 17.03.2005 (Чт) 22:21

Алексей К.
С обновлением прогресс бара понятно. Вопрос в том - как его поместить в статус формы?
С уважением, Сергей.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 18.03.2005 (Пт) 7:48

Статус формы - это где? Progressbar обычно располагают на форме, либо перед загрузкой результирующей формы можно показать spalsh форму с progressbar. Где-то видел вариант progressbar в заголовке формы через api.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.03.2005 (Пт) 23:41

Всем доброго времени суток.

Алексей К.
я имел ввиду статус бар формы. В него хочу поместить прогресс бар. Например в окне браузера, при загрузке странички - отображается ход выполнения данной операции прогресс баром в статус баре, или в офисе, при загрузке\сохранении файла.

alibek
В чем разница, между серверным курсором и клиентским? Как реализовать клиентский? Прошупрощения за вопрос?


Спасибо.
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.03.2005 (Пт) 23:55

Код: Выделить всё
Rs.CursorLocation = adUseClient

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:05

Привожу пример заполнения таблица. Основная процедура заполнения "RefreshLv" в форме frmAlStal. Прошу прощения, пример не совсем удачный, много лишнего.
Возможно кого заинтересует - для печати используется F1Book1 (нужны дополнительные библиотеки - прилагаются).
Вложения
Primer.rar
(216.54 Кб) Скачиваний: 86
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:07

Библиотеки
Вложения
dll.rar
(914.24 Кб) Скачиваний: 72
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:12

Уважаемые, может, кто укажит на ошибки и на то, как реализовать rs.recordcount. Или поправит и скинет пример.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:21

Konst_One
Спасибо.
Я что-то делаю не так. Выдается ошибка.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:25

Код: Выделить всё
Private Sub RefreshLv(where As String, ID As Long)
On Error GoTo Er

    Dim query As String
    Dim j As Long
    Dim itmX As ListItem
    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    Dim Flag As Boolean
       
    lvMain.ListItems.Clear
   
    lvMain.ColumnHeaders(Kol + 1).Width = 0 '1 - количество идентификаторов
   
    query = query & "SELECT COUNT (*) "
    query = query & "FROM Munits "
   
    Set cn = New ADODB.Connection
    cn.Open (Soedinenie)
       
    Set rs = cn.Execute(query & where)   'подсчет суммы записей в БД

    'V Прогрес бар*********************************************************************************************************************
    If Not IsNull(rs.Fields(0)) And rs.Fields(0) > 0 Then
        frmWait.ProgressBar1.Min = 0
        frmWait.ProgressBar1.Max = rs.Fields(0)
    End If
       
    frmWait.Height = 2185
    frmWait.ProgressBar1.Visible = True
    frmWait.Refresh
    'A Прогрес бар*********************************************************************************************************************
   
    query = "SELECT "
    query = query & "Munits.Nazv, "     '(0)
    query = query & "Munits.Tel, "      '(1)
    query = query & "Munits.Mesto, "    '(2)
    query = query & "Munits.MunitsID "  '(3)
    query = query & "FROM Munits "
       
    Set rs = cn.Execute(query & where & " ORDER BY Munits.Nazv")
   
    ' Здесь должен работать rs.recordcount
   
    Do Until rs.EOF
                                   
        If IsNull(rs.Fields(0)) Then
            Set itmX = lvMain.ListItems.Add(, , "", 0, 0)
            Else
            Set itmX = lvMain.ListItems.Add(, , rs.Fields(0), 0, 0)
        End If
                           
        If IsNull(rs.Fields(1)) Then
            itmX.SubItems(1) = ""
            Else
            itmX.SubItems(1) = rs.Fields(1)
        End If
                           
        If IsNull(rs.Fields(2)) Then
            itmX.SubItems(2) = ""
            Else
            itmX.SubItems(2) = rs.Fields(2)
        End If
                           
        If IsNull(rs.Fields(3)) Then
                itmX.SubItems(3) = ""
            Else
                itmX.SubItems(3) = rs.Fields(3)
                'V Выделяем правленную запись в таблице путем сравнения идентификатора****************************************************
                If ID > 0 And ID = rs.Fields(3) Then
                    For j = 1 To CLng(Me.lvMain.ListItems.Count)
                        'V InStr - сравнить ==> сравниваем только, что найденный ID с существующим в таблице
                        If CLng(InStr(CStr(lvMain.ListItems(j).ListSubItems(3).Text), CStr(rs.Fields(3)))) > 0 Then
                            lvMain.SelectedItem = lvMain.ListItems(j)   'Курсор на нужную запись
                            Exit For
                        End If
                    Next j
                End If
                'A Выделяем правленную запись в таблице путем сравнения идентификатора****************************************************
        End If
                                                       
        'Следующая запись
        rs.MoveNext
               
        'V Обновление прогресбара*******************************************************************************************************
        If frmWait.ProgressBar1.Value < frmWait.ProgressBar1.Max Then
            frmWait.ProgressBar1.Value = frmWait.ProgressBar1.Value + 1  'прогрес бар
        End If
        'A Обновление прогресбара*******************************************************************************************************
    Loop
                       
    rs.Close
    Set rs = Nothing
    Set cn = Nothing
               
    lvMain.Refresh
   
    If Me.lvMain.ListItems.Count > 0 Then   'Таблица заполнена
        If j > 0 Then   'В случае, если была помечена запись
            lvMain.SelectedItem.EnsureVisible   'Переход на указанную строку
        Else            'В случае, если запись не была помечена
            lvMain.SelectedItem = lvMain.ListItems(1)   'Курсор на нужную запись
            lvMain.SelectedItem.EnsureVisible   'Переход на указанную строку
        End If
    End If
   
    'V скрытие формы ожидания*******************************************************************************************************
    frmWait.Hide
    'A скрытие формы ожидания*******************************************************************************************************

Exit Sub
Er:
Set rs = Nothing
Set cn = Nothing
'V скрытие формы ожидания*******************************************************************************************************
frmWait.Hide
'A скрытие формы ожидания*******************************************************************************************************
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

Процедура заполнения
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.03.2005 (Сб) 1:27

Извините за назойливость. Очень нужна помощь.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 21.03.2005 (Пн) 1:18

Andrey Fedorov
Спасибо за исходник
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 21.03.2005 (Пн) 2:22

Всем доброго времени суток.
Код: Выделить всё
    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection

    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient   'Клиентский курсор
    Dim Soedinenie As String   'Параметры подключения
    cn.Open (Soedinenie)
     ....
    'Выполнение запроса и заполнение сетки.
    ...
    MsgBox (rs.RecordCount)    'Количество записей
    rs.Close
    Set rs = Nothing
    Set cn = Nothing


Вроде работает.

alibek
Ты был прав, как всегда. Дело в типе курсора.
Не посмотришь? Опять нужна помощь.
http://bbs.vbstreets.ru/viewtopic.php?t=14200

Konst_One
Спасибо за подсказку.

А клиентский курсор, насколько я понимаю, это отсоединенный набор записей. Это накладывает какие-либо ограничения при работе с ним?

Еще разобраться бы с диалогом открытия папки и прогрессбаром в статусе миди формы....
Наподобие представленного примера.
Вложения
Sample.rar
(20.55 Кб) Скачиваний: 82
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.03.2005 (Пн) 8:46

sergey-911 писал(а):А клиентский курсор, насколько я понимаю, это отсоединенный набор записей. Это накладывает какие-либо ограничения при работе с ним?

Не то, чтобы отсоединенный, просто набор записей размещается у клиента. Ограничений на функциональность как таковых нет, но минусом (иногда очень большим) является то, что эти данные переносятся с сервера на клиента, а если данных много, то тормоза и большой трафик обеспечены.
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 22.03.2005 (Вт) 0:01

alibek
А каким образом работает серверный курсор? Разьве данные к клиенту не переносятся? Или же только часть данных (просматриваемая в данный момент)?
С уважением, Сергей.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 22.03.2005 (Вт) 7:55

Если еще не разобрался с прогрессом, вот посмотри, все изменения под себя делай в процедуре обработки нажатия кнопки, таймер просто для замедления в примере был приведен (я его убрал).
Вложения
Прогресс.rar
(3.99 Кб) Скачиваний: 118

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 22.03.2005 (Вт) 20:04

Алексей К.
Спасибо большое Алексей. Крайне признателен за пример.
С уважением, Сергей.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 182

    TopList