Вивчаємо програмування в Gupta Team Developer. Крок 6 – Налагодження, вибірка і робота з записами, Інтеграція додатків і даних, Бази даних, статті

Частина 5



Дана стаття є шостою в циклі статей під загальною назвою “Вивчаємо програмування в TD / GUPTA”, в якому ми постараємося дати починаючому користувачеві програмних продуктів GUPTA всю необхідну інформацію для вивчення програмування та отримання навичок створення інформаційних систем. У ній ми розглянемо механізми роботи із записами і таблицями БД на основі двох підходів. Перший грунтується на візуальному об’єкті TD – таблиці, а другий на безпосередній роботі з вибіркою (Result Set). Крім того, ми пояснимо можливості налагодження програм в TD (програми стали складнішими, і настав для цього час) і способи діагностики помилок при роботі з SQL СУБД. Для успішного засвоєння цього матеріалу читачеві бажано познайомитися з попередніми статтями з даного циклу, які розміщені на нашому сайті.


Введення


Ви вже можете створювати додатки, що працюють з БД. У даній статті ми постараємося розширити Ваші знання про можливості Gupta Team Developer для вирішення задач інформаційних технологій і сформувати практичні навички для такої роботи.


Як будь-які системи програмування TD має весь необхідний набір засобів для налагодження програмного забезпечення, тому, спочатку, коротко їх розглянемо. Крім цього на початку статті ми акцентуємо увагу читачів на те, як отримати і видати користувачеві програм інформацію про помилки при роботі з БД. Такі помилки не завжди вдається виключити у програмі, деякі з них (наприклад, доступ до серверу або конкретної БД) залежать від оточення інформаційної системи.


Далі будуть розглянуті уніфіковані механізми вибірки з БД у візуальну таблицю і способи роботи з окремими записами. Потім зупинимося на варіанті роботи з вибіркою з БД (традиційно званої Result Set – RS) без створення візуальних об’єктів, і, нарешті, покажемо, як можна забезпечити навігацію по записах в разі роботи з візуальною таблицею і сформованої попередньо вибіркою даних з БД.


Для успішного і самостійного освоєння матеріалу даної статті, який, ми дуже сподіваємося, може служити своєрідним самовчителем програмування на Gupta TD, бажано ознайомитися з матеріалом і виконати завдання попередніх статей “Крок 1-5“.


Налагодження програм в Team Developer


Team Developer має всі необхідні засоби для налагодження інформаційних систем. Передбачені режими трасування програм, перегляду змінних, завдання точок зупину, анімації виконання програми і зупинки роботи програми. Нижче, на малюнку 1, показано основні елементи управління налагодженням: панель інструментів налагодження й меню для управління налагодженням. Панель інструментів (Dеbug) Ставати доступною при запуску програми. Тут розташовані елементи: запуску і припинення програми, Операції покрокового виконання програми з входом у вкладену процедуру і без , А також кнопки виклику спеціальних вікон налагодження. Ці вікна служать для: перегляду змінних, перегляду стека виклику процедур, перегляду керуючих повідомлень і перегляду вичіслімих виразів. Ці вікна ми розглянемо трохи пізніше.

Рис. 1 Панель інструментів і меню налагодження TD


Меню для управління налагодженням містить наступні позиції: запуск програми в режимі налагодження (Go – Клавіша F7), Останов процесу налагодження (Stop – Клавіші Shift+F7), Призупинення процесу налагодження (Break), Крок за програмою зі входом в процедури (Step Into – Клавіша F10) І з обходом процедур (Step Over – Клавіші Ctrl + F10), Підменю управління точками зупинки (Breakpoints) І режими анімації (No Animate , Slow Animate , Fast Animate). В підменю управління точками зупинки (на малюнках не показано) передбачені наступні можливості: встановити точку зупину (Toggle – Клавіша F9), Прибрати точку зупину (теж F9), Прибрати всі крапки зупинки (Clear All), Тимчасового включення і відключення точок зупину (Disable All і Enable All відповідно).


Примітка: 1. Для того щоб перейти в режим відладчика необхідно спочатку встановити одну точку зупину, в іншому випадку програма буде виконуватися в автоматичному режимі. Така точка зупинки може бути встановлена ​​в тому місці, де доцільно почати режим відладки.


2. На відміну від інших систем програмування в TD немає необхідності встановлювати спеціальні перемикачі налагодження. Так як під управлінням TD програма завжди виконується в режимі інтерпретації, то об’єктних модулів не створюється. Раніше ми вже показали (“Крок 1 …”) як можна створити здійснимий модуль (*. EXE).


Режими анімації використовуються в тих випадках, коли важко простежити процес виконання програми та локалізувати помилки. Застосовуючи цей режим на повільної (Slow) Або високій швидкості (Fast) Ви можете переглядати послідовність виконуваних операторів SAL і зупинити програму в будь-якому місці.


В процесі налагодження, перебуваючи в режимі припинення виконання програми або при виконанні по кроках, програміст може викликати вікно перегляду змінних, показане нижче. Це вікно, крім виклику його з лінійки інструментів, може бути викликане за допомогою комбінації клавіш Alt+5, Або за допомогою меню Tools->Variables.

Рис. 2 Вікно перегляду змінних отладчика TD


Вікно являє собою таблицю, в якій дано імена змінних та їх значення. Будь-які зміни змінних в ході налагодження оперативно будуть відображатися в цьому вікні. У нашому прикладі виводяться змінні: frmPrimer.dfDBName – Ім’я БД, frmPrimer.dfFamReplace – Поле вікна з прізвищем і т.д. Системна змінна lParam містить інформацію передану в процедуру обробки повідомлень.


За допомогою спеціальної кнопки (+ / -) з цього вікна викликається вікно налаштування змінних, виведених у вікно перегляду. Це вікно показано на малюнку, розташованому нижче. Вікно вибору змінних для перегляду має інтуїтивно зрозумілий інтерфейс. Воно містить: три вікна списків, одне поле введення імен змінних і кнопки управління. У подвійному списку “Select Watch Variables“Встановлюються області перегляду змінних (вікна, процедури, області OUTLINE і так далі) і конкретні змінний доступні в цих областях. За допомогою кнопок”Add“І”Add All“, А також подвійним клацанням, ви можете перемістити змінні в третій список”Current Watch Variables“, В якому представлений список змінних, що підлягають висновку в даний момент. Цей список можна очистити повністю (Clear All), Або видалити з нього одну виділену рядок (Clear). Якщо ідентифікатор змінної (можна і без кваліфікованої посилання) вводиться вручну в поле “Edit Watch Variable“, То після натискання кнопки”Add“Її ім’я теж можна розмітити в списку виводу. При необхідності можна відредагувати ім’я виділеної змінної, для цього використовується кнопка”Change“. Якщо ви хочете відмовитися від змін в списку виведення, то використовуйте кнопку”Cancel“, Для підтвердження змін використовуйте кнопку”Ok“.

Рис. 3 Вікно вибору змінних для перегляду отладчика TD


Для складних програм характерний взаємний виклик функцій і процедур. Для перегляду послідовності виклику можна використовувати вікно стека виклику “Call Stack“. Це вікно показано нижче на малюнку. У списку виклику відображаються викликаються функції, і процедури обробки повідомлень об’єктів програми. Посилання дається кваліфікована, тому функція однозначно ідентифікується. Дане вікно може активізуватися з лінійки налагодження, клавішами (Alt+6) Або за допомогою меню: Tools?>Call Stack.

Рис. 4 Вікно стека виклику процедур отладчика TD


Наступне налагоджувальної вікно призначене для перегляду повідомлень керуючих програмою. Можна включити режим перегляду тільки користувальницьких повідомлень SAL (перемикач – “SAM mesages only») Або переглядати всі повідомлення, включаючи і повідомлення WINDOWS (WM_). Останній режим важливий, якщо Ви в програмі використовуєте їх обробку. Відзначимо попутно, що можна обробляти практично всі повідомлення WINDOWS і створювати власні. У вікні повідомлень відображається: символічну назву повідомлення (наприклад, SAM_FetchRow), Дескриптор віконного об’єкта, до якого воно адресоване і стандартні параметри (wParam і lParam). Якщо перегляд повідомлень в даний момент не потрібний, то його можна відключити (перемикач – “Stop Watching“). Можна і закрити все вікно, використовуючи панель налагодження, клавіші (Alt+7) Або за допомогою меню: Tools?>Messages. Всі керуючі елементи працюють в режимі тригера.

Рис. 5 Вікно трасування повідомлень отладчика TD


Останнє вікно відладчика призначено для перегляду будь-яких змінних і виразів. Вікно “Expressions“Представлено нижче. У верхньому списку може бути введено вираз (в нашому випадку ім’я простого поля dfDBName), А в нижньому полі після натискання кнопки “Eval“, Формується поточне значення виразу із зазначенням типу висловлювання. На відміну від вікна змінних, для отримання адекватного значення виразу потрібно натискати кнопку. Виклик даного вікна виконується з панелі налагодження, клавішами (Alt+8) І меню: Tools?> Expressions.

Рис. 6 Вікно перегляду виразів отладчика TD


На наступному малюнку показано, як змінюється вид програми при установці точок зупину (Breakpoint). Рядок, на якій поставлено крапку зупину, перефарбовується в червоний колір. Установка і зняття точки зупину виконується клавішею F9 або за допомогою меню: Debug->BreakPoint->Toggle.

Рис. 7 Точки зупинки (breakpoint) при налагодженні в TD


Примітка : 1.При коментуванні фрагментів тексту точки зупину автоматично не видаляються, тому їх можна зберігати для подальшого застосування.


2. Потрібно мати вводу, що і при копіюванні через буфер обміну точки зупину теж копіюються.


Діагностика SQL помилок в Team Developer при роботі з БД


Якщо з налагодженням програм ми розібралися вище, то з налагодженням SQL запитів справи йде не так добре. Звичайно, можна скористатися SQLTalk або вбудованого DB Explorer для налагодження запитів, але це важко зробити в тому випадку, коли запити генеруються в програмі. При цьому реєструються помилка і програма в більшості випадків завершується. Для обробки цих ситуацій ми вже розглядали можливості (Обробка повідомлень SAM_SqlError і оператор When SqlError). При такій обробці можна дати користувачеві і розробнику додаткову інформацію, яка може бути отримана від TD за допомогою спеціальних функцій.


Нижче на малюнку наведено фрагмент програми, яка демонструє застосування таких функцій (для локальної обробки помилок). Функція SqlExtractArgs дозволяє отримати потрібну інформацію: стандартні параметри повідомлення про помилки (wParam і lParam), Значення курсора, для якого зафіксована помилка (hSqlErr), Номер помилки (nErr) і позицію виявлення помилки при компіляції запиту (nPos). Курсор може бути використаний для відкоту транзакції (ROLLBACK), Номер помилки і позиція для формування тексту діагностичного повідомлення. Номер помилки (nErr) Може бути отриманий також на основі курсора hSql2 за допомогою функції SqlError. Інші дві функції (SqlGetError і SqlGetErrorText) Допоможуть отримати текст повідомлення про помилку. У фрагменті тексту для ілюстрації різних можливостей отримання інформації про помилку наводимо кілька функцій, які виконують однакові операції.

Рис. 8 Фрагмент тексту обробки параметрів локальних помилок


Примітка : 1. Інформація про помилки виходить з файлу error.sql, який розташований в кореневому каталозі TD. На жаль, даний файл не русифікований. Тому діагностика виходить англійською мовою. Однак, якщо для клієнтських додатків в даному файлі замінити англійські тексти на російські, то система буде автоматично поставляти тексти опису помилок російською мовою.


2. Можна і в програмі передбачити русифіковану інформацію (файл, масив і так далі) для індикації помилок для найбільш часто зустрічаються помилок.


3. Якщо не передбачена обробка помилок і їх перехоплення, то TD формує власне вікно з інформацією про помилку. В цьому випадку це буде вікно з англійськими текстами, що не завжди влаштовує розробників і користувачів.


При глобальної обробці помилок ми отримаємо практично такий же текст, який представлений на нижньому малюнку. Даний фрагмент тексту завершується викликом простого спеціального користувацького модального вікна (dlgError), Для видачі діагностичної інформації.

Рис. 9 Фрагмент тексту обробки параметрів глобальних помилок


Зовнішній вигляд даного вікна представлений на малюнку, розташованому нижче.

Рис. 10 Користувацька вікно повідомлення про SQL помилках


Вікно використовує інформацію, отриману за допомогою функцій: SqlExtractArgs і SqlGetErrorText. Інформація в діалогове вікно передається за допомогою глобальних змінних. Опис об’єктів діагностичного вікна дано нижче. Сенс цих змінних зрозумілий з текстів написів і позначок.

Рис. 11 Опис об’єктів вікна повідомлень про помилки


При створенні вікна діагностики інформація з глобальних змінних заноситься, як показано нижче, в поля вікна при його створенні.

Рис. 12 Змінні вікна діалогу помилок


Глобальні змінні програми, опис яких дано нижче, формуються при обробці помилок.

Рис. 13 Опис глобальних змінних для індикації помилок


При обробці локальних помилок спочатку видається діагностичне повідомлення за допомогою функції SalMessageBox. Його текст дан нижче.

Рис. 14 Індикація локальної помилки


При обробці глобальних помилок також видається діагностичне повідомлення за допомогою функції SalMessageBox. Текст повідомлення наведено нижче.

Рис. 15 Індикація глобальної помилки


При індикації помилки за допомогою стандартного параметра lParam (переданого обробникові повідомлення SAM_SqlError) Не завжди формується правильний код помилки, так як він упакований, тому доцільно користуватися функціями SqlExtractArgs і SqlError.

Рис. 16 Індикація помилки через lParam


Крім цього, для детального опису помилковою ситуації можна використовувати функцію SqlErrorText. Ця функція має п’ять параметрів. Крім коду помилки (nErr), Потрібно вказати формат поставляється інформації (режим SQLERROR_Reason – Опис помилки і причина її виникнення або режим SQLERROR_Remedy – Можливі дії з її подолання), рядок повертається тексту (strErrText), Максимальна довжина повертається тексту і реальна довжина повертається тексту. SQLERROR_Reason і SQLERROR_Remedy – Є константами мови SAL. До речі, режими SQLERROR_Reason і SQLERROR_Remedy можна і комбінувати, наприклад:


Call SqlErrorText( nErr, SQLERROR_Reason / SQLERROR_Remedy,
strErrText, 300, nErrLong )


Формування вибірки в таблицю з обробкою повідомлень


Розглянемо далі можливості обробки повідомлень, які надсилаються таблиці при виконанні функції SalTblPopulate. Справа в тому, що ця функція виконує весь набір дій при заповненні таблиці: компіляцію запитів, додавання рядків і вибірку записів. Іноді необхідно втрутитися в цей процес, припустимо для зміни вмісту заповнюваних полів або, наприклад, для нумерації рядків таблиці в окремій колонці. Для того, щоб потрапити в ці цикли можуть бути використані спеціальні повідомлення, що посилаються таблиці при обробці кожного рядка. Це наступні повідомлення:


SAM_FetchDone – Повідомлення, що посилається таблиці при завершенні її заповнення,
SAM_FetchRow – Повідомлення, що посилається таблиці перед формуванням рядки,
SAM_FetchRowDone – Повідомлення, що посилається таблиці після формуванням поточного рядка.
Для ілюстрації обробки даних повідомлень розроблено програму, де створені процедури обробки цих повідомлень. Вікно цієї програми показано на малюнку нижче.

Рис. 17 Вікно програми для вивчення режимів вибірки в таблицю


