Звітові форми. Робота з обмеженнями і сервітутами

Геодезична інформаційна система 5.3

Модератор: NickS

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Звітові форми. Робота з обмеженнями і сервітутами

Повідомлення NickS » 01 лютого 2010, 14:45

Здесь рассматриваем работу с ограничениями, сервитутами и аренды, на уровне программирования отчётных форм. :ugeek:

NTD
Повідомлень: 26
З нами з: 23 липня 2008, 10:29

Re: Отчётные формы. Работа с ограничениями и сервитутами

Повідомлення NTD » 01 лютого 2010, 14:51

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

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Работа с ограничениями и сервитутами

Повідомлення NickS » 01 лютого 2010, 16:06

Список усіх (обмежень, сервітутів, оренди та суборенди) знаходиться в таблиці DataModule1.Table10. Коли Ви стаєте на якусь ділянку, то ця таблиця заповнюється, відповідно, тими об'єктами, що є в цій ділянці. Тобто, як я вже сказав, тут присутні не тільки обмеження, а тому доведеться їх фільтрувати.

Тип кожного запису визначається полем 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);