Проблема з dbcombobox

Всім привіт! Сьогодні я буду розповідати про DBComboBox. але якщо правда не зовсім про нього. Я розповім про те як замінити його. Суть роботи наступна: ви напевно зрозуміли DBComboBox - компонент роботи з базами даних. І здавалося, по ідеї ви повинні, вказати просто DataSource і поля які, хочете запхати в список, і буде вам випадає з варіантами. АЛЕ коли я розбирався не так давно з цим компонентом, я так і не зміг отримати бажаний результат.
Налаштував DBComboBox. і в поле Text записалося перше значення з вибірки. При натисканні на «галочку» список порожній. Є ще момент: при введенні значення в полі (при цьому повинен скластися список відповідних значень) відбувається оновлення поля в базі. Тобто виходить, що я заношу нове значення в список - компонент просто оновлював рядок в базі на введене мною значення. Ось так можна описати суть проблеми з DBComboBox.
Першим методом вирішення проблеми роботи з DBComboBox була пропозиція такої схеми реалізації.

Проблема з dbcombobox
Алгоритм заміни DBComboBox

Слабкі місця.
- При слабкому з'єднанні (тобто наприклад буде підключення до сервера через VPN, підключення в інтернету через модем). Уявімо собі ситуацію користувач вводить довге слово при кожному введеному символі буде відісланий запит в базу і поки буде отримана відповідь, в циклі сформований список - це все час.
- При частому зверненні до списку Items компонент починає глючити. Причому глюк ловив і на Delphi 7 і на Delphi XE 4.
За перерахованими причин довелося відмовити від даної реалізації. АЛЕ спасибі товаришу і вчителю Format_C_eft (ЧЕРЕДНИЧЕНКО О.Г.). Код власне подсмотрен у нього.
Для нової реалізації використовуємо наступні компоненти: TListBox і TEdit. Сам алгоритм залишаємо тим же. Довжина рядка => 3 символів, це що не робити холості запити в базу, коли під умову вибірки буде підходити багато записів. А це зайве навантаження на з'єднання з північчю, а отже втрата часу для кінцевого користувача. Шляхом експериментів прийшли до того, що дана кількість буде мінімальним і достатньою умовою для нормальної роботи. Дану реалізацію випробували на версії 2G мобільного інтернету, в принципі вона і зараз працює, причому вже протягом більше року. За весь час не було помічено серйозних глюків.

Проблема з dbcombobox
Ескіз реалізації свого DBcombox

Як ви можете бачити на картинці, TListBox у нас відповідає за відображення списку варіантів. а TEdit за поле введення. Між варіантами можна переміщатися стрілками. При виборі елемента, текст копіюється в поле введення. Ось так виходить типу DBComboBox. тільки крутіше. Ну власне перейдемо до коду.
Наведу вам приклад на основі поля вибору громадянства. У базі є табличка з даними, з неї ми будемо брати варіанти для списку. Внизу статті я приведу посилання на скачування бекапа таблиці.
Почнемо з TListBox ...

Всі пояснення вже є в коді і вище я розглядав алгоритм. Тому без зайвих слів переходимо до подальшого опису вирішення проблеми з DBComboBox.
Далі привожу код для TEdit ...

Помітив що у вас на сайті, дуже часто перемішується код на Delphi і SQL. У мене теж є така біда. Я зараз все методи які звертаються до бази, намагаюся винести в окремий DM, і отримувати звідти результат через виклик відповідних процедур.
І ще, я не знаю як з вашими компонентами, але багато запитів якщо їх просто відкрити і потім звернеться до RecordCount можуть повернути невірне кількість, тому що зазвичай не відбувається вибірка всіх даних. Доводиться робити Last і потім отримувати RecordCount, хоча може мені просто не пощастило з компонентом або у нього була неправильна настройка.

Описаної вами проблеми не разу не зустрічав ... А з приводу перемішування SQL і коду Delhi. Я знайшов наступні рішення: Наприклад мені потрібно дані вибірки з двох трьох таблиць, так це ще квіточки, а наприклад там будуть вкладені запити і недавно писав запит з трьома зв'язковими таблицями, та ще й три варіанти запиту зв'язкові через UNION..Прі цьому у мене проект динамічний, і умови часто змінюються мало не раз на тиждень. Тому я пішов простим шляхом ... Беремо запит запихає його в уявлення і все ... У коді просто викликаєш звичайним запитом «SELECT * FROM` представленіе` ».
Плюс даного підходу в тому що якщо зміниться логіка запиту або назва таблиць не важливо не треба буде переписувати код програми, а просто міняєш запит в поданні. Я поже розвину цю тему як я реалізував свій проект з статики, (всі запити були прописані прям в коді) і зробив це в динаміці. Працювати стало одне задоволення, не потрібно шукати де в коді була помилка, а просто працюєш з базою.
Та ще один маленький плюс, «оновлення» долітає до кінцевого користувача в секунди. У порівнянні з тим що йому не треба оновлювати програму. От якось так…

SELECT * FROM `представленіе`- хороший варіант. І я дуже багато бачив таких підходів. Працює на ура. Однак головне не зловживати, коли замість подання використовується хранімка, причому з досить складною логікою. Все зберігається в базі. Працює може і швидко, але якщо потрібно щось змінити то це зробити складно.

А з приводу наболешего НЕ пержівай ... .Мое бажання вести цей блог і виставляти свій кострубатий код і ідеї на загальний огляд - це можливість отримати зворотній зв'язок. Коментарі, які не вазжно похвальні вона, скаржаться на своїх тупих пользаков, і розносять меня..Важно що це обрпатная зв'язок і тільки заради це варто писати ці статті і займати цим. Причому мені раніше здавалося написати статтю фігня ... .Зараз в голові купа ідей, але невстигаючих все написати, іноді над сать рабоать майже два дня. Потім ще товариш пепречітивает і знову правиш помарки. ТАк що я тільки блогадарен всім хто тут коментує мою бездарність))))

Схожі статті