Потратил час на спор с клиентом, что 1С работает медленнее, чем его база на Oracle, поэтому, обеспечить одновременную, безглючную работу нескольких операторов, чтобы они, вводя номер телефона, по первым цифрам получали в выпадающем списке подходящие номера, нельзя... Все бы ничего, но
1. номеров может быть много... десятки тысяч... сеть пиццерий в Санкт-Петербурге, как ни как
2. мое неумение решить эту проблему грозило срывом хорошего договора
В конечном итоге, убедили клиента, что, хотя это и сложно, но проблему решим. Договор заключили. А вечером действительно решили вопрос :)
Всего-то нужно было - посмотреть на вопрос не глазами клиента а нашими, т.е., программистов. Чем грузится база? Запросами к ней и блокировками таблиц. Значит, нужно большую часть работы повесить не на сервер, а на клиентское приложение!
И так, простой метод:
1. по первой цифре отбираем в запросе нужные нам номера
2. все последующие цифры - это запрос не к базе, а к списку уже отобранных нами номеров
Осталось немного "косметики". Проблема: пока вводятся цифры в поле ввода, никакая обработка ожидания не срабатывает. Как быть? Тот франч, что был до нас и потерял этот заказ, не предложил решения.
Но нечего баловать операторов полями ввода и выпадающими списками, дадим им нечто лучшее, отдельную форму ввода. Мотивация - теперь появилась возможность работать с сенсорными экранами...
- У Вас нет сенсорных экранов? Но ведь будут однажды!
- Да, конечно когда-нибудь будут...
Как я люблю это наше "надо прозапас"! И приятно, что наша небольшая супер команда оказалась хитрее крупного франча с филиалами во многих городах... :)
В общем, просто делюсь хорошим настроением и небольшой фичей, которую, если у кого похожая задача возникнет, не придется делать самому. В прилагаемой базе сгенерировано 50 тыс. номеров. Проверьте скорость работы. Можно и в сети.
"Ну а как быть, если номеров несколько миллионов?" - спросит кто-то
Не страшно! (Наверное)
Вариантов вижу 2, по крайней мере.
1. Использовать дополнительные поля в справочнике телефонов для отбора с включенной сортировкой. В частности: "Первый символ", "Два первых символа", "Три первых символа". Наверное, стоит все-таки обращаться к базе, пока длина введенной части не более 3-х символов, а вот потом уже работать со сформированным списком. Но по поводу этого готов услышать "за" и "против"
2. Использовать локальную базу номеров, выгруженную в виде того же dbf, и обращаться к ней на клиентской машине. При этом, dbf-ок можно иметь несколько. Опять же, по первому (двум) символу в номере.