powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF
35 сообщений из 35, показаны все 2 страниц
подсчет строк в таблице DBF
    #35678156
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дурацкий вопрос возник.. Вот я обращаюсь к файлу БД (dbf/dbase IV) посредством компонентов ADO из VBA(Excel). Мне нужно посчитать количество некоторых строк в файле/таблице БД и затем записать их в массив.

Есть два алгоритма:
1. посчитать количество строк средствами SQL языка, т.е. таким запросом:
Код: plaintext
SELECT COUNT(*) FROM (SELECT DISTINCT NAME1 FROM DB) TMP
почему-то конструкция
Код: plaintext
COUNT(DISTINCT NAME1)
не работает и пришлось так выкручиваться.. :( используя эти данные выделяем массив под строки
затем вторым запросом
Код: plaintext
SELECT DISTINCT NAME1 FROM DB ORDER BY NAME1
вытаскиваются сами строки и записываются в массив.
для каждого из запросов открывается рекордсет(!) просьба учитывать и это..

2. вытаскиваем данные запросом:
Код: plaintext
SELECT DISTINCT NAME1 FROM DB ORDER BY NAME1
затем курсором пробегаем все записи пересчитывая записи.. используется конструкция
Код: plaintext
1.
2.
3.
While Not Recordset.EOF
    i = i +  1 
    Recordset.MoveNext 
Wend
после этого встаю снова на первую запись
Код: plaintext
Recordset.MoveFirst
и заполняю массив..
при этом рекордсет открывается один раз..


Какой способ будет оптимальнее???
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678257
Код: plaintext
SELECT COUNT(DISTINCT NAME1) FROM DB
[/quot]
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678311
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.,

я же написал, что он ругается на отсутствие оператора при использовании подобной конструкции.. да ивопрос в другом был пвообще-то...
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678335
Евгений_Анатольевичпроходящий.,

я же написал, что он ругается на отсутствие оператора при использовании подобной конструкции.. да ивопрос в другом был пвообще-то...
Во-первых, кострукцию надо бы прочитать и рассмотреть подробно не забывая внимательно ее сравнить с оригиналом.
Во-вторых, правилом хорошего тона явлчется приведение копии сообшения об ошибке, а не ее переводили интерпретацию, равно как и строки, на которую выдается ругань.
В-третьих, вот такой код у меня почему-то работает. Что я не так делаю?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Create Cursor db (name1 c( 10 ))
Insert into db values ('asdff'
Insert into db values ('asdff')
Insert into db values ('asddf')
Insert into db values ('assdf')
Insert into db values ('abcde')
Insert into db values ('abcdf')
SELECT COUNT(DISTINCT NAME1) FROM DB
Или таки неправильно делаю не я?
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678364
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.,

ок, сейчас приведу пример ошибки
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678383
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая ошибки при таком запросе:

Код: plaintext
SELECT COUNT(DISTINCT NMOV1) AS CNT FROM DB
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678393
Евгений_АнатольевичВот такая ошибки при таком запросе:

Код: plaintext
SELECT COUNT(DISTINCT NMOV1) AS CNT FROM DB

Это не ошибка фокса. Это ошибка VB. Покажите кусок кода, на который ругается.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678404
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Евгений_АнатольевичВот такая ошибки при таком запросе:

Код: plaintext
SELECT COUNT(DISTINCT NMOV1) AS CNT FROM DB

Это не ошибка фокса. Это ошибка VB. Покажите кусок кода, на который ругается.


Код: plaintext
1.
2.
3.
    strSqlString = "SELECT COUNT(DISTINCT NMOVE1) AS CNT FROM DB"
    rstRset.Open strSqlString
    lngRowsNM1 = CLng(rstRset("CNT")) -  1 
    rstRset.Close
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678409
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на эту строку:
Код: plaintext
rstRset.Open strSqlString
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678427
Где-то что-то не так с настройкой рекордсета. Строка запроса вроде как должна быть передана объекту Command?
Короче, до фокса дело не доходит.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678435
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Где-то что-то не так с настройкой рекордсета. Строка запроса вроде как должна быть передана объекту Command?
Короче, до фокса дело не доходит.

не обязательно создавать объект command для передачи запроса, можно и таким способом, но ради чистоты эксперимента я добавлю еще одно промежуточное звено в виде объекта Command и напишу результат.. :)
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678467
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
    strSqlString = "SELECT COUNT(DISTINCT NMOVE1) AS CNT FROM DB"
    With cmdComm
    .CommandText = strSqlString
    .CommandType = adCmdText
    .Execute
    End With

как я и предполагал.. точно такая же ошибка в момент исполнения: .Execute

проблема остается открытой..
ктсати про фокс никто и не говорил, что он глючит.. обращение вообще к (dbf/dbase IV) идет, что указано в 1 сообщение темы...
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678472
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если проблема не в БД, то можно ли тред перенести в другой раздел? наверное лучше в форум по Visual Basic..

хотя вопрос был отчасти и по архитектуре построения запроса к БД..
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678572
Единственное, что могу предложить - использовать VFP OLEDB Provider. Он такой синтаксис точно поддерживает. Во всех остальных случаях вопрос явно не в тот форум.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678611
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Единственное, что могу предложить - использовать VFP OLEDB Provider. Он такой синтаксис точно поддерживает. Во всех остальных случаях вопрос явно не в тот форум.

вообще-то использовать этот драйвер в данном случае неверно.. то соединение - которое использовалось является стандартом подключения к dbf/foxpro..

а по поводу соответствия тематики вы к сожалению не дочитали сам вопрос до конца.. :) Но спасибо, что попытались помочь и разобраться в друго проблеме.. :)
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678647
Евгений_Анатольевичпроходящий.Единственное, что могу предложить - использовать VFP OLEDB Provider. Он такой синтаксис точно поддерживает. Во всех остальных случаях вопрос явно не в тот форум.

вообще-то использовать этот драйвер в данном случае неверно.. то соединение - которое использовалось является стандартом подключения к dbf/foxpro..

И что это за стандарт такой объявился?

а по поводу соответствия тематики вы к сожалению не дочитали сам вопрос до конца.. :)
И это можно доказать?
Но спасибо, что попытались помочь и разобраться в друго проблеме.. :)
Dbf и FoxPro - отнюдь не полные синонимы. Потому не всякий вопрос, касающийся dbf относится и к фоксу. И ADO вместе с его рекордсетами для доступа к данным фоксу как собаке пятая нога. Потому рассмотреть с помощью знатоков фокса оптимальность неиспользующихся в фоксе методов несколько наивно. Отсюда вывод - если только не используется фоксовый драйвер в исходном вопросе ничего относящегося к фоксу нет и вопрос должен обсуждаться в другом форуме.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678670
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.,

http://connectionstrings.com/?carrier=dbffoxpro

:) никто и не спорит про другой форум.. скажем часть вопроса можно проще озвучить было:

что быстрее работает: подсчет строк средствами SQL языка или если пробежаться по рекордсету курсором?

потому что у меня и тот и другой случай приблизительно одинаково времени заняли "на глаз".. а хотелось бы точно знать.. ведь по идее запрос с COUNT должен работать оптимальнее..

с другой стороны во втором случае один раз идет обращение к БД а в первом два запроса.. т.е. оже различное время уйдет на обработку..

это проблема имеет 2 ракурса как со стороны программирования, так и со стороны оптимальных запросов к БД.. учитывая, что DBA у нас зачастую имеют приличный опыт еще и в программировании, ну и лучше ориентируются в скорости работы с такими БД как фокс или dbase - я и поместил вопрос сюда...
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678700
Fffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений_Анатольевич!
По приведенной вами ссылке читаем
"For your foxpro 2.x DBF you do not need to use dBase or Jet driver, check out the "Visual FoxPro / FoxPro 2.x" section instead and use the VFP driver. Visual FoxPro ODBC and OLEDB drivers work for all Foxpro tables including the oldest foxbase tables and dBaseII, dBaseIII, Clipper files as well."
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678726
Евгений_Анатольевичпроходящий.,

