Показать сообщение отдельно
  #1  
Старый 02.12.2015, 12:16
redoks redoks вне форума
Прохожий
 
Регистрация: 02.12.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сортировка по вычисляемому полю, ADOQuery, DBGrid, Excel

Есть база в файле .XLS - MyBase.
Есть поля - ID, Date

Нужно считать сколько дней осталось до ближайшей следующей даты из поля Date, перенося год.

Пусть считаемое поле имеет название DaysTo.

например:
Сегодня 27.11.2015
Если значение поля Date 26.11.2014 то выводит 365
(смотрит что дата уже прошла, подставляет текущий год, и если дата опять прошла, то подставляет следующий год) .
Если Date 28.11.2015 то выводит 1.

Сделал. Добавил поле в ADOQuery, проставил тип fkCalculated.
На событии onCalcField высчитал его.
Прописал сортировку в DBGrid - не сортирует.
Ошибка: Не найден элемент в коллекции.

Поискал в интернете, почитал форумы, задал вопрос.
Ответили - ставь DBGridEh - он умеет сортировать вычисляемые поля.

Поставил. Вычитал настройки.
SortLocal := true;
uses EhLibADO, EhLibMte;
DBGridEh - не сортирует по полю DaysTo.

Поискал в интернете, почитал форумы, задал вопрос.
Ответили - не *** нам мозги, вычисляй в запросе. DBgridEh НЕ (уже?!?!) умеет сортировать такие поля.

Потыкался, помыкался, написал запрос:
Код:
  SQL := 'Select *,' +
       'iif( Date() > Date' +
        ', iif(DateSerial(Year(Date()),Month(Date),DatePart(''d'', Date)) < Date()' +
            ',int(datediff(''d'', date(), DateSerial(Year(Date())+1,Month(Date),DatePart(''d'', Date))))'+
            ',int(datediff(''d'', date(), DateSerial(Year(Date()),Month(Date),DatePart(''d'', Date)))))' +
        ', int(datediff(''d'', date(), date)))' +
        ' as DaysTo  from [MyBase$]';

В ADOQuery проставил у поля DaysTo тип fkData.
Поле появилось, считает правильно. Сортировка теперь работает.

Но при попытке внести изменения записи выдает ошибку:
Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени её последнего чтения.

Что теперь делать?
Как исправить?
Ответить с цитированием