Страница 1 из 1

Вопрос про обновление данных в гриде

Добавлено: 15 окт 2007, 01:43
fmcoder
Наверное это очень просто делается, но у меня что-то не получилось...

Есть контрол, не DB-aware, например, обычный Edit. При редактировании данных в нем вызывается такая функция:

Код: Выделить всё

  DataSet.Edit;
  DataSet.FieldValues[fieldName] := Edit.Text;
Т.е. обновляется соответствующее едиту поле.

Рядом лежит DBGrid, но никак не удается обновить его так, чтобы увидеть измененное значение.
Точнее, можно сделать Close/Open у датасета, но это слишком долго и мигает (данных много, и еще делается FetchAll).

DBLookupComboBox как-то обновляет одну ячейку грида сразу после изменения его значения - что он вызывает? Я пытался найти с помощью отладчика, но безуспешно, там все сильно закручено.

Пробовал вызывать DataSet.UpdateRecord, .Post, .Refresh все без толку. Хотя UpdateRecord по описанию вроде что надо (Ensures that data-aware controls and detail datasets reflect record updates.) но что-то он не работает.

Буду очень признателен если кто-нибудь поможет с этим.

Добавлено: 15 окт 2007, 08:22
Dimitry Sibiryakov
А грид привязан именно к этому датасету?

Добавлено: 15 окт 2007, 09:48
kdv
1. что за DataSet?
2. если это ibx, см. www.ibase.ru/devinfo/ibx.htm , на тему RefreshSQL

Добавлено: 15 окт 2007, 12:30
fmcoder
Dimitry Sibiryakov писал(а):А грид привязан именно к этому датасету?
Да, конечно.
kdv писал(а):1. что за DataSet?
2. если это ibx, см. www.ibase.ru/devinfo/ibx.htm , на тему RefreshSQL
1. Обычный DataSet... TpFIBDataSet, AutoCommit=True, остальное в общем по умолчанию.

2. Использую FibPlus. Refresh как я уже писал не работает.

Добавлено: 15 окт 2007, 13:31
Attid
fmcoder писал(а):
1. Обычный DataSet... TpFIBDataSet, AutoCommit=True, остальное в общем по умолчанию.

2. Использую FibPlus. Refresh как я уже писал не работает.
должен рефрешить, иди на сайт FibPlus у них там поддержка есть.

Добавлено: 15 окт 2007, 14:07
fmcoder
Рефрешит только текущую запись, хотя в RefreshSQL указано "where (id=x) or (id=y) or ... ".

UPD нет, все таки не рефрешит... Удивительно.

Добавлено: 15 окт 2007, 14:37
kdv
Рефрешит только текущую запись
он и должен рефрешить только ОДНУ запись. то что ты в него суешь, не соответствует тому, для чего он предназначен.

Добавлено: 15 окт 2007, 16:18
fmcoder
А как тогда обновить несколько записей разом?

Добавлено: 15 окт 2007, 17:35
kdv
А как тогда обновить несколько записей разом?
честное слово, чем дальше, тем вопросы более дурацкие, не могу другого определения найти.
select возвращает множество записей. множество может быть пустым, содержать одну запись, содержать n записей.

Если из множества n надо обновить подмножество в m записей, то
1. надо или m раз выполнить соответствующий оператор update, или написать один оператор update, который обновит m требуемых записей
2. перечитать - аналогично. Датасет считывает в буфер n записей. Если нужно обновить подмножество в m записей, то варианты
а) забить на m, переоткрыть запрос и прочитать все n
б) проехаться по каждой записи в кэше датасета, и для выбранных в множестве m поштучно выполнить refreshsql.

Вопрос в пространство - почему это все так геморройно? Потому что обычно НЕСКОЛЬКО записей ОДНОВРЕМЕННО в гриде никто не редактирует. Не сложилось так.

И если ты решил этим заняться - ну так изучи элементарные вещи - select и DataSet. Больше ничего и знать-то не надо.

Добавлено: 15 окт 2007, 20:59
fmcoder
Спасибо за помощь.
Только начал с этим всем работать, поэтому пока немного не в теме.

Те несколько записей редактируются не в гриде - они только выделяются в гриде (этим самым пользователь изъявляет желание редактировать именно эти записи). Редактируются же записи в отдельном окне, а изменения прописываются обратно в базу, и отображаются в гриде... Как-то так.

В общем, сделал вариант 2 а) как наиболее простой в реализации.