Звітові форми. Робота з обмеженнями і сервітутами
Модератор: NickS
Звітові форми. Робота з обмеженнями і сервітутами
Здесь рассматриваем работу с ограничениями, сервитутами и аренды, на уровне программирования отчётных форм.
Re: Отчётные формы. Работа с ограничениями и сервитутами
Я хочу зробити звіт в якому буде виводитись в рядок коди всіх діючих обмежень ділянки. Як це зробити? Який для цього має бути скрипт? Які функції використовувати, щоб "перебирати" обмеження?
Re: Отчётные формы. Работа с ограничениями и сервитутами
Список усіх (обмежень, сервітутів, оренди та суборенди) знаходиться в таблиці DataModule1.Table10. Коли Ви стаєте на якусь ділянку, то ця таблиця заповнюється, відповідно, тими об'єктами, що є в цій ділянці. Тобто, як я вже сказав, тут присутні не тільки обмеження, а тому доведеться їх фільтрувати.
Тип кожного запису визначається полем DataModule1.Table10."ID_TypeDoc": 0 - сервітут, 1 - обмеження, 2 - оренда, 3 - суборенда
Перебирати таблицю і фільтрувати будемо в циклі. Весь код будемо писати для frf (від fr3 він буде відрізнятись тільки назвами таблиць)
Саме перше, що потрібно зробити, це перевірити чи є взагалі об'єкти в цій таблиці! Є така функція - RecordCount() - вона виводить кількість всіх записів у таблиці. Якщо їх немає - виводить 0.
Отже, якщо записів немає, то наша програма, що буде в операторних дужках (begin та end), не буде виконуватись. За логікою, потрібно стати на найперший запис у таблиці. Функція, яка стає на перший запис - DataFirst(). Цей алгоритм циклу, що я описую і функції можна примінити до будь-якої таблиці.
Є така функція DataEOF(), яка виводить true, якщо в таблиці досягли останнього запису. А також використаємо функцію DataNext() - яка переходить на наступний запис. Таким чином створимо цикл
Таким чином в нас уже вийшла готова програмка, яка просто "пробіжиться" по всім записам таблиці. Але тепер, нам потрібно буде кожен запис перевіряти, адже потрібно відібрати тільки обмеження. перевіряти ми будемо по полю DataModule1.Table10."ID_TypeDoc". Будемо вибирати тільки ті записи, що рівні 1 - це обмеження. Але це не всі перевірки. Ми ж хочемо мати тільки ДІЮЧІ (активні) обмеження!
По-перше, активні - це ті, що в параметрі обмеження "Запись активна" ввімкнені як "да". Якщо вони позначені як "да", то поле [DataModule1.Table10."Mark"] = 'ю'.
По-друге, діюче обмеження таке, що в ньому або не заповнена дата в параметрі "Начало действия", або ця дата вже настала (наприклад, дата 12.03.2013 ще не настала, тому це обмеження брати не будемо). Тому така умова ще має бути ((<frxDb10."FirstDate"> = 0) or (<frxDb10."FirstDate"> < Date)
Date - це поточна дата системного годинника
По-третє, є ще параметр "Окончания действия". Потрібно щоб ця дата ще не настала, або була відсутня - (<frxDb10."LastDate"> = 0) or (<frxDb10."LastDate"> > Date).
Тому ось таким стане код з умовою:
Тепер залишилось створити рядок і в нього "втягувати" коди типу обмежень:
І наостанок "відрізати" в кінці рядка зайві кому з пробілом:
Ось весь повністю закінчений скрипт:
Тип кожного запису визначається полем DataModule1.Table10."ID_TypeDoc": 0 - сервітут, 1 - обмеження, 2 - оренда, 3 - суборенда
Перебирати таблицю і фільтрувати будемо в циклі. Весь код будемо писати для frf (від fr3 він буде відрізнятись тільки назвами таблиць)
Саме перше, що потрібно зробити, це перевірити чи є взагалі об'єкти в цій таблиці! Є така функція - RecordCount() - вона виводить кількість всіх записів у таблиці. Якщо їх немає - виводить 0.
Код: Виділити все
If RecordCount('DataModule1.Table10') > 0 then
begin
end
Отже, якщо записів немає, то наша програма, що буде в операторних дужках (begin та end), не буде виконуватись. За логікою, потрібно стати на найперший запис у таблиці. Функція, яка стає на перший запис - DataFirst(). Цей алгоритм циклу, що я описую і функції можна примінити до будь-якої таблиці.
Код: Виділити все
If RecordCount('DataModule1.Table10') > 0 then
begin
DataFirst('DataModule1.Table10');
end
Є така функція DataEOF(), яка виводить true, якщо в таблиці досягли останнього запису. А також використаємо функцію DataNext() - яка переходить на наступний запис. Таким чином створимо цикл
Код: Виділити все
If RecordCount('DataModule1.Table10') > 0 then
begin
DataFirst('DataModule1.Table10');
While DataEOF('DataModule1.Table10') = False Do
begin
DataNext('DataModule1.Table10');
end;
end
Таким чином в нас уже вийшла готова програмка, яка просто "пробіжиться" по всім записам таблиці. Але тепер, нам потрібно буде кожен запис перевіряти, адже потрібно відібрати тільки обмеження. перевіряти ми будемо по полю DataModule1.Table10."ID_TypeDoc". Будемо вибирати тільки ті записи, що рівні 1 - це обмеження. Але це не всі перевірки. Ми ж хочемо мати тільки ДІЮЧІ (активні) обмеження!
По-перше, активні - це ті, що в параметрі обмеження "Запись активна" ввімкнені як "да". Якщо вони позначені як "да", то поле [DataModule1.Table10."Mark"] = 'ю'.
По-друге, діюче обмеження таке, що в ньому або не заповнена дата в параметрі "Начало действия", або ця дата вже настала (наприклад, дата 12.03.2013 ще не настала, тому це обмеження брати не будемо). Тому така умова ще має бути ((<frxDb10."FirstDate"> = 0) or (<frxDb10."FirstDate"> < Date)
Date - це поточна дата системного годинника
По-третє, є ще параметр "Окончания действия". Потрібно щоб ця дата ще не настала, або була відсутня - (<frxDb10."LastDate"> = 0) or (<frxDb10."LastDate"> > Date).
Тому ось таким стане код з умовою:
Код: Виділити все
If RecordCount('DataModule1.Table10') > 0 then
begin
DataFirst('DataModule1.Table10');
While DataEOF('DataModule1.Table10') = False Do
begin
If ([DataModule1.Table10."ID_TypeDoc"] = 1) and ([DataModule1.Table10."Mark"] = 'ю') and
((([DataModule1.Table10."FirstDate"] = 0) or ([DataModule1.Table10."FirstDate"] < Date)) and
(([DataModule1.Table10."LastDate"] = 0) or ([DataModule1.Table10."LastDate"] > Date))) then
begin
end;
DataNext('DataModule1.Table10');
end;
end
Тепер залишилось створити рядок і в нього "втягувати" коди типу обмежень:
Код: Виділити все
If LocateData('DataModule1.TbTypeLimit', 'Code_TypeUses', [DataModule1.Table10."ID_TypeLimitation"]) then
KodObm := KodObm + [DataModule1.TbTypeLimit."SmallName"] + ', ';
І наостанок "відрізати" в кінці рядка зайві кому з пробілом:
Код: Виділити все
If Length(Trim(KodObm)) > 0 then
KodObm := Copy(KodObm, 1, Length(KodObm) - 2);
Ось весь повністю закінчений скрипт:
Код: Виділити все
KodObm := ''; //Коди обмежень
If RecordCount('DataModule1.Table10') > 0 then
begin
DataFirst('DataModule1.Table10');
While DataEOF('DataModule1.Table10') = False Do
begin
If ([DataModule1.Table10."ID_TypeDoc"] = 1) and ([DataModule1.Table10."Mark"] = 'ю') and
((([DataModule1.Table10."FirstDate"] = 0) or ([DataModule1.Table10."FirstDate"] < Date)) and
(([DataModule1.Table10."LastDate"] = 0) or ([DataModule1.Table10."LastDate"] > Date))) then
begin
If LocateData('DataModule1.TbTypeLimit', 'Code_TypeUses', [DataModule1.Table10."ID_TypeLimitation"]) then
KodObm := KodObm + [DataModule1.TbTypeLimit."SmallName"] + ', ';
end;
DataNext('DataModule1.Table10');
end;
If Length(Trim(KodObm)) > 0 then
KodObm := Copy(KodObm, 1, Length(KodObm) - 2);