http://connectionstrings.com/?carrier=dbffoxpro

И какой драйвер в этом случае работает? Фоксовый? Если нет, то каким боком тут фокс? Только из-за DBF? Но в нем только данные и никакой фоксовой логики нет.

:) никто и не спорит про другой форум.. скажем часть вопроса можно проще озвучить было:

что быстрее работает: подсчет строк средствами SQL языка или если пробежаться по рекордсету курсором?

В фоксе нет рекордсетов и потому невозможно измерить скорость пробегания по ним.
DBF - это только данные. Скорость доступа определяется не ими, а используемым драйвером. Которые могут быть совершено не фоксовыми. Опять мимо кассы.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35678782
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fffffffffffff Евгений_Анатольевич!
По приведенной вами ссылке читаем
"For your foxpro 2.x DBF you do not need to use dBase or Jet driver, check out the "Visual FoxPro / FoxPro 2.x" section instead and use the VFP driver. Visual FoxPro ODBC and OLEDB drivers work for all Foxpro tables including the oldest foxbase tables and dBaseII, dBaseIII, Clipper files as well."

пытаюсь прикрутить обращения через драйвер VFP.. пока ругается на то что не может найти поставщика..

проходящий. ,

не стоит быть столь критичным.. людям свойственно ошибаться..

Модератор: Тема перенесена из форума "FoxPro, Visual FoxPro".
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35679794
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди, отзовитесь!!! :) Очень нужна помощь..
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680023
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Евгений_Анатольевич
> Люди, отзовитесь!!! :) Очень нужна помощь..

Этот
провайдер пробовали?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680054
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если сделать так

Код: plaintext
1.
2.
rs.open "SELECT DISTINCT NAME1 FROM DB", .....
rs.RecordCount
 


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680145
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Евгений_Анатольевич
> Люди, отзовитесь!!! :) Очень нужна помощь..

Этот
провайдер пробовали?

--
С уважением Горбонос Игорь Леонидович



Нет, и если честно - не понимаю почему при неправильном синтаксисе надо переходить сразу на других провайдеров :) Могу сказать на данный момент с уверенностью вот что: синтаксис запросов для провайдера Microsoft.Jet.OLEDB.4.0 (как минимум для файлов dbase IV) полностью идентичен синтаксису запросов в Access!!!!

Почему я это отверждаю? потому что первая проблема которая озвучена выше - имеет место быть с точно таким же описанием ошибки в Access!!! Только что создал в нем базу и проверил!!! Кроме того была проблема, которую не стал на форуме подымать, с JOIN синтаксис у которых в Access отличается от аналогичных функций в MSSQL!!!!

Теперь только осталось установить как же правильно использовать DISTINCT в запросах совместно с COUNT!!!

Вот такие пироги с котятами :) драйвера тут не при чем :)

HandKotа если сделать так

Код: plaintext
1.
2.
rs.open "SELECT DISTINCT NAME1 FROM DB", .....
rs.RecordCount
 


I Have Nine Lives You Have One Only
THINK!

А зачем? Не очень понял..
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680170
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порылся я на форуме..Подвожу итог изысканиям.. Действительно в отличие от MSSQL в запросах с использованием стандартного дравера следует применять именно такой корявый синтаксис для DISTINCT:
Код: plaintext
SELECT COUNT(*) FROM (SELECT DISTINCT NAME1 FROM DB) TMP

Теперь можно вернуться к первоначальному вопросу:
так какой же из алгоритмов все-таки оптимальнее и быстрее???
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680215
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Евгений_Анатольевич
> Вот такие пироги с котятами :) драйвера тут не при чем :)

Драйвера здесь причем в первую очередь, потому что они транслируют и в данном случае выполняют ваш запрос и если они
старые, то они могут не понимать новый синтаксис языка.


> А зачем? Не очень понял..

предлагают посчитать количество записей уже на клиенте, что на мой взгляд неправильно изначально, но как вариант, можно
использовать

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680222
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Евгений_Анатольевич
> SELECT COUNT(*) FROM (SELECT DISTINCT NAME1 FROM DB) TMP
> Теперь можно вернуться к первоначальному вопросу:
> так какой же из алгоритмов все-таки оптимальнее и быстрее???


А здесь, я не понял, запрос всего один, и алтернативы я не вижу. Какие алгоритмы вы имели в виду?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680250
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
With objRecordset

SELECT CASE .EOF

     CASE IS = TRUE 
          MsgBox "Рекордсет не содержит записей", vbInformation: Exit Sub
     
    CASE IS = FALSE
           .MoveLast
           .MoveFirst
           MsgBox "Количество записей = " .RecordCount
END SELECT

End With

А что касается того что быстрее то можно используя Time или GetTickCount посчитать сколько времени тратится на каждый из способов
С уважением, Николай.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680266
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносА здесь, я не понял, запрос всего один, и алтернативы я не вижу. Какие алгоритмы вы имели в виду?

текст взят из 1го сообщенияЕсть два алгоритма:
1. посчитать количество строк средствами SQL языка, т.е. таким запросом:
Код: plaintext
SELECT COUNT(*) FROM (SELECT DISTINCT NAME1 FROM DB) TMP
используя эти данные выделяем массив под строки
затем вторым запросом
Код: plaintext
SELECT DISTINCT NAME1 FROM DB ORDER BY NAME1
вытаскиваются сами строки и записываются в массив.
для каждого из запросов открывается рекордсет(!)


2. вытаскиваем данные запросом:
SELECT DISTINCT NAME1 FROM DB ORDER BY NAME1
затем курсором пробегаем все записи пересчитывая их.. используется конструкция
Код: plaintext
1.
2.
3.
While Not Recordset.EOF
    i = i +  1 
    Recordset.MoveNext 
Wend
после этого встаю снова на первую запись
Код: plaintext
Recordset.MoveFirst
и заполняю массив..
при этом рекордсет открывается один раз..
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680272
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjc,

я считаю не общее количество записей :) за идею использовать таймер - спасибо.. совсем забыл про такую фичу.. %)
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680285
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял что не всех, я имел ввиду что вместо конструкции

Код: plaintext
1.
2.
3.
4.
While Not Recordset.EOF
    i = i +  1 
    Recordset.MoveNext 
Wend
Recordset.MoveFirst

я использую
Код: plaintext
1.
2.
.MoveLast
 .MoveFirst
 MsgBox "Количество записей = " .RecordCount
С уважением, Николай.
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680291
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjc,

теперь понял! ведь во втором случаей действительно количество записей ограничено уже самой формой запроса.. хм.. получается, что сделать уже итоговую выборку эффективнее будет, потому что сам рекордсет всегда содержит количество полученных запросом записей(!)
спасибо!!! :)
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680324
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Евгений_Анатольевич
> Recordset.MoveFirstи заполняю массив..
> при этом рекордсет открывается один раз..


Ах, вот в чем дело :)
тогда предлагаю пересмотреть подход, например, на такой:
Код: plaintext
1.
2.
3.
4.
Dim v As Variant
strSqlString = "SELECT DISTINCT NMOVE1 AS CNT FROM DB"
    rstRset.Open strSqlString
    v = rstRset.GetRows
    rstRset.Close



--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680345
Евгений_Анатольевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

спасибо, приду домой - потестирую :)
...
Рейтинг: 0 / 0
подсчет строк в таблице DBF
    #35680865
piterblinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Единственное, что могу предложить - использовать VFP OLEDB Provider. Он такой синтаксис точно поддерживает. Во всех остальных случаях вопрос явно не в тот форум.
Да, да версию 9.0, все остальное ни черта как надо не работает, а ставишь 9.0 все работает нормально. Ну а что быстрее, ну сам протестируй.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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