powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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