Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Unidirectional, оставить последнюю запись активной в наборе / 25 сообщений из 27, страница 1 из 2
20.11.2021, 07:11
    #40113299
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Наблюдаю непонятное поведение в FireDAC, набор Unidirectional.
Идет запрос. Идет в цикле вычитка текущей, активной записи из набора, Next, и так до Eof.
Всё отлично читается до Eof = true. Но! Когда случается Eof, то набор становится пустым, IsEmpty = True. Соответственно из него вычитать уже ничего нельзя, все поля обнуливаются. Посмотрел что в IsEmpty, FActiveRecord = 0; FRecordCount = -1.
Ранее использовал два набора: IBX и UniDAC, оба не опустошали набор в случае достижения конца фетча в Unidirectional режиме.
Видимое поведение крайне неудобно. Последняя вычитанная из базы запись бывает нужна после Eof=True.
Вопрос: можно ли это как-то настроить опциями FireDAC набора? Очень не хочется Unidirectional отключать только ради этого или какие-то костыли использовать для хранения данных последней записи.
...
Рейтинг: 0 / 0
20.11.2021, 07:26
    #40113300
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Да. Delphi 10.4.2, Win32.
...
Рейтинг: 0 / 0
20.11.2021, 19:04
    #40113380
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Как бы по классике Eof - это не последняя запись, а за последней записью. Так что для Unidirectional поведение логичное
...
Рейтинг: 0 / 0
20.11.2021, 20:49
    #40113416
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_
Как бы по классике Eof - это не последняя запись, а за последней записью. Так что для Unidirectional поведение логичное
Ну последняя отфетченная запись тем не менее должна оставаться доступной. Неужели это не так?
...
Рейтинг: 0 / 0
20.11.2021, 21:28
    #40113423
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
YuRock,

Вот, увы, нет. И это крайне неудобно. База, к слову, FireBird 2.5. Может у кого будут идеи что можно покрутить.
...
Рейтинг: 0 / 0
20.11.2021, 23:07
    #40113449
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Логику приложения. После завершения нормального цикла
Код: sql
1.
2.
3.
4.
while not ds.eof do
begin
   a := ds.fieldByName('a').asInteger;
end;


переменная а сохраняет своё значение. По счастливой случайности это значение -
из последней записи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.11.2021, 00:10
    #40113457
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
...
Рейтинг: 0 / 0
21.11.2021, 02:48
    #40113465
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
Да может быть, конечно. Но я привык
...
Рейтинг: 0 / 0
21.11.2021, 11:18
    #40113493
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
AutoClose = False не поможет?
...
Рейтинг: 0 / 0
21.11.2021, 15:16
    #40113534
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Michael Longneck,

не помогло, смотрю пока дальше
...
Рейтинг: 0 / 0
21.11.2021, 18:04
    #40113573
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
А если заменить TFDQuery на TFDCommand?
...
Рейтинг: 0 / 0
21.11.2021, 18:34
    #40113580
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_,

TFDCommand - это не набор, это просто команды без возращенных данных
...
Рейтинг: 0 / 0
21.11.2021, 18:37
    #40113582
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
нашел что не так. видимо это бай дизайн. думаю пока как переписать:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
          if lUnidir then begin //если однонаправленный
            Inc(FUnidirRecsPurged, FTable.Rows.Count);
            FTable.Clear; //то чистим все записи
            FRecordIndex := -1;
            iFromRec := 0;
          end;
          iLastIndex := FRecordIndex;
          iFetched := DoFetch(FTable, AAll and not lUnidir, ADirection); //и пробуем что-то отфетчить. отфетичлось - ок, нет - выставили флаг EOF. но буфер записей пустой
...
Рейтинг: 0 / 0
21.11.2021, 18:39
    #40113583
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof


Вот именно такая схема.
...
Рейтинг: 0 / 0
21.11.2021, 18:41
    #40113586
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Dimitry Sibiryakov

Логику приложения. После завершения нормального цикла
Код: sql
1.
2.
3.
4.
while not ds.eof do
begin
   a := ds.fieldByName('a').asInteger;
end;


переменная а сохраняет своё значение. По счастливой случайности это значение -
из последней записи.


а теперь представь, если нужных полей штук 10
и переменных изначально в коде не было, так как проблем не было ни разу на двух наборах. придётся перелопачивать всё везде.
и мест таких много.
...
Рейтинг: 0 / 0
21.11.2021, 18:45
    #40113587
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaonа теперь представь, если нужных полей штук 10

10 операторов присваивания. Ничего, от чего бы на пальцах появились мозоли.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.11.2021, 19:32
    #40113592
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaon,

Код: sql
1.
2.
3.
select first 1 * 
from <table>
order by <column-list> desc
...
Рейтинг: 0 / 0
21.11.2021, 21:39
    #40113614
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaon
TFDCommand - это не набор, это просто команды без возращенных данных
Нет. Это аналог TIBSQL. Выполнение запроса без TDataSet. Смотри пример из тынца
...
Рейтинг: 0 / 0
22.11.2021, 10:23
    #40113664
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_,

придется немало переписывать, структура работы совсем другая.
пока что думаю над правкой компоненты. предварительно: буду сохранять запись и пробовать фетчить еще одну. если отфетчилось, то первую, старую, запись под нож. если нет - то она останется. лучше идей как-то нет.
...
Рейтинг: 0 / 0
22.11.2021, 10:50
    #40113678
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaon,

Я не пойму, если тебе нужна только последняя запись, почему бы ее не вытаскивать запросом конкретно ее?

P.S. Сам я Unidirectional не использую никогда. Если он нужен, то использую не датасеты: TIBSQL/TFDCommand...
...
Рейтинг: 0 / 0
22.11.2021, 10:55
    #40113682
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaon,

Посмотри еще в сторону TFDCommand + TFDQuery.AttachTable()
...
Рейтинг: 0 / 0
22.11.2021, 13:04
    #40113729
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_,

мне нужна не только последняя запись. сценарий такой, для примера:
1. выбираем 50 записей
2. пробегаемся в цикле Next, обрабатываем нужные записи до Eof
3. выходим из цикла, снаружи цикла обрабатываем последнюю запись дополнительно
...
Рейтинг: 0 / 0
22.11.2021, 13:07
    #40113731
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
_Vasilisk_,

я то TIBSQL сам использовал, пока проекты были на IBX'ах. там всё работало как нужно. потом переписал на UniDAC, там тоже всё ок. и вот решил таки DAC, но встроенный заюзать и повылазило несовместимостей слегка :) так то всяко разрулил, кроме этой. эта, похоже, бай дизайн.
за рекомендации спасибо. буду тут думать как лучше разрулить
...
Рейтинг: 0 / 0
22.11.2021, 13:17
    #40113734
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
makhaon2. пробегаемся в цикле Next, обрабатываем нужные записи до Eof
3. выходим из цикла, снаружи цикла обрабатываем последнюю запись дополнительно

То есть последнюю запись ты обрабатываешь два раза. Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.11.2021, 13:37
    #40113744
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
Можно сохранять как массив вариантов, тогда код будет общим для любых полей (разве что кроме блобов). Либо поискать какой-нибудь DataSet.CloneCurrentRecord(DestDataSet) в потрохах ОгнеУтки.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Unidirectional, оставить последнюю запись активной в наборе / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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