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

Вопросы стыковки визуальных компонент (DataControls, EhGrid, VirtualTreeView, DevExpress и т.п.) с данными из БД.

Модераторы: kdv, CyberMax

Ответить
fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

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

Сообщение fmcoder » 15 окт 2007, 01:43

Наверное это очень просто делается, но у меня что-то не получилось...

Есть контрол, не 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.) но что-то он не работает.

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 окт 2007, 08:22

А грид привязан именно к этому датасету?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 09:48

1. что за DataSet?
2. если это ibx, см. www.ibase.ru/devinfo/ibx.htm , на тему RefreshSQL

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 15 окт 2007, 12:30

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

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

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 15 окт 2007, 13:31

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

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

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 15 окт 2007, 14:07

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 14:37

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

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 15 окт 2007, 16:18

А как тогда обновить несколько записей разом?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 17:35

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

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

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

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

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 15 окт 2007, 20:59

Спасибо за помощь.
Только начал с этим всем работать, поэтому пока немного не в теме.

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

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

Ответить