У верхній частині вікна “Підключення” побудовані вже відомі (за попередніми статтями) процедури підключення до БД та відключення від БД. У центральній частині розташована таблиця “Таблиця з перевіркою записів”, для якій передбачені процедури обробки табличних повідомлень. Кнопка “Додати з БД” ініціює виконання функції SalTblPopulate для занесення інформації в БД в різних режимах (TBL_FillAll, TBL_FillAllBackground, TBL_FillNormal). Зазначимо, що обробка табличних повідомлень залежить від режиму. Кнопка “Очистити Таблицю” дозволяє видалити всі рядки таблиці. Приховане поле “Число рядків” показує число заповнених рядків в таблиці. У полі “Повідомлення обробки” виконує індикацію останнього повідомлення, обробленого в таблиці. Для ілюстрації заміни полів у таблиці передбачено спеціальне поле вводу прізвища. Якщо це поле заповнено, то при заповненні таблиці всі прізвища, які збігаються зі значенням в цьому полі, автоматично будуть замінюватися на нове значення (три зірочки – “***”). Заміна виконується в процесі заповнення таблиці. Крім цього при формуванні таблиці у першій колонці “№” обчислюється і заповнюється номер запису (в БД він відсутній). Опис основних змінних вікна тестового додатку наведено нижче. Тут можна виділити три курсора (hSql …), змінні лічильники (nCount, nMaxRs і т.д.) і змінну ознаки підключення. Значення інших змінних ми пояснимо пізніше.

Рис. 18 Опис змінних вікна тестового програми


Для індикації помилок і управління доступом до записів опишемо глобальні змінні. Їх призначення було розглянуто вище.

Рис. 19 Опис глобальних змінних тестового програми

Рис. 20 Процедура підключення до БД


У процедурі підключення до БД в тестовому додатку, крім виконання вже знайомих функцій (SqlConnect, SqlSetIsolationLevel) Використовуються функції включення і відключення доступу до кнопок, для того щоб уникнути невірних дій (SalDisableWindow, SalEnableWindow). Зазначимо, що для того, щоб скоротити обсяг статті в даному фрагменті описані і додаткові дії, які необхідні для другого додатка статті та про них ми розповімо пізніше. Після нормального підключення до БД, а ми з вами використовуємо вже створену раніше БД COMPANY, на екрані має з’явитися таке повідомлення.

Рис. 21 Вікно повідомлення про підключення


При відключенні від БД, крім операції відключення ми повинні зробити недоступними кнопки вибірки і відключення (pbAddToTabl, pbDisconnect) І включити кнопку поключенія (pbConnect), Як показано на малюнку нижче.

Рис. 22 Процедура відключення від БД


При невеликих вибірках з БД доцільно виконувати заповнення записів в таблицю в режимі TBL_FillAll. В цьому випадку всі записи заносяться в таблицю. Потім програма продовжить працювати. В процесі заповнення таблиці для кожного рядка будуть ініціалізовані повідомлення SAM_FetchRow і SAM_FetchRowDone. Якщо обробників цих повідомлень в програмі не передбачено, то заповнення таблиці виконується на основі запиту в функції. Якщо передбачений обробник повідомлень SAM_FetchRow, То, по-перше, в цьому обробнику необхідно отримати запис для занесення в таблицю (функція SqlFetchRow), І, по-друге, за допомогою повернення вказати на завершення процесу обробки вибірки (Return FALSE) Або продовження вибірки (Return TRUE).

Рис. 23 Вибірка в таблицю в режимі TBL_FillAll


На наступному малюнку показана процедура обробки повідомлення SAM_FetchRow. Поле індикатора (dfIndicator) Заповнюється назвою типу оброблюваного повідомлення (SAM_FetchRow). Колонка таблиці для заповнення номера (colNumb) Заповнюється значенням з iParam збільшеним на одиницю, оскільки нумерація рядків йде з нуля. Це значення перетворюється в символьне значення і до нього додається точка (“.”). Далі з вибірки (прихованої в процедурe SalTblPopulate) Зчитується поточна запис. Код повернення (nRet) визначає режим продовження заповнення таблиці (FETCH_Ok). В цьому випадку визначається поточне число рядків (dfNumb) І задається код повернення з процедури (TRUE). Якщо записи закінчилися, то закривається курсор (SqlCommit) І задається код повернення з процедури (FALSE).


Рис. 1 Заповнення таблиці в режимі TBL_FillNormal і TBL_FillAll функцією SqlFetchRow


У випадку режиму TBL_FillAll курсор може бути закритий і після виконання функції SalTblPopulate, Так як вибірка буде повністю завершена. Цього не можна робити в режимі TBL_FillNormal, Звільнення курсора необхідно зробити при обробку повідомлення обробки рядка. Зазначимо, що після формування рядка буде ініційовано повідомлення SAM_FetchRowDone, Теж для кожного рядка.

Рис. 2 Закриття курсора в режимі TBL_FillAll


Вибірка в режимі TBL_FillNormal, Виконується аналогічно, тільки в цьому випадку закривати курсор можна тільки після читання всіх записів, а воно завершитися після перегляду в таблиці всіх обраних записів. Якщо записи не проглядаються користувачем до кінця, то закриття курсора потрібно виконати перед наступною вибіркою в таблицю або при необхідності його іншого застосування. Запит на вибірку в режимі TBL_FillNormal, Показаний на малюнку нижче.


Примітка: В цьому випадку краще мати окремий курсор для кожного застосування, інакше можливі проблеми доступу: вибірка (а вона визначається курсором) буде зруйнована і будь-яка спроба скролінгу таблиці буде неможлива.

Рис. 3 Вибірка в таблицю в режимі TBL_FillNormal


При вибірці в режимі фону (TBL_FillAllBackground) Курсор можна закривати, тільки по завершенню всієї вибірки. Запит в цьому режимі показаний нижче.

Рис. 4 Вибірка в таблицю в режимі TBL_FillAllBackground


Для цього випадку передбачено спеціальне повідомлення SAM_FetchDone, Яке формується при завершенні процесу фонової вибірки. На малюнку, наведеному нижче, показана процедура обробки цього повідомлення, з індикацією типу повідомлення і закриттям курсора вибірки.

Рис. 5 Обробка повідомлення SAM_FetchDone і закриття курсора


Після виконання вибірки ми отримаємо вікно представлене нижче на малюнку. Перша колонка заповнена номерами записів. У даному прикладі для другого запису проведена заміна вмісту колонки “Ім’я”. Це ім’я збіглося з прізвищем для заміни – “Іванов”.

Рис. 6 Вікно програми із заміною прізвища


Алгоритм заміни закладений в обробку повідомлення SAM_FetchRowDone, Так як при цій операції поля таблиці вже не будуть змінюватися і вони сформовані. При збігу прізвища (colName = dfFamReplace) Значення у колонці буде замінено на “***”.

Рис. 7 Обробка повідомлення SAM_FetchRowDone


Для демонстрації різних режимів заповнення таблиці рекомендуємо Вам використання отладчика (поставте в процедурах обробки повідомлень таблиці точки зупину) і звертайте увагу на індикатор повідомлень. Крім того, при аналізі програми можете використовувати вікно повідомлень отладчика і вікно перегляду змінних.


Щоб не ускладнювати інтерфейс при аналізі різних режимів використовуйте спосіб коментування та разкомментірованія запитів у процедурі обробки натиснення клавіші (“Додати з БД” – pbAddToTabl)
Після виконання дій ви отримаєте працює додаток. Деякі деталі ми свідомо опустили з даного викладу, так як вони докладно були розглянуті нижче. Додаток, який ви отримаєте (step61.app), Можна завантажити тут


Робота з записами на основі таблиці


