Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

QuantumGrid, MySQL - как заставить Cells сохранять данные сразу?   Найти похожие ветки 

 
BigError   (2003-08-18 15:34) [0]

QuantumGrid через ZeosLib взаимодействует с MySQL.
Если меняешь в ячейке грида значение, то оно записывается в базу, только если перейти на другую ячейку.
Если же после изменения нажать энтер, а потом просто закрыть приложение, то значение в базе остается старым.

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

Пробовал EhLib - та же проблема, то есть дело не в гриде.
И, так как данные все-таки записываются после перехода в другую ячейку, значит UpdateSQL настроен правильно.


 
Silla   (2003-08-18 15:41) [1]

При закрытии формы необходимо отслеживать
состояние таблицы, например:
if Tbl1.State in [dsEdit, dsInsert] then
Tbl1.Post;

Можно массу вариантов придумать


 
BigError   (2003-08-18 15:49) [2]

Это-то да, но ведь значительно удобнее и безопаснее, чтобы все равно вносилось сразу. А то наредактируешь ячеек, а питание компа брык и мигнуло. И потерялись все данные.

Пробовал по событию смены данных в ячейке делать Post - выскакивает ошибка обращения к памяти и приложение падает. Данные же теряются. :(


 
roottim   (2003-08-18 16:04) [3]

2BigError ты делаешь большую ошибку.. тебе-же сказали как и что.. и всеравно, неподдаются ведь!


 
vuk   (2003-08-18 16:21) [4]

Не работал ни с ZEOS ни с MySQL, но можно предложить следующее. У поля в наборе данных на событие OnChange пишется обновление данных в базе, переоткрывается набор данных (или, если используемая библиотека для доступа к БД позволяет, обновляется только конкретная строка), а затем - Abort.


 
Silla   (2003-08-18 16:25) [5]

Что такое смена данных?
Если я правильно понял, то смена данных это навигация по гриду
так вот, после смены строки пост происходит автоматически
и второй пост не нужно делать (наверное такая ошибка)

если хочешь постоянно сохранять малейшее изменение, то смотри событие OnKeyDown
if Key = VK_RETURN then
if Tbl1.State in [dsEdit, dsInsert] then
Tbl1.Post;


 
koks   (2003-08-18 16:50) [6]

Для начала - какой у тебя QG. Если 4.XX, то там есть свойство ImmidiatePost....

В любом случае удостоверься также что у тебя стоит
SynchMode.

Ну а в компанентах попроще твоя задача решается ручками...


 
BigError   (2003-08-18 19:48) [7]

roottim
Не понял, можешь пояснить?

koks
QG у меня 4.
ImmidiatePost cтоит в True - не помогает.
SyncMode стоит в True - не помогает.

Поставил конструкцию вида
if Tbl1.State in [dsEdit, dsInsert] then
Tbl1.Post;

в обработчик события OnEditValueChanged - не помогает. Не сохраняются данные ячейки в базе!
Может, кроме этой конструкции, еще что-нибудь нужно вписать в обработчик этого события? В хелпе на GD4 в принципе не нашел описания или примера работы с этим событием.

Пока вышел из положения совершенно тупым вариантом.
Завел глобальную переменную boolean. Повесил таймер со срабатыванием каждую секунду.
В обработчике события OnEditValueChanged ставлю эту переменную в True. А в обработчике таймера проверяю ее и, если истина, делаю Post.

Через ж..., ЗАТО РАБОТАЕТ. :((

Если мне кто-то объяснит, почему не работает Post при OnEditValueChanged - море респектов! :(

OnEditValueChanged


 
Vuk   (2003-08-18 20:01) [8]

to BigError:
Все-таки попробуйте то, что я Вам советовал. Обратите внимание, что обработчик ставится именно на OnChange у поля в DataSet.


 
BigError   (2003-08-18 21:23) [9]

to Vuk:
гы, так данные сохраняются, спасибо большое.

Но возникла другая проблема - сам грид теперь остается в режиме редактирования и из него не выходит. :)


 
vuk   (2003-08-18 21:30) [10]

А Abort не забыли?


 
BigError   (2003-08-18 21:33) [11]

2 vuk:
Я просто не понял, что это значит.
Такого метода нет у моего ДатаСета.
Можно подробнее, что это за Аборт?


 
vuk   (2003-08-18 21:43) [12]

Это не у DataSet-а. Это вызов исключения Abort. :o)
То есть примерно обработчик выглядит так (используем хранимые процедуры):

try
spUpdateData.ParamByName("param1").As... := "";
...
spUpdateData.ParamByName("paramn").As... := "";
spUpdateData.ExecProc;
except
DataSet.Cancel; //чтобы в случае ошибки не оставаться
//в dsEdit
raise;
end;
//следующие 2 строки, в зависимости от библиотеки доступа
//могут быть заменены на что-то типа spGetData.RefreshRecord
spGetData.Close;
spGetData.Open;

Abort;

Смысл всего этого - в некотором "обмане" библиотеки для работы с данными.


 
vuk   (2003-08-18 21:47) [13]

Да, еще. Если библиотека на поддерживает перезапрос одной единственной строки, то таким приемом на больших объемах данных пользоваться не советую, т.к. переоткрытие набора данных после каждого изменения поля может создавать лишнюю нагрузку на сервер.


 
vuk   (2003-08-18 21:50) [14]

Извиняюсь, вместо
>DataSet.Cancel;
должно быть
Sender.DataSet.Cancel;


 
BigError   (2003-08-18 22:46) [15]

to Vuk:
Нет, что-то не помогает ничего.
Данные записываются, но грид остается в режиме редактирования.
Это видно по тому, что указатель строки стоит в режиме "курсора", а не "стрелки вправо". И перемещаться можно только в пределах одной записи, перейти на другую запись нельзя.

Что-то никак не могу найти свойства(а) или метов для перевода грида в режим "просмотра".


 
vuk   (2003-08-18 22:51) [16]

Я у себя проверял - не остается. Правда здесь, наверное, все зависит от того, как это в библиотеке доступа к данным реализовано. По идее после вызова Abort должен происходить выход из режима редактирования. С BDE это работало, со SDAC тоже работает...


 
BigError   (2003-08-19 09:38) [17]

to Vuk
Гы, все заработало в EhLib, то есть в другом гриде.
Все ж таки, проблема была в Quantum, он при всей своей крутости оказался туп и, кроме того, недокументирован в этой своей части. :((
Все ж таки покопаюсь в исходниках Квантума, может пойму, как он это событие обрабатывает.


 
koks   (2003-08-20 10:39) [18]

Он не туп, просто дастаточно запутан даже по сравнению с QG 3.22
Надо помнить, что при GridMode = false; (LoadAllRecords = false в QG 3.22) QG создает в памяти КОПИЮ набора данных по типу TdxMemData и работает с ней. ну а копия в бэкграунде синхронизируется с реальным датасетом (скрытым образом !). в QG 4.XX там с этими многочисленными вьювами и контроллерами большая путаница. EhLib никаких копий не создает. поэтому у него при изменении данных сразу вызываются методы dataset - a.
Короче смотри - если хочешь использлвать QG придется действительно в ней покапаться...


 
Silla   (2003-08-20 13:10) [19]

Посмотри OptionsBehavior
у Grid"а параметр EnterShowEditor или EnterThrough
может поможет



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
8-33693
vital
2003-05-14 13:42
2003.09.11
Продолжительность клипа


1-33660
Некто
2003-08-30 05:42
2003.09.11
Удаление файлов


3-33430
Andrushk
2003-08-14 10:52
2003.09.11
Права в Oracle


3-33525
ЕвгенийЕ
2003-08-19 13:53
2003.09.11
Связанное поле, но не LookupDataSet через индексы?


1-33649
_MAD_
2003-08-30 16:59
2003.09.11
TCheckBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский