Запрос к таблице с номерами на SQL сервере. HowTo?

Ответы на вопросы "А может ли он сделать такое..?" или "Как сделать вот это..?"
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

Добрый день!
Установлен экземпляр SLQEXPRESS, добавлена строка подключения, создана БД DB01, и в одну из ее таблиц загружены: 1-НомерТелефона, 2-Дата.
Необходимо написать скрипт для отбора номеров для обзвона с отбором по полю Дата. Наверно, проще это можно сделать через конструктор, но подробной инструкции для этого инструмента я не нашел. Какие варианты решения задачи у меня есть?

Спасибо!
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Используйте альтернативный механизм обзвона в версии 1.07. Описание есть в Справке и примерах в папке установки SpRobot.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

Добрый день!

sannx, подскажите, как в альтернативном обзвоне сделать так:
1. Есть XLS файл с полями "ID Tel=Телефон Date=Дата Act1=0 Act2=0"
2. Необходимо получать Tel, там где Date = NOW - 30 дней и в случае успеха, ставить Act1=0
3. Необходимо получать Tel, там где Date = NOW - 15 дней и в случае успеха, ставить Act2=0
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Для вашего случая лучше использовать другую БД, например MS SQL. Можно первичные данные хранить в Excel, но при запуске обзвона скопировать их в таблицу MS SQL, используя команду "Обработать событие". А сам альтернативный механизм обзвона будет работать с базой MS SQL. Также укажите все поля в Excel, которые вы используете в обзвоне тем или иным образом, и опишите их назначение и приведите возможные значения (например, для полей Act1 и Act2)
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Хотя вот, попробуйте это:
- в секции [Unprocessed] укажите запрос "select * from [Лист1$] where (Date=Date()-30) or (Date=Date()-15)"
- в секции [AfterDialNumber] укажите запрос "update [Лист1$] A set A.Act1 = IIF(A.Date=date()-30 = 0, A.Act1, 0), A.Act2 = IIF(A.Date=date()-15 = 0, A.Act2, 0) where ID=ID=~NumID~ and ~Status~=1".
Расшифрую "IIF(A.Date=date()-30 = 0, A.Act1, 0)":
- IIF(<условие>, <выполнить, если условие ложно>, <выполнить, если условие истинно>).
- если поле дата равно сегодня - 30, то знак равенства вернет "-1" (истинно), если поле дата не равно сегодня - 30, то знак равенства вернет "0" (ложно)
- IIF(<"Поле Date не равно date()-30 ?">, <"не равно, оставим как есть, т.е. вернем A.Act1">, <"равно, вернуть 0">)

Про остальные секции ничего сказать не могу: надо ли их менять/заполнять. Вам виднее.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

Скажите, синтаксис какого языка (IIF, Date() и т.п) можно использовать в запросах при использовании листа XLS?
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Посмотрите на Stackoverflow. Или погуглите что-то типа "excel iif"
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Но писать сложные запросы для excel это больше похоже на изврат. Лучше пользоваться настоящими БД типа MS SQL.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

Т.е, при работе с MSSQL я могу использовать полный синтаксис TSQL?
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

iStan писал(а):Т.е, при работе с MSSQL я могу использовать полный синтаксис TSQL?
Безусловно.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

Еще пара вопросов...
1. Если я хочу использовать БД Пользователя, при этом данные собираюсь хранить в СКЛ. Я в СпискеНомеров ставлю галочку, и заполняю "конфигурацию" (пример взял из ОбзвонаРеспондентов):

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

;Общие настройки
[General]
SrcName="SQLex"
Version=1
DateTimeFormat="dd.mm.yyyy"

;Необработанные номера
[Unprocessed]
Priority=0
Query="select ID, Tel from Table_1 where (Act1=1 and Date1='~Now~') and InProc='False' order by ID"
ID="ID"
Number="Tel"

;Перед обзвоном очередного номера
[BeforeDialNumber]
Query="update Table_1 set InProc='True', DialLastBegin='~Now~', DialWasTimes=DialWasTimes + 1 where ID=~NumID~"

;После обзвона очередного номера
;Статус: 0 - не обработан, 1 - успех, 2 - занято, 3 - не отвечает, 4 - другое или неверный код"
[AfterDialNumber]
Query="update Table_1 set Status=~Status~, InProc='False', DialLastEnd='~Now~' where ID=~NumID~"
Далее я указываю НастройкиДозвона, Алгоритм (НабратьНомер,СказатьФразу,НабратьСледующийНомер) и Расписание (Ручное).

Внимание, ВОПРОС: Надо ли мне менять алгоритм в конструкторе и если да, то как?
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

1. В алгоритме автообзвона (не Конструктора) нет команды "НабратьСледующийНомер". Да она и не к чему.
2. Если алгоритм автообзвона удовлетворяет вашим задачам и потребностям, то в Конструктор заходить не надо. СпРобот при сохранении всех настроек автоматом преобразует алгоритм автообзвона в Конструктор.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

1. По сути в КОНФИГУРАЦИИ ПОЛЬЗОВАТЕЛЯ я могу указывать как условия отбора номера (SELECT WHERE) при конкретных ситуациях ([Unprocessed] и т.п.) так и модифицировать какие либо поля своей таблицы, опять же с целью сделать по ним отбор в дальнейшем (UPDATE ...).

В этой связи:
1 вопрос - какой самый простой способ убедиться, что алгоритм Выборки номеров из моей БД работает?
2 вопрос - скорее всего, получение информации по обработанным номерам ИЗ МЕНЮ АВТООБЗВОНА при ТАКОМ способе выборки номеров - невозможно?
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

1. Использовать тестовую базу (тестовый набор номеров) и звонить через ваш запрос на эти номера. Вы заранее должны решить, какой будет последовательность вызова (назовем это образцом). А потом, после обзвона, сравните Журнал обзвона с образцом.
2. Не понял, что вы имеете в виду.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

(2) Я имею в виду как раз ЖУРНАЛ ОБЗВОНА. Т.е, увижу ли я в этотм журнале результаты обзвона из БД ПОЛЬЗОВАТЕЛЯ. Но судя по ответу на (1) - увижу.

ОК, попробую, отпишусь. Спасибо!
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

sannx, вчера уделил программе 4 часа времени и таки заставил ее звонить по номерам из БД на СКЛ.

Нюансы:
1. Я тренировался на примере "Обзвон респондентов". Главный затык был в имени поля PHONE - в скрипте, который создает таблицу, ошибка в этом слове(!) - написано PNONE. Соответственно, программа автообзвона в запросе выбирала данные из поля PHONE которое отсутствовало в принципе. Самое печальное, что в Журнале программы об этом ни слова, т.е. не понятно, что именно происходит. Для отладки я добавил в алгоритм вызов СООБЩЕНИЯ перед набором очередного номера, в котором выводил значение переменной @VarTelNum.

2. Так же не понятно, почему мой экземпляр СКЛ не переваривает булевы значения при апдейтах таблицы, если они начинаются с маленькой буквы, т.е.

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

Query="update Obzvon set Processing='False'"
- РАБОТАЕТ,
а

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

Query="update Obzvon set Processing='false'
- НЕТ.

3. Не понял, как заставить работать переменную ~Now~ . В хелпе написано, что это строка с датой в формате, который задан в генеральных настройках. В примерах видел, что эту переменную прикрывают апострофами - '~Now~' . Но ни так, ни сяк - у меня не получилось использовать данную переменную при сравнении ДАТ. Вместо этого я использовал ф-ю GETDATE().


4. Секция [DialBreak]. Судя по тому, что поле DialLastEnd все время NULL - у меня тоже не работает(((

5. Переменная ~DialID~. Она используется в некоторых запросах. Зачем она нужна, когда ее стоит использовать? Можно ли обойтись без нее?

Теперь о главном.


Ниже приведена структура моей таблицы Obzvon.

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

CREATE TABLE [dbo].[Obzvon](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Phone] [nvarchar](32) COLLATE Cyrillic_General_CI_AS NOT NULL,
	[Processing] [bit] NOT NULL,
	[Count] [int] NULL,
	[Status] [int] NULL,
	[RES] [int] NULL,
	[Active] [int] NOT NULL,
	[NextCallDate] [datetime] NULL,
	[DialWasTimes] [int] NULL,
	[DialLastEnd] [datetime] NULL
) ON [PRIMARY]
а еще ниже настройки обзвона:

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

;Общие настройки
[General]
SrcName="SQLex"
Version=1
DateTimeFormat="dd.mm.yyyy"

;;;;;;;;;;;;;;;;;;;;;;Необработанные номера (в данном примере используется только эта секция)
[Unprocessed]
Priority=0
Query="select ID, Phone from Obzvon where Active=1 and Processing='False' and Status=0 and CONVERT(Varchar(10),NextCallDate,104) = CONVERT(Varchar(10),GetDate(),104) and Count<2   order by ID"
ID="ID"
Number="Phone"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Номера со статусом "Занято"
[Busy]
Priority=1
Query="select ID, Phone, DialLastEnd from Obzvon where Status=2 and Processing='False' and DialWasTimes<~RepeatBusy~ order by DialLastEnd"
ID="ID"
Number="Phone"
EndTime="DialLastEnd"


;Перед обзвоном очередного номера
[BeforeDialNumber]
Query="update Obzvon set Processing='True', Count=Count + 1 where ID=~NumID~"

;После обзвона очередного номера
[AfterDialNumber]
Query="update Obzvon set Processing='False', Status=~Status~, DialWasTimes=DialWasTimes+1  where ID=~NumID~"

;Если обзвон был прерван
[DialBreak]
Query="update Obzvon set Processing='False', DialLastEnd=CONVERT(Varchar(10),GetDate(),104) where ID=~NumID~"
Задача - построить следующий алгоритм:

1. Выбрать необработанный номер из БД, у которого поле NextCallDate = ТекущемуДню, позвонить по нему 1 раз и проиграть аудио файл. После этого установить поле NextCallDate = ТекущийДень+15 дней (DATEADD). Если абонент не дослушал - все равно считать успехом.
2. Если номер занят (не отвечает, или другое - условия совпадают) - пытаться перезвонить ему 10 раз с интервалом 1 час в течении работы программы автообзвона (7 дней в неделю с 10 до 20).
3. Не плохо бы видеть статус обзвона, т.е. выводить оператору информацию в момент обзвона: Какой номер набирается, и сколько еще номеров на сегодня осталось набрать.

sannx, прошу помочь с конфигурацией программы, дать свои комментарии.
Заранее спасибо!
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

1. Спасибо, что нашли эту ошибку.
2. Это надо читать документацию, почему есть зависимость от регистра.
3. А вы попробуйте в Server Management Studio написать запрос, в котором вы сравниваете даты, но вместо '~Now~' укажите конкретную дату, например '29.11.2013'.
4. Здесь надо разобраться. Лучше всего по удаленке у вас на месте.
5. ~DialID~ - это номер (идентификатор из поля ID таб. AutoDialing) программы обзвона. Использовать его или нет - зависит от задачи.

О главном напишу позже.
iStan
Сообщения: 37
Зарегистрирован: 02 апр 2013, 18:24

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение iStan »

2. Просто буду иметь в виду
3. В таком случае буду использовать GetDate()
4. Это дорого?;)
5. Все равно не понял. Если это поле из таблицы AutoDialing, значит МОЯ таблица не должна его содержать? Как мне определить, надо его использовать , или нет?
6. "О главном" - буду ждать, спасибо!

PS
Я использую локальные таблицы. Версия программы - предпоследняя.
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

4. Бесплатно.
5. В общем, забейте.
Аватара пользователя
sannx
Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Запрос к таблице с номерами на SQL сервере. HowTo?

Сообщение sannx »

Насчет Now. Скорее всего, Вы указали неправильный формат даты. По умолчанию для MS SQL формат такой: "yyyy-mm-dd".
Ответить