Далі розглянемо роботу з БД на основі вибірки. Можливі два варіанти: робота з таблицею і робота безпосередньо з вибіркою з БД (Result Set). Нижче приведено вікно програми, які ми побудували для вивчення цих режимів. В процесі подальшого вивчення даної статті Ви самостійно, теж зможете побудувати такий додаток. Заповнення даного вікна призначено для вивчення режиму спільної роботи таблиці і вибірки. Зазначимо, що завдання розбивається на наступні кроки:



  • Формування вибірки і заповнення таблиці,
  • Робота з таблицею, побудована на основі вибірки з БД,
  • Синхронізація таблиці і вибірки,
  • Навігація по записах.

Рис. 8 Вікно програми для вивчення операцій роботи з записами в режимі таблиці.


Для перемикання режимів передбачені спеціальні радіокнопки (“Таблиця“І”Result Set“), Розташовані в нижній частині вікна. Верхня частина вікна у нас така ж, як і в попередньому додатку. Тому залишимо її без коментарів. У нижній частині вікна поля мають таке призначення: поле”Номер запису“Вказує на поточний запис, поле”Ім’я“Використовується для введення і читання імені співробітника, поле”Оклад“- Для введення / виведення окладу, а список”Посада“, Для індикації та введення посад. Захищене поле”Розмір RS“- Визначає обсяг вибірки з БД.
Кнопки для роботи із записами має наступне призначення: кнопка “Додати“Додає записи, кнопка”Видалити“Використовується для їх видалення, а кнопка”Змінити“Призначена для модифікації записів. Думаю, що навігаційні кнопки зрозумілі всім за змістом:”на початок вибірки“, “назад на запис“, “вперед на запис“І”в кінець вибірки“. Поле”Номер для вибору“І кнопка”Вибрати за номером“Дозволяють встановити поточним конкретний номер запису з таблиці або вибірки. Спеціальна кнопка”Сформувати RS“(Вибірку), доступна тільки в режимі”Result Set“.


На наступному малюнку показані всі об’єкти даного додатка. За змістом і назвою читачеві нескладно буде їх зіставити з екранними елементами, тому не будемо витрачати час на це опис. Зазначу тільки, що в таблиці для синхронізації доступу у нас з’явилася спеціальна прихована колонка з назвою colROWID, Вона буде нами використовуватися для редагування та видалення записів.

Рис. 9 Опис об’єктів вікна програми


Розглянемо тепер цикл формування записів в таблицю на нижньому рівні. Спочатку виконується запит, знайомий нам з інших прикладів. Він виконується за допомогою функції виконує одночасно компіляцію і формування вибірки – SqlPrepareAndExecute. В принципі ця операція може бути розділена на дві: окремо компіляція (SqlPrepare) І окремо формування вибірки (SqlExecute). У даній функції вказуються два параметри: курсор (hSql2) І текст запиту. У самому тексті запиту в розділі оператора вибірки INTO перераховані сполучні змінні (bind variables), Які для нашого прикладу збігаються з колонками таблиці: tblTest.colName, tblTest.colOklad, tblTest.colDolg, tblTest.colROWID. Для виділення сполучних змінних перед ними ставиться двокрапка. Зазначимо в цьому запиті наявність вибірки ROWID в спеціальну приховану колонку.


Примітка: В БД для будь-якого запису SQLBase автоматично зберігає спеціальне унікальне підлозі має ім’я ROWID. Це символьне поле (40 символів), яке генерується за спеціальними правилами і служить для ідентифікації записів. При зміні та видалення записів воно змінює своє значення, тому воно може служити для з’ясування того, чи була запис змінена або видалена. У нашому прикладі для операцій зміни та видалення записів, ми будемо використовувати цю колонку.


Правильність виконання операцій можна перевірити за кодом повернення функції (у нашому прикладі це опущено). Після виконання запиту на вибірку ми визначаємо її розмір за допомогою функції SqlGetResultSetCount. Якщо вибірка ненульова (nCount > 0), То організуємо цикл сканування за вибіркою з одночасним занесенням рядків вибірки в таблицю.

Рис. 10 Цикл вибірки в таблицю з RS на основі лічильника записів


Цикл в цьому випадку організований за допомогою оператора Loop, на основі лічильника nCount. Лічильник зменшується на одиницю, а при досягненні нуля цикл переривається (break). На кожному кроці циклу спочатку додається рядок в таблицю (функція – SalTblInsertRow) І в неї вибирається поточна рядок вибірки (SqlFetchRow). В колонку номера (tblTest.colNumb), Відомим нам способом заноситься номер з крапкою. Лічильник циклу зменшується на одиницю. Далі скидаються прапори заголовної колонки для додаються записів (SalTblSetFlagsAnyRows). В кінці процедури вибірка буде закрита і курсор звільняється (SqlCommit). Даний варіант організації циклу вибірки не єдино можливий, але на наш погляд при заповненні таблиці найбільш раціональний.


Після заповнення таблиці ми модем починати працювати з записами. Якщо клацнути мишкою по рядку або заголовної колонці, то автоматично будуть заповнені поля вікна (ім’я, оклад і посаду) і зазначений номер поточного запису (dfNumb). Ці дії підтримуються процедурами, як реакція на повідомлення таблиці. Фрагменти тексту дані нижче.

Рис. 11 Обробка повідомлень при виділенні рядка в таблиці


У нашому прикладі ми будемо використовувати для користувача повідомлення, для заповнення списку посад. Ця константу (FILL_LIST) Потрібно визначити в розділі системних констант, як показано на малюнку нижче.

Рис. 12 Опис користувальницької константи FILL_LIST


Реакція на це повідомлення, визначена в розділі повідомлень комбінованого списку (cmbDolg) Показана на малюнку нижче. При надходженні повідомлення цього типу список буде заповнений запитом до функції SalListPopulate.

Рис. 13. Заповнення списку при створенні та обробці користувацького повідомлення


Тепер розглянемо процедури для роботи із записами співробітників. Нижче наведені фрагменти текстів програми для додавання, видалення та зміни записів. Спочатку ми повинні визначити код посади з пов’язаної таблиці, це робиться простим запитом на основі стану списку посад. Результат отримаємо в змінної – nCodeDolg. Далі для нового запису ми отримуємо новий унікальний код на основі запиту в таблиці співробітників (nMaxCode). Потім цей код збільшуємо на одиницю. Наступним кроком виконуємо запит додавання запису в БД (INSERT). Так як стан таблиці повинно змінитися, то очищаємо її і знову заповнюємо, але на цей раз за допомогою функції SalTblPopulate. Запит заповнення таблиці аналогічний вихідного запиту. При видаленні записів досить використовувати ROWID поточного запису в таблиці для виконання запиту. Видалення виконується стандартної командою SQLDELETE. Після видалення запису таблиця повинна бути оновлена ​​аналогічним чином. При редагуванні записів, необхідно отримати новий код посади і виконати команду SQL UPDATE, Використовуючи відповідні сполучні змінні (поля: dfName , nCodeDol, dfOklad). Код записи редагувати не можна. Після редагування таблиця знову буде заповнена. В принципі, якщо обсяг вибірки великий, то можна не заповнювати таблицю заново, а використовувати спеціальні функції для її оновлення (SalTblDoInsert, SalTblDoDeletes, SalTblDoUpdate). Але ці функції ми розглянемо пізніше в інших статтях.

Рис. 14 Процедура додавання нового запису співробітника


Текст процедури видалення записів представлений нижче.

Рис. 15 Процедура видалення запису з БД


Текст процедури редагування записів представлений нижче.

Рис. 16 Процедура редагування запису в БД


Раніше ми відзначали, що можливі різні варіанти циклів для формування вибірки в таблицю. Приклад такого циклу, можливо менш економічного, представлений на малюнку нижче. Особливістю даного циклу є те, що заздалегідь не визначається обсяг вибірки, а завершення циклу відбувається на основі коду повернення отриманого при скануванні вибірки (nErr = FETCH_EOF). Через це доводиться видаляти зайву рядок, сформовану в циклі. Всі інші операції з таблицею ідентичні.


 

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*