![]() |
|
|
![]()
|
|
| DDX |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 31.1.2005 Где: Москва Репутация: 5 Всего: 5 |
используется MS SQL Server, Delphi 7, ADO
все манипуляции с данными (insert, update,delete) происходят путем вызова хранимых процедур сервера. здесь и хочу спросить вашего совета: каким образом после обновления данных лучше обновлять даные в maste/detail гридах на форме? источником данных для master грида служит запроc (ADOQuery), для подчиненного - view-таблица с сервера (TADOTable) перевыполнение запроса происходит с некоторым лагом , да и указатель с выделенной записи после обновления перескакивает на первую строчку, что несколько неудобно --------------------
Учиться, учитьcя и ещё раз учиться |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
я делаю так
а что такое с лагом ? Это сообщение отредактировал(а) Bes - 29.7.2005, 09:59 |
|||
|
||||
| DDX |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 31.1.2005 Где: Москва Репутация: 5 Всего: 5 |
спасибо за ответ!
с лагом = с небольшой задержкой, т.е. нажимаешь кнопочку "добавить" или изменить, и наблюдаешь изменения в гриде не сразу, а через 1-2 секунды. немного напрягает, тем более, что юзер обычно туп и ненаблюдение изменений мгновенно вводит его в ступор --------------------
Учиться, учитьcя и ещё раз учиться |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
сколько записей в таблице?
|
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Bes, твой код хорошь, но иногда может вызвать Exception!
Увы, сам на это наткнулся. Например, стоишь на последней записи, отдельным запросом удаляешь ее, и потом выполняешь твой код. Вынужден был городить огород с locate. Причем, даже DBGridEh в EhLib'е для этого доработал. (см. здесь) Но, и там тоже есть пробдлемы - Ошибка TADODataSet.Locate!, проверено в Delphi 6,7,9. Так что, на сегодня, универсального решения нет. Лично у меня, все таблицы имеют ключевое поле, причем, всегда первое. Этому полу назначено Visible=False, поэтому его не видно. Перед закрытием датасета я сохраняю его значение, и после открытия делаю locate на него. Если интересует, могу выложить новую доработку DBGridEh в EhLib'е, которая позволяет указывать как искать текущую запись: добавлено:
Это сообщение отредактировал(а) Петрович - 29.7.2005, 17:55 -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Bes |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
2Петрович:
да-да забыл про это - я решил проблему так вместо
надо писать
и все P.S. глянул приведенный код из ЭхЛиб и вспомнил что поначалу я тоже проверял где стоит указатель и если на первой или последней записи то при удалении их туда и ставил без букмарка. Это сообщение отредактировал(а) Bes - 1.8.2005, 06:42 |
||||
|
|||||
| DDX |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 31.1.2005 Где: Москва Репутация: 5 Всего: 5 |
спасибо за советы, букмарки - хорошее решение
единственно, что интересно: если данные отсортированы по алфавиту и добавляется новая запись, то возможно ли установить выделение на неё Петрович, если можешь, выложи, или пришли на почту: ddx{песик}.mail.ru,спасибо. или, может, тоже самое можно скачать из указанной тобой темы? --------------------
Учиться, учитьcя и ещё раз учиться |
|||
|
||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Вот объект:
А вот как им пользоваться:
-------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
| DDX |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 31.1.2005 Где: Москва Репутация: 5 Всего: 5 |
Петрович
сенкс Это сообщение отредактировал(а) DDX - 2.8.2005, 17:12 --------------------
Учиться, учитьcя и ещё раз учиться |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
|
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
Ух ты! Спасибо. Век живи - век учись.
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Что-то опасно как-то сделано - с букмарками это плохое решение. Это же указатели. И гарантированно работать они не будут. Лучше тогда использовать поле ID какое-нибудь (ну чтобы в базе было) и уже по нему делать Locate.
А букмарки - это же указатели. Их к тому же освобождать надо. Не советую. |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
а нафига ж их придумали? Добавлено @ 14:33
что, освобождать не советуешь? Программеры там, у дяди Бормана, сидят и головы ломают, как сделать то или иное, а мы тут умничать начинаем Как в КВН было сказано про футбол: "Вся страна специалисты, одни мы, 11 человек играть не умеем". |
||||
|
|||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Их удобно использовать, если например надо пробежать по всему DataSet и сосчитать сумму. Или еще чего. Но на это время сам DataSet не закрывается. В этом случае букмарки - штука очень удобная и наверно самая быстрая. |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Программист сам в праве выбирать, что ему использовать: закладки или locate
Добавлено @ 14:37
я и с закрытием DataSet`a использую закладки, пока проблем небыло.
Это сообщение отредактировал(а) dsergey - 9.8.2005, 14:41 |
||||
|
|||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Не советую использовать в том виде, в котором предлагается. Букмарка - это по сути указатель на строку в DataSet. И если его закрыли, то гарантировать, что все вернется на свои круги - нельзя. В хелпе прямо сказано - "Allocates a bookmark for the active record in the dataset.". А когда ты закрываешь DataSet, то букмарка указывает непонятно куда. В простейшем случае открыл/закрыл это срабатывает. Но копинуть глубже и можно поиметь проблемы. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
а если в таблице нет ключевого поля?
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Это не очень хорошее проектирование таблиц. По теории надо, чтобы любая запись в таблице могла быть однозначно идентифицирована. Это может быть естесственный ключ - но часто это набор полей и он может быть не маленьким. Представь сколько может быть Сидоровых Николаев Алексеевичей ? Этих полей маловато. Значит придется вводить еще и адреса, телефон. Вообщем нелегкое дело. Поэтому часто вводят (я всегда так делаю) специальное поле ID (на тут как хочешь называй), которое часто делается автоинкрементным и оно для каждой записи уникально. И искать проще, и апдейтить и удалять. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
ADO+MSSQL. Хранимка мне возвращает Поля: Нименование, цена, кол-во, цвет.
После изменения кол-ва, нужно переоткрыть НД, не потеряв тек. запись. Как быть? Вот я и пользуюсь закладками. Хотя и Locate тоже пользуюсь. Я же говорю - это моё дело, чем и как пользоваться. пока не глючит, а Вот если начнёт... |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Дык я не настаиваю. Просто высказываю свое мнение. А из хранимки ID тоже никто не мешает возвращать Ладно, скоро уже офтоп начнется и придет страшный модератор нам грозить. ЛУчше не будем его будить. Тс-с-с-с-с |
|||
|
||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Я уже писал. Закладки использовать можно.
Спасибо что напомнил что есть метод BookMarkValid. Без него, я иногда получал Exception. С ним, надеюсь, Exception быть не должно. Однако. В свое время, я вынужден был посмотреть как устроены закладки. По крайней мере реализация заклодок в ADO-компонентах такова, что на самом деле, закладка там это номер записи в наборе данных. Поэтому, если например имеется набор из шести записей:
а текущая запись в нем Витя. Предположим теперь что внешним запросом была удалена запись Петя. Соответственно, после выполнения приведенного тобой кода набор данных станет:
Но, текущей записью станет запись Коля вместо ожидаемой Витя! Можешь проверить. Добавлено @ 22:15
Вот когда речь идет именно иб изменении какой-либо записи, без изменения их количества, тогда закладки вполне подходят. Правда, если ты уверен что другой пользователь в это время не выполнил INSERT/DELETE из этой таблицы. -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
абсолютно согласен, хотя сам проверю это и сообщу. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Проверил. Ошибок не выдает, но активная запись становиться, та которая стояла после удаляемой, т.е. Петрович прав.
Добавлено @ 10:11 А вот если удалять последнюю запись, то обязательно "вылетит птичка" Вывод, можно пользоваться не закладками, а DataSet.RecNo, а рекомендательно Locate. |
|||
|
||||
| Петрович |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Добавлено @ 11:31
А если сначала проверять BookMarkValid ? А то, самому лень тестить -------------------- Все знать невозможно, но хочется |
||||
|
|||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
нет, не описАлся. Я имел ввиду, что использование закладок и RecNo - одно и тоже Добавлено @ 14:14
а если сначала проверять, то всё будет в ажуре, иначе нафига ж нужна проверка Добавлено @ 14:15 вопрос лишь в том, что быстрее: закладки или RecNo??? |
||||
|
|||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Ну, нафига это вопрос риторический. На самом деле, нигде не сказано что присваивание закладки может вызвать исключение! Например про Locate вообще явным образом сказано что возвращает False если искомая запись не найдена. Но, как я уже писал в другом топике, это иногда вызывает исключение -------------------- Все знать невозможно, но хочется |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |