Delphi refreshrecord не работает

Delphi refreshrecord не работает

Здравсвтвуйте. При попытке обновить текущую запись в TClientDataSet через RefreshRecord на клиента прокачиваются все данные выборки. Вопрос: Как сдалать так, чтобы при вызове ClientDataSet.RefreshRecord с сервера считывалась именно та запись, которую мне нужно обновить на клиенте.

← →
Erik ( 2002-10-21 16:48 ) [1]

А что при Refresh происходит?

← →
Polevi ( 2002-10-21 17:44 ) [2]

в НД должно быть поле с флагом Key в ProviderFlags

← →
Alexxx9801 ( 2002-10-21 18:03 ) [3]

2 Erik:
При Refresh происходит следующее: из базы закачивается весь набор данных (100 — 500 — 20000 записей), в нем находится запись, соответствуя текущей в ClientDataSet и обновляются значения полей. А мне не нужно считывать заново все записи. Достаточно только одну, соответствующую текущей. Я даже готов отдельный запрос написать, который выдает ту единственную нужную мне запись. Вот только куда его вставить?
2 Polevi:
Есть такое поле. Оно же первичный ключ в таблице.

← →
Alexxx9801 ( 2002-10-22 15:20 ) [4]

Ну что, так никто и не знает?

Короче, если ты готов ради этой «мути» использовать целый запрос, то:

1) Создай 2-ой объект TClientDataSet на форме пользователя.
2) Настрой его на тот же провайдер и все такое, как у первого экземпляра класса TClientDataSet.
3) В свойство TClientDataSet. CommandText второго экземляра, пиши запрос:
Select * From Where
= ;
Затем вызывай метод TClientDataSet. Execute
4) Получаешь свою обновленную запись во втором экземпляре объекта TClientDataSet. И далее решаешь, ЧТО ДЕЛАТЬ , но это делать нужно уже ручками. Обновляешь запись в первом экземпляле на ту, которая во втором экземпляре класса TClientDataSet.

Вообще, свойство( CommandText ) отвечает за содержание запроса, который будет выполнен на сервере и результат которого будет помещен в соответствующий экземпляр класса TClientDataSet.
А метод TClientDataSet. Execute непосредственно передают содержание SQL — запроса для выполнения, через провайдер на сервер приложений.

— тебе оно известно, т.к. запись редактируется, и значит она была добавлена уже ранее.

← →
Polevi ( 2002-10-22 17:31 ) [6]

создай наследника TDatasetProvider
перегрузи в нем
function InternalRowRequest(const Row: OleVariant; RequestType: TFetchOptions): OleVariant; override;

именно эта ф-ия вызывается при RefreshRecord на клиенте

Источник

Devart Forum

Discussion forums for open issues and questions concerning database tools, data access components and developer tools from Devart

Читайте также:  Как настроить автоматику для ворот nice

Принудительное обновление записи

Принудительное обновление записи

Сообщение Rajoe » Сб 20 окт 2012 13:05

Re: Принудительное обновление записи

Сообщение AndreyZ » Пн 22 окт 2012 07:36

dbMonitor отображает запросы если включены опции TMSSQLMonitor.Active и TMSSQLMonitor.Options.moDBMonitor . Убедитесь что они включены. Я выполнил следующий код:

Re: Принудительное обновление записи

Сообщение Rajoe » Вт 23 окт 2012 10:33

Re: Принудительное обновление записи

Сообщение AndreyZ » Вт 23 окт 2012 11:07

Re: Принудительное обновление записи

Сообщение Rajoe » Вт 23 окт 2012 17:17

Re: Принудительное обновление записи

Сообщение AndreyZ » Ср 24 окт 2012 09:02

Re: Принудительное обновление записи

Сообщение Rajoe » Ср 24 окт 2012 14:17

Re: Принудительное обновление записи

Сообщение AndreyZ » Ср 24 окт 2012 14:23

Re: Принудительное обновление записи

Сообщение Rajoe » Чт 25 окт 2012 09:35

Re: Принудительное обновление записи

Сообщение AndreyZ » Чт 25 окт 2012 12:58

Re: Принудительное обновление записи

Сообщение Rajoe » Чт 25 окт 2012 13:28

Re: Принудительное обновление записи

Сообщение AndreyZ » Пт 26 окт 2012 09:01

Re: Принудительное обновление записи

Сообщение Rajoe » Пн 29 окт 2012 15:33

Из него видно, что RefreshRecord всегда, при любых условиях вызывается строго после отправки запроса на вставку записи на сервер. То есть, к моменту выполнения RefreshRecord запись на сервере уже есть. Да и значения это не имеет, поскольку RefreshRecord не делает никаких прямых проверок наличия записи на сервере, во всяком случае, в Wireshark я ничего такого не увидел. Или не разглядел?

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

Re: Принудительное обновление записи

Сообщение AndreyZ » Вт 30 окт 2012 10:21

Re: Принудительное обновление записи

Сообщение Rajoe » Вт 30 окт 2012 16:08

Источник

Народ как правильно сделать обновление «1-ой текущей возвращенной записи»

Доброе утро всем

Если кто с FireDAC работал — опишите минимально необходимые шаги — чтобы обновить в датасет только одну
строку после вставки — второй день бьюсь просто WorkerQ.Refresh; работает а WorkerQ.RefreshRecord; нет

я его и с параметром false и без параметра передавал — все без толку

я использую FDQuery и подключенный к нему FDUpdaterSQL
в свойстве FDUpdateWorker.FetchRowSQL в дизайнере такой запрос зашивал

так же пробовал вместо w.id_worker=:old_id_worker передать id новой вставляемой записи из переменной вручную

Основная проблема в том что данные после RefreshRecord новые не появляются вообще
Свойство WorkerQ.updateoption.refreshmode стоит в rmOnDemand

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как сделать чтобы при перемещении по форме на любой вкладке в поле отображалось «ИД» текущей записи?
Как сделать чтобы при перемещении по форме «Задачи» на любой вкладке в поле «ИДЗадачи_Фрм».

Как сделать чтобы при добавлении новой записи в табилцу заносилось «текущая ДатаВремя» правильно?
Настройки таблицы, исходное состояние таблицы — см. скрин. 1. ДатаВремя для новой записи.

Читайте также:  Как настроить часы фотон смешарики

Как сделать чтобы при присвоении флагу выбранной записи «Истина», остальные флаги автоматически становились «Ложь»?
Сценарий: 1. Ставлю галку в «запись2» «флаг1» — все флаги таблицы становятся = «Ложь» .

Вопрос еще -актуален, скинте фрагмент кода у кого есть где происходит refresh только одной записи которая только что была вставлена в таблицу (и чтоб информация в гриде изменилась без переоткрытия датасета или рефреша на весь датасет)

просто в документации написано, что есть данный механизм и он должен работать — но у меня не срабатывает
срабатывает только просто refresh на всю выборку

База MySQL 5.5
Сначала
1 Перевожу датасет в режим буферизации (CasheUpdate:=true)
2 Перевожу датасет в режим редактирования Edit

Когда пользователь применяет изменнения
3 Стартую пишущую транзакцию (пишущая своя на каждый модуль настроена на датасеты, читающая общая и лежит в дата модуле и настроена на подключение)
4 если в наборе данных есть изменения ApplyUpdates = 0 then CommitUpdates и trWrite.Commit; — коммит транзакции

5 если не было исключений то CasheUpdate:= false и надо грид обновить
и если вызвать Refresh у датасета — он действительно обновляется но по идее как я понял

мне вообще ничего вызывать не нужно поскольку есть связь между компонентами FDQuery и FDUpdaterSQL
и за обновление должен отвечать последний и делать это в автоматическом режиме для
этого в нем прописаны запросы на вставку, модификацию,удаление и возврат одной обновленной записи — но этого
не происходит. А когда делаю рефреш вручную то видно, что происходит обновление всей выборки -курсор прыгает на
другую запись

Источник

Delphi refreshrecord не работает

Использую DOA
Мне надо обновить одно значение.
//qItems.FieldByName(«normal_qty»).AsInteger = 153
В TOracleDataSet на OnApplyRecord делаю:
if Action=»R» then
begin
qItemsRefresh.SetVariable(«unit_id»,qItems.GetVariable(«session_id»));//unit_id поля нет в qItems
qItems.DeclareQueryVariables(qItemsRefresh);
qItems.SetQueryVariables(qItemsRefresh);
qItemsRefresh.Execute;
//qItems.FieldByName(«normal_qty»).AsInteger = 153
//qItemsRefresh.FieldAsItneger(«normal_qty») = 152
qItems.GetQueryVariables(qItemsRefresh);
//qItems.FieldByName(«normal_qty»).AsInteger = 153
Applied:=True;
end;

В чем подстава? Почему не обновляется?

← →
ANB © ( 2007-05-31 13:51 ) [1]


> В чем подстава? Почему не обновляется?

Не вижу рефрешрекорда. Насколько я помню, чтобы в DOA работал рефрешрекорд нужно явно затянуть в запросе rowid. И тогда нужно просто вызвать метод.
К чему этот код — непонятно.

← →
Тфьу ( 2007-05-31 14:05 ) [2]

Если в запросе агрегирующие функции или union, то Refresh по rowid не работает (RTFM Allroundautomations) приходится самому писать RefreshSQL и вот этим синтаксисом он должен из RefreshSQL подтягивать данные. Но не подтягивает. 🙁

Если тебе интересен именно рефрешрекорд то он вызывается просто из кода на:
qItems.RefreshRecord

Я привел тут только эвент OnApplyRecord

← →
Sergey13 © ( 2007-05-31 14:09 ) [3]

> [2] Тфьу (31.05.07 14:05)
> Если в запросе агрегирующие функции или union

Тогда что ты там меняешь?

← →
Тфьу ( 2007-05-31 14:20 ) [4]

У меня есть запрос вида:

select item_id, item_name, normal_qty
from
(
select item_id, sum(normal_qty) normal_qty
from norm_values
where unit_id = :unit_id
) v, dict_norm d
where d.item_id = v.item_id

мне надо normal_qty обновить для определенного item_id

Читайте также:  Как отремонтировать цилиндр суппорта

Я пишу RefreshSQL:
select sum(normal_qty) normal_qty
from norm_values
where unit_id = :unit_id
and item_id = :item_id

> [4] Тфьу (31.05.07 14:20)
> У меня есть запрос вида:

И он работает? Сомнительно мне что-то.

← →
Тфьу ( 2007-05-31 14:51 ) [6]

select d.item_id, d.item_name, v.normal_qty
from
(
select item_id, sum(normal_qty) normal_qty
from norm_values
where unit_id = :unit_id
) v, dict_norm d
where d.item_id = v.item_id

Вот так работает. Я просто не хочу тут приводить полный запрос на полторы страницы.

Народ, если вы не знаете, как делается RefreshRecord в DOA, а тем более сделанный через DeptAPI — не флудите тут.

← →
Тфьу ( 2007-05-31 15:05 ) [7]

Сам нашел в чем дело.
GetQueryVariables ,берет значения только из параметров. Поэтому пришлось делать практологически:

select sum(normal_qty) normal_qty
from norm_values
where unit_id = :unit_id
and item_id = :item_id
and (1=1 or :normal_qty = :normal_qty)

Источник

Components for Delphi and C++ Builder.

Текущее время: 19 окт 2021, 15:05

Часовой пояс: UTC

Вывод обновленной строки в DbGridEh

Страница 1 из 1 [ Сообщений: 8 ]
Для печати Предыдущая тема | Следующая тема
Автор Сообщение
nimed74

Зарегистрирован: 19 мар 2014, 18:47
Сообщений: 4

EhLibSupport

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1298

MemTableEh.refreshrecord вызывает DataDriver.GetrecCommand и из полученной записи обновляет значение текущей записи в MemTableEh.
У вас в DataDriver.GetrecCommand что нибудь прописано?

nimed74

Зарегистрирован: 19 мар 2014, 18:47
Сообщений: 4

EhLibSupport

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1298

Проверьте, что по RefreshRecord выполняется вызов хранимой процедуры.
Вы можете это сделать по аналогии с Демо проектом DataDriver.ADO.SimpleDemo из библиотеки, с помощью события TADOConnectionProviderEh.OnExecuteCommand.

Если вызов происходит, то проверьте, выполняется ли присваивание полученных значений в процедуре

procedure TCustomSQLDataDriverEh.DefaultRefreshRecord(MemRecord: TMemoryRecordEh);

Присваивание должно происходит в строке
AssignFieldValue(MemRecord.DataStruct.MemTableData, MemRecord, i,
dvvOldestValue, RecDataSet);

nimed74

Зарегистрирован: 19 мар 2014, 18:47
Сообщений: 4

EhLibSupport

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1298

Напишите пустое событие ADOConnection.OnExecuteComplete

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
//
end;

Проверьте что при вызове RefreshRecord программа попадает в это событие, т.е. посылается запрос на сервер.

nimed74

Зарегистрирован: 19 мар 2014, 18:47
Сообщений: 4

При исполнении кода в ADOConnection.OnExecuteComplete не попадает. Может я что-то не так делаю?

Dm_Ufa

Зарегистрирован: 19 мар 2013, 04:23
Сообщений: 12

У меня похожая в чем то проблема:
использую связку MemTableEh(в режиме дерева) + ADODataDriverEh + ADOConnectionProviderEh(использую InlineConnection для доступа к MS SQL 2012)

при KeepConnection=True все работает нормально

ошибки происходят при KeepConnection=False

при использовании методе ADOProviderUpdateRecord при вставке строки происходит ошибка в модуле DataDriverEh (стр. 1949) «There are no fresh record on server»

если же не использовать метод ADOProviderUpdateRecord то происходит ошибка в модуле MemTableDataEh (стр. 4987) «Can not delete Record if it present in active list.»

Страница 1 из 1 [ Сообщений: 8 ]

Часовой пояс: UTC

Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 0

Источник

Оцените статью