|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Сортировка по вычисляемому полю, 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
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
redoks (09.12.2015)
|
#3
|
|||
|
|||
хм
LockType = BatchOptimistic
После я обновлял записи через ADOQuery.UpdateBatch; До того как начал добавлять поле в запросе, все было нормально. |
#4
|
|||
|
|||
Скорее всего используется запрос на UPDATE по умолчанию, т.е. он автоматически пытается обновить и вычисляемое (в запросе) поле. Надо просто добавить спец. компонент для встаки/обновления/удаления записей и прописать там правильные запросы, исключив это поле.
Еще вариант - devExpress'овсеий грид. Этот умеет сортировать все. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
redoks (09.12.2015)
|
#5
|
|||
|
|||
Ну в конечном итоге так и сделал.
Добавил дополнительный ADOQuery для редактирования. Там я формирую запросы на вставку и редактирование, а этим только считываю. |
#6
|
|||
|
|||
Если я вручную вставлю число в XLS, и проставлю формат ячейки "число".
Селект возвращает - число. Последующие INSERT вставляют число. Если я вручную проставлю формат, но без вставки числа. Он мне возвращает String. Последующие INSERT вставляют строку. Если я через OLE проставлю формат, и вставляю число. Последующие INSERT вставляют число. Все свелось к тому, что ошибочно работает только с первой записью и если первая запись некорректно завелась, то последующий то же заведутся не правильно. |