VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Запрос к внешней БД через func_odbc

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Ответить
murr
Сообщения: 127
Зарегистрирован: 04 июл 2013, 16:55

Запрос к внешней БД через func_odbc

Сообщение murr »

Asterisk 10.12.4
FreePBX 2.11

Задача - определить маршрут входящих для сотрудников и остальных. База данных с телефонами сотрудников - в 1С под MS SQL 2000.

Настроил odbcinst.ini

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

[FreeTDS]
Description = ODBC for Microsoft SQL
Driver      = /usr/lib/libtdsodbc.so.0
UsageCount  = 1
Threading   = 2
Настроил odbc.ini

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

[1cDB]
Description     = MS SQL connection to '1C DB' database
Driver          = FreeTDS
Database        = NN_3
Server          = 10.10.1.4
UserName        = sa
Password        = хххххх_admin
Trace           = No
#TDS_Version     = 7.0
Port            = 1433
Настроил func_odbc.conf

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

[CHECK_NUM]
prefix = 1C
dsn=1cDB
readsql=select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%${ARG1}'
Завел доп. направление FreePbx

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

[check-worker-numbers]
exten => s,1,NoOp(Проверка на принадлежность к сотрудникам)
exten => s,n,Set(telnum=${CALLERID(num)})
exten => s,n,Set(ret_func=${1C_CHECK_NUM(${telnum})})
exten => s,n,GotoIf($[ ${ret_func} = "1"] ]?rab:net)
exten => s,n(rab),NoOp(${telnum} - это номер сотрудника)
exten => s,n,Hangup()
;exten => s,n,Goto(ext-group,600,1)
exten => s,n(net),NoOp(${telnum} - это НЕ номер сотрудника)
exten => s,n,Hangup()
;exten => s,n,Goto(ext-group,601,1)
;exten => s,n,Hangup()
В итоге в логах (телефон клиента)

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

VERBOSE[18807] pbx.c:     -- Executing [3005@from-trunk:13] Goto("SIP/3005-0000001f", "check-worker-numbers,s,1") in new stack
VERBOSE[18807] pbx.c:     -- Goto (check-worker-numbers,s,1)
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:1] NoOp("SIP/3005-0000001f", "Проверка на принадлежность к сотрудникам") in new stack
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:2] Set("SIP/3005-0000001f", "telnum=380506583493") in new stack
ERROR[18807] func_odbc.c: Unable to execute query [select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%380506583493']
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:3] Set("SIP/3005-0000001f", "ret_func=") in new stack
WARNING[18807] ast_expr2.fl: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:
Подключение с этим же запросом через isql проходит нормально:

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

[root@pbx asterisk]# isql -v 1cDB sa хххххх_admin
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%380506583493'
+------------+
|            |
+------------+
| 0          |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>
Почему пишет ошибку выполнения запроса? Чего не увидел?
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

Re: Запрос к внешней БД через func_odbc

Сообщение ded »

[CHECK_NUM]
prefix = 1C
exten => s,n,Set(ret_func=${1C_CHECK_NUM(${telnum})})
попробуте обойтись без префикса 1C

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

exten => s,n,Set(ret_func=${CHECK_NUM(${telnum})})
murr
Сообщения: 127
Зарегистрирован: 04 июл 2013, 16:55

Re: Запрос к внешней БД через func_odbc

Сообщение murr »

Убрал префикс.

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

VERBOSE[23309] pbx.c:     -- Executing [s@check-worker-numbers:2] Set("SIP/3005-00000005", "telnum=380662054237") in new stack
ERROR[23309] pbx.c: Function CHECK_NUM not registered
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: Запрос к внешней БД через func_odbc

Сообщение Vlad1983 »

пустая строка в конце файла func_odbc.conf присутствует?
ЛС: @rostel
murr
Сообщения: 127
Зарегистрирован: 04 июл 2013, 16:55

Re: Запрос к внешней БД через func_odbc

Сообщение murr »

Решилось добавлением секции в res_odbc_custom.conf

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

[1cDB]
enabled=>yes
dsn=>1cDB
pooling=>no
limit=>1
pre-connect=>yes
username=>sa
password=>xxxxxx_admin
Выходит, что астер напрямую с системным odbc не работает, т.е. нужно func_odbc -> res_odbc -> odbc.ini
Не знал..
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH