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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Поле появилось, считает правильно. Сортировка теперь работает.

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

Что теперь делать?
Как исправить?
Ответить с цитированием
  #2  
Старый 03.12.2015, 12:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от redoks
...Но при попытке внести изменения записи выдает ошибку:
Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени её последнего чтения...
Так вы где изменения пытаетесь внести, в выборке что в квери? Нужно её источник изменять, первоисточник
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
redoks (09.12.2015)
  #3  
Старый 04.12.2015, 05:21
redoks redoks вне форума
Прохожий
 
Регистрация: 02.12.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию хм

LockType = BatchOptimistic

После я обновлял записи через ADOQuery.UpdateBatch;
До того как начал добавлять поле в запросе, все было нормально.
Ответить с цитированием
  #4  
Старый 04.12.2015, 20:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Скорее всего используется запрос на UPDATE по умолчанию, т.е. он автоматически пытается обновить и вычисляемое (в запросе) поле. Надо просто добавить спец. компонент для встаки/обновления/удаления записей и прописать там правильные запросы, исключив это поле.
Еще вариант - devExpress'овсеий грид. Этот умеет сортировать все.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
redoks (09.12.2015)
  #5  
Старый 09.12.2015, 04:39
redoks redoks вне форума
Прохожий
 
Регистрация: 02.12.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ну в конечном итоге так и сделал.
Добавил дополнительный ADOQuery для редактирования. Там я формирую запросы на вставку и редактирование, а этим только считываю.
Ответить с цитированием
  #6  
Старый 11.12.2015, 03:29
redoks redoks вне форума
Прохожий
 
Регистрация: 02.12.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Если я вручную вставлю число в XLS, и проставлю формат ячейки "число".
Селект возвращает - число.

Последующие INSERT вставляют число.

Если я вручную проставлю формат, но без вставки числа.
Он мне возвращает String.

Последующие INSERT вставляют строку.


Если я через OLE проставлю формат, и вставляю число.

Последующие INSERT вставляют число.

Все свелось к тому, что ошибочно работает только с первой записью и если первая запись некорректно завелась, то последующий то же заведутся не правильно.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter