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

Вниз

А как отличить Append от Insert?   Найти похожие ветки 

 
REA   (2002-09-09 12:53) [0]

В связи с предыдущим моим вопросом: при добавлении записи надо взять последнюю и прибавить 1 к ее номеру, а при вставке - текущую и ничего не прибавлять. Как отличить в обработчике события добавляется запись или вставляется в середину?


 
REA   (2002-09-09 12:59) [1]

Впрочем я сделал так, если интересно:
Procedure TLocalBases.ToolsBeforeInsert(DataSet: TDataSet);
Begin
Try
PrevItemID := ToolsItemNo.Value; // Бывает что тут 0
If DataSet.Eof Then Inc(PrevItemID); // Если Append
If PrevItemID<1 Then PrevItemID := 1; // Нам нужно с 1
Except
PrevItemID := 1; // Ну так на всякий случай
End;
End;
Вроде работает.


 
MsGuns   (2002-09-09 13:26) [2]

В событии BeforeInsert присваивать глоб. переменной InsMode значение согласно логике:
If ds.EOF then
insMode := true
else
insMode := false;


 
Mike Kouzmine   (2002-09-09 13:31) [3]

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


 
REA   (2002-09-09 14:37) [4]

Это оно само отслеживает и вроде корректно обрабатывает ситуации с одной записью и последней.


 
Mike Kouzmine   (2002-09-09 15:21) [5]

А append и insert ты сам делаешь или пользователь?


 
roottim   (2002-09-09 15:30) [6]

еже ли ты не применяеш к датасету никаких индексов и не используешь сортировку, то чем тебе мешает просто методы Insert(для вставки в "середину"), и Append (для добавления).
а PK формируй какой угодно


 
REA   (2002-09-09 15:39) [7]

Append и Insert вызывается в DBGrid по кнопке вниз и CtrlIns соответственно. Как показала практика - EOF знать недостаточно.
Есть там индексы и фильтры и master-detail и попытка расчитать суммы по полям и т.п., но это к делу отношения не имеет.


 
Delirium   (2002-09-09 15:42) [8]

На уровне SQL Append и Insert - одно и тоже.


 
Mike Kouzmine   (2002-09-09 15:43) [9]

Запоминай нажатые клавиши и на AfterInsert делай выводы.


 
REA   (2002-09-09 16:00) [10]

Как бы криво запоминать в форме то, что является принадлежностью Dataset. В коде я особых различий в Append и Insert не нашел - это точно. Но различие все же необходимо, когда нужно сгенерировать порядковый номер элемента, не имеющего лругого ключа (чтобы вставить до или после нужного элемента).


 
Val   (2002-09-09 17:04) [11]

>REA (09.09.02 16:00)
Но различие все же необходимо...
можно пример?


 
MsGuns   (2002-09-09 17:26) [12]

Эту проблему (нажатия Down на последней записи ds и автовозникновения перехода в Append) решает перехват ароукеев и добавление ТОЛЬКО по спец.кнопке (ст.навигатор не катит, придется попотеть, но юзеру будет значительно проще, а прога в целом наджнее и мобильнее) Кстати, выход из Insert/Append тоже ТОЛЬКО по спец.кнопке ! На первый взгляд тупо, но проверено жизнью.


 
REA   (2002-09-11 17:00) [13]

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


 
MsGuns   (2002-09-11 18:24) [14]

>REA
Вообще-то перехватывать именно нажатие клавиш не необходимо.
Попробуй делать так (схема):
- Кидаешь на тулбар 4 кнопки (Up,Down,Home,End) и еще 2 (Insert,Delete)
- В ActionList создаешь 6 экшинов (по кнопкам соотв-но)
- Пишешь обработчики для экшинов
(например, для Up - Prior, для Down - Next и т.д.)
- В TDataSource создаешь 2 обработчика
OnDataChange и OnStateChange
- Пишешь процедуру SetStatusTabButton, которая делает след-е:
в зависимости от состояния НД вкл/выкл экшины:
а) вырубаются все 6 экшинов (Enabled := false)
Если режим ds.State<>dsInsert then
б) если тек.запись не первая, врубаются Up и Home
в) если тек.запись не последняя, -*- Down и End
г) вкл. Del
Если режим ds.State=dsInsert - выход
д) вкл. Ins

В обоих обработчиках OnDataChange и OnStateChange просто вызываешь SetStatusTabButton.

Кстати, если несколько TDataSource, то все их обработчики адресуешь на эти 2. Правда для этого надо в SetStatusTabButton определять активный НД (Screen.ActiveControl) и приенять все методы к нему.

Довольно просто, не надо мурыжится с OnKeyDown и т.д. Работает с любым количеством НД и визуальных компонент (гридов).



-


 
REA   (2002-09-12 10:39) [15]

Ну да - и кнопку вниз запретить. А между тем добавить запись ей проще всего, если учеть что в таблице есть (и довольно много) повторяющиеся записи, содержимое которых автоматически копируется в следующую запись при добавлении. 100 одинаковых записей добавляются за 2 секунды, а потом редактируются уже только некоторые. Можно конечно компонент написать на базе имеющегося и еще hook на клавиатуру поставить, но перехватить в гриде кнопку вниз как-то быстрее получилось.



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

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

Наверх




Память: 0.48 MB
Время: 0.008 c
1-7946
Dmitry Toropov
2002-09-24 06:58
2002.10.03
расшифровать исключение EMCIDeviceError


14-8126
Anatoly Podgoretsky
2002-09-07 17:19
2002.10.03
День рождения у Андрея Юдина


6-8095
BaNNeR
2002-08-03 11:25
2002.10.03
DELPHI irc-сервер и irc-клиент


14-8167
Oleg_Gashev
2002-09-08 22:11
2002.10.03
Задача-2


1-7888
Ryser
2002-09-21 15:40
2002.10.03
Кто-нибудь сталкивался с написанием моделирования системы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский