Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF / 25 сообщений из 30, страница 1 из 2
28.11.2013, 14:46
    #38481837
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Уважаемые коллеги!!!
Прошу прощения, за чайниковский вопрос но возможно ли написать пользовательскую функцию для Excell 2010 на основе ADODB, чтобы делался запрос к файлу базы данных DBF? Я написал и долго пользовался подобной функцией на основе класса BPDBF в Excell 2003, но при переходе на 2010 этот класс перестал работать. :-(
Может быть у кого-то есть ссылки на учебники по ADODB, примеры, собственные наработки? Задача проста- в функции задается аргумент А, этот аргумент ищется в файле базы данных DBF в определенном поле -Поле1. Из Поля2 записи содержащей аргумент А в Поле1 результат выдается в ячейку. Начал писать но не могу отладить и нет понимания.
Если нужно могу выложить функцию на основе класса BPDBF, но думаю здесь аналогии неуместны.
Заранее всем спасибо!

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Function СТРАНА(N) As String


    Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
    ' connect to the Access database
    FirstRowHasNames = 1
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\ADODB\;Extended Properties=""DBASE IV;"";"
    ds = cn.Execute("SELECT * FROM COUNTRS.dbf")
    
    
    
For i = 0 To N

rs.MoveNext

Next i
СТРАНА = rs.Fields(4)

rs.Close

cn.Close
    
End Function

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
28.11.2013, 15:49
    #38481983
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
...
Рейтинг: 0 / 0
28.11.2013, 16:03
    #38482022
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
F вам ответил, а у меня встречные вопросы
Сергей ВВС
Код: vbnet
1.
2.
3.
For i = 0 To N
rs.MoveNext
Next i

разве в таблице COUNTRS у вас нет идентификаторов, соответствующих N?
и как вы можете быть уверены, что страны вернутся в определенном порядке, если не используете ORDER BY?
и зачем вам звездочка в запросе, если используете только четвертое поле?
...
Рейтинг: 0 / 0
28.11.2013, 16:07
    #38482034
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
в общем так как-то должно быть, иначе получается, что вы перекачиваете на клиенты ВСЮ таблицу со ВСЕМИ странами каждый раз, когда вызываете функцию, хотя вам нужно только ИМЯ столько ОДНОЙ страны
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Function СТРАНА(N) As String


    Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
    ' connect to the Access database
    FirstRowHasNames = 1
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\ADODB\;Extended Properties=""DBASE IV;"";"
    ds = cn.Execute("SELECT CountryName FROM COUNTRS.dbf WHERE ID=" & CStr(N))
    
СТРАНА = rs.Fields(1)

rs.Close

cn.Close
    
End Function
...
Рейтинг: 0 / 0
28.11.2013, 16:44
    #38482122
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,
большое САСИБО за ответ, попробую.
Только у меня маленький вопрос - CountryName это имя поля в базе?
...
Рейтинг: 0 / 0
28.11.2013, 17:15
    #38482200
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Вмеcто CountryName и ID подставьте реальные названия полей
...
Рейтинг: 0 / 0
28.11.2013, 20:24
    #38482511
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,
подставил, попробовал, что-то не работает

Function ÑÒÐÀÍÀ(N) As String


Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
' connect to the Access database
FirstRowHasNames = 1
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\ADODB\;Extended Properties=""DBASE IV;"";"
ds = cn.Execute("SELECT NAME17 FROM COUNTRS.dbf WHERE ALFA2=" & CStr(N))

ÑÒÐÀÍÀ = rs.Fields(1)

rs.Close

cn.Close

End Function
...
Рейтинг: 0 / 0
28.11.2013, 20:25
    #38482513
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Со строкой подключения разобрался?

ЗЫ: и для кого я ссылку на FAQ давал?
...
Рейтинг: 0 / 0
28.11.2013, 21:03
    #38482551
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,
честно - нет,
чувствую себя полным идиотом. Может мне лучше книгу какую почитать для начала?
Даже неудобно.
Прошу прощения за теги.(вернее за неуменее ими пользоваться)
...
Рейтинг: 0 / 0
29.11.2013, 01:39
    #38482746
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
возможно стоит почитать

но ведь код уже готовый есть, осталось правильно написать строку подключения
...
Рейтинг: 0 / 0
01.12.2013, 22:57
    #38485324
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,

попробовал. Строка подключения вроде бы работает, но ругается на строку запроса.
Что не так?
...
Рейтинг: 0 / 0
02.12.2013, 00:37
    #38485375
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Вы-то сами в состоянии разобрать, что написано на скриншоте?
Я не вижу ни текста запроса, ни текста ошибки.
...
Рейтинг: 0 / 0
02.12.2013, 12:52
    #38485829
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Ошибка в синтаксисе, написано же. Пропущен оператор.
У Вас в CStr(N) что? Может одинарные кавычки не помешали бы(если это не число)?
Код: vbnet
1.
ds = cn.Execute("SELECT CountryName FROM COUNTRS.dbf WHERE ID='" & CStr(N) & "'")


а так соглашусь с Shocker.Pro полностью - ничего из скрина не видать толком. Ни строку запроса, ни номер ошибки.

P.S. По SQL запросам можете почитать книгу Мартина Грубера "Понимание SQL". Она простенькая и для начинающих самое оно.
...
Рейтинг: 0 / 0
30.12.2013, 15:40
    #38515957
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
The_Prist,
Здравствуйте,
я попробовал упростить задачу до максимума, но вс равно результата нет
функция возвращает в ячейку #ЗНАЧ!
Упрощения: ............WHERE code=40") т.е. в функции аргумент N не используется.
Поля в исходном файле COUNTRS.dbf CODE - Двойное с плавающей точкой, все остальные - текст
Что не так? Debug - ничего не дает, и функция не работает. :-(


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Function СТРАНА(N) As String

    Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long

    
    ' connect to the Access database
    FirstRowHasNames = 1
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\temp\;Extended Properties=""DBASE IV;"";"
    ds = cn.Execute("SELECT alfa2 FROM COUNTRS.dbf WHERE code=40")
    


СТРАНА = rs.Fields(1).Value



cn.Close
    
End Function



За книжку Грубера - БОЛЬШОЕ СПАСИБО!! Действительно простая и полезная.
...
Рейтинг: 0 / 0
30.12.2013, 18:27
    #38516135
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВС, ну поменяйте вы провайдера-то уже (на VFPOLEDB)...

А так... Что значит "дебаг ничего не даёт"? Остановите выполнение после запроса и посмотрите, где и что лежит в переменных и рекордсете. Подозреваю, что у вас запрос возвращает пустую выборку...

А, не, не подозреваю
Покажите мне код, в котором написано, что данные появляются в rs
...
Рейтинг: 0 / 0
30.12.2013, 18:33
    #38516141
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВС,

Если вам дали совет, это не значит, что нужно его использовать, не вникая в суть. Советчик сделал опечатку, вы тупо повторяете его ошибку.

читайте тут
...
Рейтинг: 0 / 0
31.12.2013, 12:58
    #38516487
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,
Спасибо за совет на счет Option Explicit. Но все равно не работает. И ошибок Debug не выдает. Что еще почитать?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Option Explicit
Function ÑÒÐÀÍÀ(N) As String

    Dim cn As ADODB.Connection, rs As ADODB.Recordset


    'Set cn = New ADODB.Connection
    'Set rs = New ADODB.Recordset
        
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\temp\;Extended Properties=""DBASE IV;"";"
    
    'Set rs = cn.Execute("SELECT ALFA2 FROM COUNTRS.DBF WHERE NAME17 ='ÀÍÃÎËÀ';")
    
    Set rs = cn.Execute("SELECT ALFA2 FROM COUNTRS.DBF WHERE NAME17 ='" & CStr(N) & "';")


ÑÒÐÀÍÀ = rs.Fields(1)


rs.Close

cn.Close
    
End Function
...
Рейтинг: 0 / 0
31.12.2013, 13:42
    #38516516
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВСНо все равно не работаетЧто означает "не работает"? функция либо должна вернуть какое-то значение, либо сгенерить ошибку. Третьего не дано.
...
Рейтинг: 0 / 0
31.12.2013, 15:40
    #38516569
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,
возвращает #ЗНАЧ!
...
Рейтинг: 0 / 0
31.12.2013, 15:47
    #38516572
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВСShocker.Pro,
возвращает #ЗНАЧ!Попробуйте изменить запрос на
Код: vbnet
1.
2.
Set rs = cn.Execute( "SELECT ALFA2 FROM COUNTRS WHERE NAME17 ='" & CStr(N) & "'") ' если тип поля NAME17 - строка
Set rs = cn.Execute( "SELECT ALFA2 FROM COUNTRS WHERE NAME17 =" & CStr(N) )       ' если тип поля NAME17 - число
...
Рейтинг: 0 / 0
31.12.2013, 16:21
    #38516604
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВСShocker.Pro,
возвращает #ЗНАЧ!а если ее выполнить в окне Immediate?
...
Рейтинг: 0 / 0
31.12.2013, 16:54
    #38516618
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Shocker.Pro,

Compile error: Invalid in Immediate pane
...
Рейтинг: 0 / 0
31.12.2013, 18:26
    #38516649
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВСCompile error: Invalid in Immediate paneНе, ну достанешь же. Мёртвого.
Как Гришу Перельмана - нобелёвский комитет.

Если потерял нитку темы - так признайся, что перестал понимать.
И не надо долбить свой код - он от тыкания копипаста не улучшится... (поскольку фэйспалма не предусмотрено)
...
Рейтинг: 0 / 0
31.12.2013, 19:12
    #38516666
Сергей ВВС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
AndreTM,
Мертвый? Не пиши сюда.
...
Рейтинг: 0 / 0
31.12.2013, 19:58
    #38516681
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF
Сергей ВВСCompile error: Invalid in Immediate paneЧто именно ты там пишешь? Надо написать знак вопроса, имя функции, в скобках значение параметра и нажать Enter
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пользовательская функция в Excell 2010 - запрос к базе данных *.DBF / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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