Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.11.2019, 15:02
matador955 matador955 вне форума
Прохожий
 
Регистрация: 10.11.2019
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
Злость Мистическое изменение значения поля (D7+FB25+FIBplus)

Коллеги, нужна помощь.

Попал в руки старый чужой проект, который надо было немного доработать. До этого никогда с FireBird дел не имел (я ораклист со стажем). При добавлении нового интерфейса в проект столкнулся с необъяснимой ошибкой. Выражается она в том, что в интерфейсе проекта в гриде одно (и только одно!) поле показывается с ошибочным значением.

Теперь подробно. В FB есть вьюха со следующим кусочком кода:

Код:
create view ... as select 
 ....
  ,cast(iif(mc.is_closed=1,null,
             DATEDIFF( DAY , cast(( select max(oo.orderdate) from orders oo where oo.pcode = mc.pcode
                                  ) as date), date 'TODAY')
            ) as bigint) as last_visit, 
 ...
from .....
Смысл этого поля - показать, сколько дней прошло с момента оформления последнего объекта типа ORDER.

Содержимое этой вьюхи я показываю в гриде, реализованном на компоненте TDBGridEh из библиотеки EhLib версии 4. Для доступа к данным используется библиотека FIBplus версии 7.6, компонент FIBDataSet.
В компоненте созданы статические поля (Fields), т.к. есть потребность в полях тип Lookup. Теперь собственно проблема: при открытии этой View из средства SQL-разработки (IBExpert) я вижу корректное значение этого поля (неоднократно проверял вручную по исходным таблицам). Но вот при запуске моего проекта в соответствующей колонке видны значения на 2 или 3 единицы МЕНЬШЕ !!!!! Ну т.е. через IBExpert вижу, например, значение поля "3", а в интерфейсе своего проекта - "1". Подобное уменьшение значения происходит по всей колонке (т.е. по всем строкам датасета).

Столкнувшись с проблемой впервые, подумал, что причина кроется в статически созданных полях (я тогда активно менял наполнение той самой вьюхи, и подумал, что идет неправильный мапинг полей на буфер строки данных ), и заново пересоздал все Fields объекта FIBDataSet. Ошибка ушла, значения стали показываться корректные. НО! Через несколько дней, НА ТОМ ЖЕ exe-ФАЙЛЕ ошибка вернулась. Я опять запускаю Delphi, удаляю все Fields и пересоздаю их заново - проблема уходит. Опять не трогаю проект, опять проходит 2-3 дня - и опять ошибка в визуализации!!!! И опять пересоздание Fields решает проблему.

Коллеги, какие есть идеи о причинах подобной мистики?
Ответить с цитированием
  #2  
Старый 10.11.2019, 19:05
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

А в проблемном столбце грида свойство LookupParams-LookupCache отключено?
Ответить с цитированием
  #3  
Старый 11.11.2019, 15:10
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от matador955
...удаляю все Fields и пересоздаю их заново - проблема уходит. Опять не трогаю проект, опять проходит 2-3 дня - и опять ошибка в визуализации!!!! И опять пересоздание Fields решает проблему...
Так и создавай каждый раз поля в момент запуска приложения и всё...
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #4  
Старый 15.11.2019, 12:07
matador955 matador955 вне форума
Прохожий
 
Регистрация: 10.11.2019
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
Злость

Цитата:
Сообщение от Guaho
А в проблемном столбце грида свойство LookupParams-LookupCache отключено?

LookupCache=false, проверил сейчас. Так что не оно.

Вообще, наблюдение за ситуацией наводит на идиотскую мыль о том, что фраза "... date 'TODAY' ...", будучи вставлена во VIEW, превращается сервером в константу в момент компиляции VIEW.
Я несколько дней подряд наблюдал за поведением приложения, при том, что не прикасался к exe-файлу вообще, и даже специально запускал его не из среды разработки. Так вот, на протяжении последних 3 дней, ошибка в данных увеличивалась на минус единицу в каждый следующий день (!). Честно говоря в шоке от такого. Сейчас наплодил тестовых VIEW, проверю их после выходных (чтобы дата компиляции отличалась от текущей даты). Но если гипотеза подтвердится..... Просто нет слов.
Ответить с цитированием
  #5  
Старый 15.11.2019, 19:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Еще попробуй использовать CURRENT_DATE и NOW вместо TODAY.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter