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

Вот, увы, нет. И это крайне неудобно. База, к слову, FireBird 2.5. Может у кого будут идеи что можно покрутить.
...
Рейтинг: 0 / 0
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113449
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логику приложения. После завершения нормального цикла
Код: 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
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113457
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
...
Рейтинг: 0 / 0
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113465
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof
Да может быть, конечно. Но я привык
...
Рейтинг: 0 / 0
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113493
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AutoClose = False не поможет?
...
Рейтинг: 0 / 0
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113534
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck,

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

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

Код: 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
FireDAC, Unidirectional, оставить последнюю запись активной в наборе
    #40113583
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Ну последняя отфетченная запись тем не менее должна оставаться доступной
Не факт. Логика фетча может быть такая
1. Очистить текущий буфер
2. Отфетчить новую запись / получить указатель на новую запись
3. Если записей больше нет, то установить Eof


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

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


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


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

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

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

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

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

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

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

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

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

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


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