Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
Наблюдаю непонятное поведение в FireDAC, набор Unidirectional.
Идет запрос. Идет в цикле вычитка текущей, активной записи из набора, Next, и так до Eof.
Всё отлично читается до Eof = true. Но! Когда случается Eof, то набор становится пустым, IsEmpty = True. Соответственно из него вычитать уже ничего нельзя, все поля обнуливаются. Посмотрел что в IsEmpty, FActiveRecord = 0; FRecordCount = -1.
Ранее использовал два набора: IBX и UniDAC, оба не опустошали набор в случае достижения конца фетча в Unidirectional режиме.
Видимое поведение крайне неудобно. Последняя вычитанная из базы запись бывает нужна после Eof=True.
Вопрос: можно ли это как-то настроить опциями FireDAC набора? Очень не хочется Unidirectional отключать только ради этого или какие-то костыли использовать для хранения данных последней записи.
20 ноя 21, 07:11    [22398248]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
Да. Delphi 10.4.2, Win32.
20 ноя 21, 07:26    [22398249]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Как бы по классике Eof - это не последняя запись, а за последней записью. Так что для Unidirectional поведение логичное
20 ноя 21, 19:04    [22398392]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4936
_Vasilisk_
Как бы по классике Eof - это не последняя запись, а за последней записью. Так что для Unidirectional поведение логичное
Ну последняя отфетченная запись тем не менее должна оставаться доступной. Неужели это не так?
20 ноя 21, 20:49    [22398439]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
YuRock,

Вот, увы, нет. И это крайне неудобно. База, к слову, FireBird 2.5. Может у кого будут идеи что можно покрутить.

Сообщение было отредактировано: 20 ноя 21, 21:31
20 ноя 21, 21:28    [22398453]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

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

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

Posted via ActualForum NNTP Server 1.5

20 ноя 21, 23:07    [22398493]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
21 ноя 21, 00:10    [22398504]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4936
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
Да может быть, конечно. Но я привык
21 ноя 21, 02:48    [22398515]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2386
AutoClose = False не поможет?
21 ноя 21, 11:18    [22398563]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
Michael Longneck,

не помогло, смотрю пока дальше
21 ноя 21, 15:16    [22398664]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
А если заменить TFDQuery на TFDCommand?
21 ноя 21, 18:04    [22398725]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
_Vasilisk_,

TFDCommand - это не набор, это просто команды без возращенных данных
21 ноя 21, 18:34    [22398744]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
нашел что не так. видимо это бай дизайн. думаю пока как переписать:

          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. но буфер записей пустой
21 ноя 21, 18:37    [22398748]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof


Вот именно такая схема.
21 ноя 21, 18:39    [22398749]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
Dimitry Sibiryakov

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

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


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

Сообщение было отредактировано: 21 ноя 21, 18:43
21 ноя 21, 18:41    [22398752]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

makhaon
а теперь представь, если нужных полей штук 10

10 операторов присваивания. Ничего, от чего бы на пальцах появились мозоли.

Posted via ActualForum NNTP Server 1.5

21 ноя 21, 18:45    [22398753]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2656
makhaon,

select first 1 * 
from <table>
order by <column-list> desc
21 ноя 21, 19:32    [22398760]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
makhaon
TFDCommand - это не набор, это просто команды без возращенных данных
Нет. Это аналог TIBSQL. Выполнение запроса без TDataSet. Смотри пример из тынца
21 ноя 21, 21:39    [22398801]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
_Vasilisk_,

придется немало переписывать, структура работы совсем другая.
пока что думаю над правкой компоненты. предварительно: буду сохранять запись и пробовать фетчить еще одну. если отфетчилось, то первую, старую, запись под нож. если нет - то она останется. лучше идей как-то нет.
22 ноя 21, 10:23    [22398932]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
makhaon,

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

P.S. Сам я Unidirectional не использую никогда. Если он нужен, то использую не датасеты: TIBSQL/TFDCommand...
22 ноя 21, 10:50    [22398953]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
makhaon,

Посмотри еще в сторону TFDCommand + TFDQuery.AttachTable()
22 ноя 21, 10:55    [22398959]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
_Vasilisk_,

мне нужна не только последняя запись. сценарий такой, для примера:
1. выбираем 50 записей
2. пробегаемся в цикле Next, обрабатываем нужные записи до Eof
3. выходим из цикла, снаружи цикла обрабатываем последнюю запись дополнительно
22 ноя 21, 13:04    [22399037]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
_Vasilisk_,

я то TIBSQL сам использовал, пока проекты были на IBX'ах. там всё работало как нужно. потом переписал на UniDAC, там тоже всё ок. и вот решил таки DAC, но встроенный заюзать и повылазило несовместимостей слегка :) так то всяко разрулил, кроме этой. эта, похоже, бай дизайн.
за рекомендации спасибо. буду тут думать как лучше разрулить
22 ноя 21, 13:07    [22399041]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

makhaon
2. пробегаемся в цикле Next, обрабатываем нужные записи до Eof
3. выходим из цикла, снаружи цикла обрабатываем последнюю запись дополнительно

То есть последнюю запись ты обрабатываешь два раза. Ню-ню...

Posted via ActualForum NNTP Server 1.5

22 ноя 21, 13:17    [22399050]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC, Unidirectional, оставить последнюю запись активной в наборе  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
Можно сохранять как массив вариантов, тогда код будет общим для любых полей (разве что кроме блобов). Либо поискать какой-нибудь DataSet.CloneCurrentRecord(DestDataSet) в потрохах ОгнеУтки.
22 ноя 21, 13:37    [22399073]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить