Форум: "Базы";
Текущий архив: 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