Проблема с "оживлением" запроса

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Проблема с "оживлением" запроса

Сообщение DDDDimon » 29 окт 2005, 23:00

Здравствуйте Всем!
Поможите пожалуйста, Сами мы не местныя.... :)

А ситуация следующая:
Необходимо набор данных, отображаемых в гриде, сделать "живым", чтоб пользователь мог, выбрав мышью какую-нибудь запись, либо удалить её, либо подредактировать, либо отправить данные из полей записи в другую таблицу и т.д. . Пробовал как IBDataSet, так и Query+UpdateSQL В результате действительно “живым” оказывается только функция Инсерт. Рефрэш, Апдейт и Делет вроде как оживают, но данные в базу не добавляются, т.е. после операции Close/Open IBDataSet изменения пропадают, всё остаётся как было (в отличии от Инсерт, новая запись остается ). В таблице с первичным ключом всё работает нормально, если первичного ключа нет, см. описанное выше. За сим..... ГраждАне! Подскажите, что может быть не правильно.

Всем спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 окт 2005, 11:47

дык. срочно читать про проектирование баз данных. без первичного ключа таблицы если и бывают, то они хранят только записи "логов" некоторых событий.
Обычно запись можно идентифицировать ТОЛЬКО по первичному ключу. Насчет "записи не добавляются" - ты глючишь.

Так что "неправильно" - отсутствие у таблицы первичного ключа.

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 30 окт 2005, 22:13

kdv писал(а):дык. срочно читать про проектирование баз данных. без первичного ключа таблицы если и бывают, то они хранят только записи "логов" некоторых событий.
Обычно запись можно идентифицировать ТОЛЬКО по первичному ключу. Насчет "записи не добавляются" - ты глючишь.

Так что "неправильно" - отсутствие у таблицы первичного ключа.
По поводу ключа - спасибо за подсказку, вроде раньше читал но похоже не обратил должного внимания. А записи реально не добавляются.

А вот ещё вопрос:
Можно ли без телодвижений с IBDataSet и IBUpdateSQL при помощи только IBQuery реализовать описанную выше задачу
"чтоб пользователь мог, выбрав мышью какую-нибудь запись, либо удалить её, либо подредактировать, либо отправить данные из полей записи в другую таблицу и т.д.", ну хотяб чтобы удалять можно было?

Всем спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 окт 2005, 10:43

ibquery не может "редактировать" записи сам. Тебе надо срочно читать
www.ibase.ru/devinfo/ibx.htm, а также понять, что "редактирование" осуществляется только командами sql - insert, update, delete, и их кто-то должен обязательно отправить на сервер. Или ты сам (в коде), или компонент (автоматически, например IBTable).

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 31 окт 2005, 15:26

А я, наборот, поставил все гриды в ридонли, на всякий случай. Много ошибок операторы делают при таком подходе, если редактируют непосредственно в гриде. Чище получается: грид, рядом кнопки "Добавить", "Удалить", "Изменить" по которым открывается дочернее окошко с дбэдитами, "ОК", "Отмена". Если пользователь поредактировал и нажал "ОК", то коммит и перезапрос данных для грида, с локейтом по ключу.

В принципе для этого еще есть компонент ДБнавигатор, пользуй его. Ну и разумеется грид, датасорс, ибквери+ибапдэйтскл (или соотв компоненты из фиб плюс).

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 31 окт 2005, 19:03

kdv писал(а):ibquery не может "редактировать" записи сам. Тебе надо срочно читать
www.ibase.ru/devinfo/ibx.htm, а также понять, что "редактирование" осуществляется только командами sql - insert, update, delete, и их кто-то должен обязательно отправить на сервер. Или ты сам (в коде), или компонент (автоматически, например IBTable).
Да это я понял,(по этому и удивлялся почему не работает!!! Всё по книжке делал, а не работало, вернее работало только в таблице спервичным ключом) но все равно спасибо(повторенье - мать её, ученье). Проблема была в том что не во всех таблицах (система из пяти таблиц, две из них связанные) у меня был первичный ключ, я почему-то наивно пологал что можно и без него обойтись. Как первичный ключ везде вставил так все прекрасно заработало. Все изменения сохраняются, всё чинно благородно.

Ivan_Pisarevsky писал(а): А я, наборот, поставил все гриды в ридонли, на всякий случай. Много ошибок операторы делают при таком подходе, если редактируют непосредственно в гриде. Чище получается: грид, рядом кнопки "Добавить", "Удалить", "Изменить" по которым открывается дочернее окошко с дбэдитами, "ОК", "Отмена". Если пользователь поредактировал и нажал "ОК", то коммит и перезапрос данных для грида, с локейтом по ключу.

В принципе для этого еще есть компонент ДБнавигатор, пользуй его. Ну и разумеется грид, датасорс, ибквери+ибапдэйтскл (или соотв компоненты из фиб плюс).
В принципе аналогично. Когда был вариант базы на парадоксе у меня ещё галочка была, вкл/выкл. редактирование в гриде. Авообще и с IBDataSet все работает по выделению записи в гриде. Мне интересно другое... Можно ли как нибудь заполучить порядковый номер записи в гриде, а потом с использованием етого номера с записью чёнить сделать, или фигня получится (так, просто интересно)?

Всем спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 окт 2005, 20:03

Можно ли как нибудь заполучить порядковый номер записи в гриде, а потом с использованием етого номера с записью чёнить сделать, или фигня получится (так, просто интересно)?
гм, ну какой, нафиг, "порядковый номер" записи ??? Даже в Парадоксе такого понятия нет. Первичный ключ - (вдумайся), это столбец, значение которого ИДЕНТИФИЦИРУЕТ ЗАПИСЬ. Берешь его и по ПК с этой записью делаешь что хочешь.
Читай умные книжки по проектированию баз данных. Тебе с азов начать бы надо.

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 31 окт 2005, 21:53

К сожалению в доступных мне умных книжках уж слишком все поверхностно. Либо я чето не совсем понял.
Ладненько, все равно спасибо за советы.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 01 ноя 2005, 09:20

У меня всегда есть поле с ключем, уникальность обеспечивается генератором. Новое значение берется через обертку для генератора в виде ХП, примерно такого вида:

Код: Выделить всё

CREATE PROCEDURE GET_N_USER 
RETURNS (
    NUMBER INTEGER)
AS
begin
  number=gen_id(gen_n_user,1);
  suspend;
end
или аналогичный результат попроще

Код: Выделить всё

 select gen_id(gen_n_user, 1) as number from rdb$database
Так что значение ключевого поля для выделеной записи всегда под рукой, даже если запись я только создаю.

Ну почитай хотя бы статьи, здесь, на сайте... а то я выше ртфм озвучиваю.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 ноя 2005, 10:18

Иван, ну какой генератор, какие процедуры? Он до понятия ПК не добрался еще...

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 01 ноя 2005, 10:33

Дык первичный ключ без генератора долго не протянет :lol: а то потом пойдут дурацкие вопросы,типа я тута нахожу max, прибавляю единичку а гадский ФБ шлет меня лесом, говорит про какую-то там неуникальность... :shock:

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 01 ноя 2005, 22:48

Ivan_Pisarevsky писал(а):У меня всегда есть поле с ключем, уникальность обеспечивается генератором. Новое значение берется через обертку для генератора в виде ХП, примерно такого вида:

Код: Выделить всё

CREATE PROCEDURE GET_N_USER 
RETURNS (
    NUMBER INTEGER)
AS
begin
  number=gen_id(gen_n_user,1);
  suspend;
end
или аналогичный результат попроще

Код: Выделить всё

 select gen_id(gen_n_user, 1) as number from rdb$database
Так что значение ключевого поля для выделеной записи всегда под рукой, даже если запись я только создаю.

Ну почитай хотя бы статьи, здесь, на сайте... а то я выше ртфм озвучиваю.
Ребята, ну я ещё не совсем идиот :?
И генератор есть, и процедура тоже есть (селектом как-то не очень нравится) и с уникальностью у поля первичного ключа всё нормально.

А вооще, извините что мОзги компостировал. Ответ на свой вопрос (который, признаться, не верно сформулировал)я кажется нашел в статье "Как работает БДЕ".
Так что общий привет и спасибо за подсказки.

ЗЫ
kdv писал(а): Цитата:
Можно ли как нибудь заполучить порядковый номер записи в гриде, а потом с использованием етого номера с записью чёнить сделать, или фигня получится (так, просто интересно)?

гм, ну какой, нафиг, "порядковый номер" записи ??? Даже в Парадоксе такого понятия нет. Первичный ключ - (вдумайся), это столбец, значение которого ИДЕНТИФИЦИРУЕТ ЗАПИСЬ. Берешь его и по ПК с этой записью делаешь что хочешь.
В общем-то я имел в виду следующее:
Если в таблице пользователь не установил поле с первичным ключом, как в этом случае курсор грида может запомнить на какой записи находился, и можно ли эту информацию извлечь и использовать.

Из статьи про БДЕ, я так понял, что с помощью TBookmark? Или я опять чего-то не то понял.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 02 ноя 2005, 09:44

Если в таблице пользователь не установил поле с первичным ключом, как в этом случае курсор грида может запомнить на какой записи находился, и можно ли эту информацию извлечь и использовать.
Класс! держите маня семеро... ПОЛЬЗОВАТЕЛЮ доверили выбирать первичный ключ... моя просто валяться... :roll:
Из статьи про БДЕ, я так понял, что с помощью TBookmark? Или я опять чего-то не то понял.
Я пользую закладки когда для грида включаю мультиселест, потом, когда пользователь навыбрал несколько строк, прохожусь по закладкам, собираю значения ключей и скармливаю на вход процедуре, которая потом по этим параметрам лепит отчет.

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 02 ноя 2005, 21:23

Ivan_Pisarevsky писал(а):
Если в таблице пользователь не установил поле с первичным ключом, как в этом случае курсор грида может запомнить на какой записи находился, и можно ли эту информацию извлечь и использовать.
Класс! держите маня семеро... ПОЛЬЗОВАТЕЛЮ доверили выбирать первичный ключ... моя просто валяться... :roll:

Ну вобщем-то я имел в виду разработчика приложения, т.е. что будет, если разработчик берет, да и не назначает поле первичного ключа (с пользователем - это я махнул, согласен).
Из статьи про БДЕ, я так понял, что с помощью TBookmark? Или я опять чего-то не то понял.
Я пользую закладки когда для грида включаю мультиселест, потом, когда пользователь навыбрал несколько строк, прохожусь по закладкам, собираю значения ключей и скармливаю на вход процедуре, которая потом по этим параметрам лепит отчет.
Неее... вот до таких штук я пока ещё пока не добрался... :(
А мона по подробнее про мультиселект (или где прочитать про ето можно), затем как чувствую что мне в моем приложении такой фокус ввести будет не лишним.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 03 ноя 2005, 08:11

А мона по подробнее про мультиселект (или где прочитать про ето можно),
Да собственно F1, мне вполне хватило, вся информация в справке есть, даже по-моему с примерами кода.

DDDDimon
Сообщения: 7
Зарегистрирован: 29 окт 2005, 22:43

Сообщение DDDDimon » 04 ноя 2005, 10:46

Ivan_Pisarevsky писал(а):
А мона по подробнее про мультиселект (или где прочитать про ето можно),
Да собственно F1, мне вполне хватило, вся информация в справке есть, даже по-моему с примерами кода.
пОнял, сенькс.

Ответить