Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF / 25 сообщений из 35, страница 1 из 2
27.11.2008, 08:42
    #35678156
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
Дурацкий вопрос возник.. Вот я обращаюсь к файлу БД (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
27.11.2008, 09:42
    #35678257
подсчет строк в таблице DBF
Код: plaintext
SELECT COUNT(DISTINCT NAME1) FROM DB
[/quot]
...
Рейтинг: 0 / 0
27.11.2008, 10:06
    #35678311
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
проходящий.,

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

я же написал, что он ругается на отсутствие оператора при использовании подобной конструкции.. да ивопрос в другом был пвообще-то...
Во-первых, кострукцию надо бы прочитать и рассмотреть подробно не забывая внимательно ее сравнить с оригиналом.
Во-вторых, правилом хорошего тона явлчется приведение копии сообшения об ошибке, а не ее переводили интерпретацию, равно как и строки, на которую выдается ругань.
В-третьих, вот такой код у меня почему-то работает. Что я не так делаю?
Код: 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
27.11.2008, 10:26
    #35678364
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
проходящий.,

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

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

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

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

Код: 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
27.11.2008, 10:43
    #35678409
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
на эту строку:
Код: plaintext
rstRset.Open strSqlString
...
Рейтинг: 0 / 0
27.11.2008, 10:52
    #35678427
подсчет строк в таблице DBF
Где-то что-то не так с настройкой рекордсета. Строка запроса вроде как должна быть передана объекту Command?
Короче, до фокса дело не доходит.
...
Рейтинг: 0 / 0
27.11.2008, 10:56
    #35678435
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
проходящий.Где-то что-то не так с настройкой рекордсета. Строка запроса вроде как должна быть передана объекту Command?
Короче, до фокса дело не доходит.

не обязательно создавать объект command для передачи запроса, можно и таким способом, но ради чистоты эксперимента я добавлю еще одно промежуточное звено в виде объекта Command и напишу результат.. :)
...
Рейтинг: 0 / 0
27.11.2008, 11:07
    #35678467
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
Код: 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
27.11.2008, 11:10
    #35678472
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
ну если проблема не в БД, то можно ли тред перенести в другой раздел? наверное лучше в форум по Visual Basic..

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

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

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

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

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

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

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

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

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

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

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

это проблема имеет 2 ракурса как со стороны программирования, так и со стороны оптимальных запросов к БД.. учитывая, что DBA у нас зачастую имеют приличный опыт еще и в программировании, ну и лучше ориентируются в скорости работы с такими БД как фокс или dbase - я и поместил вопрос сюда...
...
Рейтинг: 0 / 0
27.11.2008, 12:17
    #35678700
Fffffffffffff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
Евгений_Анатольевич!
По приведенной вами ссылке читаем
"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
27.11.2008, 12:22
    #35678726
подсчет строк в таблице DBF
Евгений_Анатольевичпроходящий.,

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

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

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

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

В фоксе нет рекордсетов и потому невозможно измерить скорость пробегания по ним.
DBF - это только данные. Скорость доступа определяется не ими, а используемым драйвером. Которые могут быть совершено не фоксовыми. Опять мимо кассы.
...
Рейтинг: 0 / 0
27.11.2008, 12:36
    #35678782
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
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
27.11.2008, 16:17
    #35679794
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
Люди, отзовитесь!!! :) Очень нужна помощь..
...
Рейтинг: 0 / 0
27.11.2008, 17:11
    #35680023
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
> Автор: Евгений_Анатольевич
> Люди, отзовитесь!!! :) Очень нужна помощь..

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

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

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

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


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

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

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



Нет, и если честно - не понимаю почему при неправильном синтаксисе надо переходить сразу на других провайдеров :) Могу сказать на данный момент с уверенностью вот что: синтаксис запросов для провайдера 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
27.11.2008, 17:56
    #35680170
Евгений_Анатольевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подсчет строк в таблице DBF
Порылся я на форуме..Подвожу итог изысканиям.. Действительно в отличие от MSSQL в запросах с использованием стандартного дравера следует применять именно такой корявый синтаксис для DISTINCT:
Код: plaintext
SELECT COUNT(*) FROM (SELECT DISTINCT NAME1 FROM DB) TMP

Теперь можно вернуться к первоначальному вопросу:
так какой же из алгоритмов все-таки оптимальнее и быстрее???
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / подсчет строк в таблице DBF / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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