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




Вниз

Сохранение изменений в бд. 


ph   (2002-04-03 12:01) [0]

Как сохранить изменения в бд сразу же после того как была изменено значение ячейки DBGrid (пока выделена эта ячейка)? Если вставлять Table1.Post в Table1field1Change, BGrid1Columns0UpdateData, то программа зацикливается и возникает ошибка Stack overflow.



Anatoly Podgoretsky   (2002-04-03 12:10) [1]

Делай в OnExit
Только у тебя пропадает возможность отменить редактирование, не любишь ты пользователя или ты применяешь еще и дополнительные методы для это цели?



Johnmen   (2002-04-03 12:11) [2]

OnSetText
А вообще, зачем это надобно-то ?



ph   (2002-04-03 12:15) [3]

отменять редактирование не нужно.
OnExit не подходит - надо чтобы изменения сохранялись по мере работы с бд
на OnSetText вообще не реагирует никак.



Johnmen   (2002-04-03 12:19) [4]

>...надо чтобы изменения сохранялись по мере работы с бд ...

А зачем же сохраниять изменение значения каждого поля ???!!!



Anatoly Podgoretsky   (2002-04-03 12:22) [5]

Странное желание сохранять частично законченное редактирование, хуже глюка не увидеть. Так ты и сохраняй в On ColExit, а не всего Grid



ph   (2002-04-03 12:23) [6]

это нужно чтобы сразу расчитывался Footer, а не после перехода на другую строку



ph   (2002-04-03 12:27) [7]

OnColExit тоже не работает



Aleksandr   (2002-04-03 12:35) [8]

Ну-ну... А по какому признаку у тебя считается, что редактирование закончилось?



ph   (2002-04-03 12:41) [9]

признак: редактирование закончилось - хорошо бы если б было Table1field1Change, BGrid1Columns0UpdateData, но программа зацикливается.



Aleksandr   (2002-04-03 13:03) [10]

Млин, я не про это... Вот пишет у тебя кто-то в ячейке, пишет, пишет... И когда считать, что он писать закончил и надо сохранять? После каждого введенного символа, что ли?



ph   (2002-04-03 13:08) [11]

После нажатия Enter



Aleksandr   (2002-04-03 13:19) [12]

Ну тогда можешь делать так:
добавляешь метод на нажатие клавиши у гриды:
DBGrid.OnKeyDown:

if (Key=VK_Return) and (Table.State IN [dsInsert,dsEdit]) then begin
Table.Post;
// и поищи в хелпе, чего там надо отправить гриде, чтобы она из состояния Editing вышла, если сама не выйдет
Key:=0
end;

Вариант 2 : создать Action с тем же кодом:

if Table.State in [dsInsert,dsEdit] then
Table.Post;


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



Aleksandr   (2002-04-03 13:20) [13]

ЗЫ
В смысле, Экшн создать с этим кодом и шорткутом Enter...



Johnmen   (2002-04-03 13:35) [14]

>Aleksandr ©
>...моветон - разрешать редактировать прямо в гриде...

Позволю себе не согласиться !
Могу привести кучу примеров, когда редактирование с помощью грида и только его решает задачу !



Aleksandr   (2002-04-03 13:41) [15]

Johnmen ©
Позволю себе с Вами согласиться, что простенькие задачки можно решать и одной гридой... Но приведите пример, когда без гриды задача не решается? Я таких не встречал :)



Johnmen   (2002-04-03 13:56) [16]

>Aleksandr © Special for your !

Вводим содержание некоего документа, типа расходная накладная.
Ввели шапку и начинаем вводить содержимое.
Для каждой записи указываем наименование, количество, цену.
И вот вопрос на засыпку : сколько тебе понадобится времени,
набивая каждую запись из модальной формы, если наименований - 100 шт. , накладных - 50 шт., а выделено тебе на это - максимум 30 мин. ?



Aleksandr   (2002-04-03 14:05) [17]

Johnmen ©
Совершенно немного... В процесс добавляется два нажатия клавиш: Insert - для вызова окна добавления и Enter - для сохранения... Переход по полям - те же табуляторы; удобства в том, что выпадающие списки можно без перехода на мышь выбирать...



deleon   (2002-04-03 14:07) [18]

Сделать свой грид на основе TDbGrid и добавить ему событие OnCellExit :-)))



Erlend   (2002-04-03 14:13) [19]

Просто при выходе из модальной формы пишешь:
if ((Table1.State in [tsEdit]) or Table1.Modified then Table1.Post;



Johnmen   (2002-04-03 14:19) [20]

>Aleksandr © :
1. А выпадающие списки и так без мыши - <Alt>+<стрелка вниз/вверх> ...

2. У тебя лишних как минимум 2 нажатия - Insert и Enter
а также лишняя форма...



Aleksandr   (2002-04-03 14:26) [21]

Johnmen © :

1. Да, но всегда ли такое сочетание удобно?
2. Ну, сударь, они в гриде заменены на нажатия стрелок... А лишняя форма погоды не сделает - если один раз forms был подключен, дальше много памяти не убудет...



Johnmen   (2002-04-03 15:03) [22]

>Aleksandr © : Я вот чего не могу понять - если задачу можно решить меньшими телодвижениями и меньшими ресурсами, то почему же так не делать ?



Aleksandr   (2002-04-03 15:21) [23]

Johnmen © :
1. Критерий надежности. Если пользователь, заполня только первую колонку, случайно нажмет стрелку вверх, и останутся истчо обязательные для заполнения колонки?
2. А как в гриде будут отображаться данные блобовых типов?



ph   (2002-04-03 15:31) [24]

Спасибо, Aleksandr
DBGrid.OnKeyDown:
if (Key=VK_Return) and (Table.State IN [dsInsert,dsEdit]) then begin
Table.Post;
Key:=0
end;
работает. А как сделать если есть колонка CheckBox-ов и надо обрабатывать клики мыши таким же образом?



ph   (2002-04-03 15:39) [25]

уже разобрался. Всем спасибо!




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




Наверх





Память: 0.75 MB
Время: 0.031 c
3-80738           Olex                  2002-04-05 21:36  2002.04.25  
Как убрать запрос логина и пароля при обращении к БД Аксес...


14-81085          VictorT               2002-03-13 14:36  2002.04.25  
Болванка с картинкой


3-80799           Марина                2002-04-05 09:11  2002.04.25  
Table is busy.User:???


1-80993           Vova33                2002-04-12 16:53  2002.04.25  
Пакеты


6-81013           Созонов Евгений       2002-02-14 10:17  2002.04.25  
Получение информации (кто ? че делал ? время доступа ?) о доступе на свой комп.