powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск наружения в последовательности ДАТЫ
5 сообщений из 30, страница 2 из 2
Поиск наружения в последовательности ДАТЫ
    #39304129
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

Еще вопрос по структуре.
Зачем нужна ссылка на предыдущее обращение?
Подозреваю что предыдущее обращение, если оно есть, просто имеет номер меньше чем у текущего на 1.
Если этот так то ссылка не имеет смысла.

Последнее обращение, которое с номером 0, перенумеровывается после закрытия?
Даты окончания могут быть NULL? А у текущего с номером 0 дата закрытия сразу какая-то ставится или до закрытия и перенумеровки там NULL?
...
Рейтинг: 0 / 0
Поиск наружения в последовательности ДАТЫ
    #39304136
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и не понял какие даты нужно править, и на какие,
но найти перекрытия по датам между разными обращениями можно примерно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
execute block
returns (
  app_num     integer,
  cal_num_pre integer, -- номер предыдущего обращения
  cal_num     integer,
  data_e_pre  date,    -- дата конца предыдушего обращения
  data_s      date,
  data_e      date,
  err         varchar(50)
)
as
begin
  data_e_pre = NULL;

  for select
    applic.app_num,
    applic.cal_num,
    applic.data_s,
    applic.data_e

  from applic

  where (applic.app_num = 642882)

  order by
    iif(applic.cal_num = 0, 1, 0), -- поставим нулевое обращение в конец списка обращений
    applic.cal_num

  into :app_num, :cal_num, :data_s, :data_e
  do begin
       -- проверим перекрытие дат
       -- в случае первой итерации сравнение с NULL даст False, т.е. ложную ошибку не выдаст
       -- т.о. первую итерацию в условии можно дополнительно не обрабатывать
       if (:data_e_pre > :data_s)
         then err = 'data_e_pre > data_s';
         else err = '';

       -- если это не первое обращение то выдадим запись
       if (not (:data_e_pre is NULL)) then suspend;
       -- запишем в поля значение и текущей записи, на след. итерации они будут значением предыдущей
       data_e_pre  = :data_e;
       cal_num_pre = :cal_num;
     end

end



Запрос выдает обращения одного дела, отсортированные в порядке создания, нулевое в конце.
Для каждого обращения выводится дата окончания предыдущего обращения, и их можно сравнить.
Соответственно, первое обращение напрямую не выводится, у него нет предыдущего.
В реале записи без ошибок выводить скорее всего не нужно, но так как я написал - удобно для отладки.

Приведенный запрос выдает такие данные:

APP_NUMCAL_NUM_PRECAL_NUMDATA_E_PREDATA_SDATA_EERR64288212 30.09.201601.03.201630.04.2016data_e_pre > data_s6428822330.04.201601.05.201630.04.2016 6428823430.04.201601.05.201630.04.2016 6428824530.04.201601.05.201630.04.2016 6428825630.04.201601.05.201631.05.2016 6428826731.05.201601.06.201630.06.2016 6428827830.06.201601.07.201630.06.2016 6428828030.06.201601.07.201628.02.2017
...
Рейтинг: 0 / 0
Поиск наружения в последовательности ДАТЫ
    #39304153
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще по структуре данных.
Посмотрев профиль обнаружил что ты уже какое-то время копаешь эту унаследованную от предшественников структуру.
Мне кажется что с датами у тебя неправильная установка.
Нельзя допускать что бы дата окончания обращения была меньше даты начала, т.е. период времени отрцательный. В этом нет физического смысла. Попытка выдержать условие что дата начала следующего обращения обязательно должна быть больше даты окончания предыдущего такую фигню как отрицательный временной промежуток все равно не оправдывает.

Более логично допустить равенство дат одного обращения, считая что это отображает ситуацию что обращение было закрыто в день начала. А так же допустить что в один день может быть несколько обращений.

По большому счету может быть несколько активных обращений. Не знаю что там у тебя за физический смысл, но допустим было несколько заявок с разными вопросами, и по всем заявкам выполняется отдельная работа, возможно разными людьми.

Активную заявку я бы искал по пустой дате окончания а не по ее номеру искуственно приянутому за уши в 0.

И по ссылкам на предыдущее обращение. Я уже говорил но повторюсь, если это ссылка - то в случае физического отсутствия ссылки там должен быть NULL а не 0. Это я про обращение номер 1, там ссылка на предыдущее 0, но 0 у тебя означает последнее а не предыдущее.

Соответственно:
- на 0 ссылаться никто не может, оно же самое последнее
- использовать для обработки цепочек рекурсивные запросы или процедуры нельзя, ибо у тебя ссылки закольцованы
...
Рейтинг: 0 / 0
Поиск наружения в последовательности ДАТЫ
    #39304182
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,
Спасибо за совет. Я это понимаю, но пока это ДОС приложение я ничего поделать не могу. Это база на Clarion.
Для поиска некоторых пробле использую родной конвертер в ДБФ, потом импорт в FB и уже потом начинаю искать проблемные участки.

Вопросом переписывания программы под ВИН как раз занимаемся.
Дату окончания нужно ставить обязательно т.к. это база по субсидиям на жилищно-комунальные услуги и период действия с момента обращения четко прописан.

По вопросу структуры и полного описания БД, под новую программу, я еще буду писать т.к. понимаю что то что было нормально 20 лет назад, именно тогда была разработана эта система, сейчас уже не нормально и с СУБД типа Firebird можно реализовать что-то проще

Огромное спасибо за код execute block. Я только стараюсь разобраться со всем этим и есть сложности. Теперь по моему конкретному вопросу у меня будет конкретный пример. Буду изучать. Спасибо :)
...
Рейтинг: 0 / 0
Поиск наружения в последовательности ДАТЫ
    #39304183
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе по Cal_last я могу провести замену 0 на null - это не проблема
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск наружения в последовательности ДАТЫ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]