Второй месяц пилю нубскую систему учета успеваемости и большую часть решаю проблему: при попытке изменить содержание одной из ячеек, либо при попытке удалить строку с использованием DBNavigator'а, либо при попытке обновить таблицу с помощью него же выскакивает ошибка "Недостаточно сведений ключевого поля для обновления". Ответ искал на форумах, но ничего не нашел, может быть плохо искал. Юзаю технологию ADO и, как и положено настоящему хелоуворлдщику, аксес. База для наглядности тут: //ifolder.ru/13903589
Более подробно, Вывожу запрос "Табель" с помощью ADOTable в дбгрид, пытаюсь изменить поля "Класс" либо "Предмет*", он выдает мне вышеуказанную ошибку. Через квери пробовал, ерунда та же. Помогите, кто хорошо знает С++ билдер.
ЗЫ Если уж не можете помочь с прогой, киньте ссылку на хорошую книжку по ADO.
9 сентября 2009 в 10:05
не вникаю в проблему поэтому могу ответить не на тот вопрос:
если ты делаешь запрос, в котором каждая строка из этого запроса не всегда отражает ТОЛЬКО ОДНУ строку из таблицы, то стандартные средства не смогут обновить/удалить/изменить строки этого запроса
пример1:
SELECT T1.F1, T2.F2 FROM T1, T2 WHERE T1.ID=T2.ID
в этом запросе каждая строка из запроса явно указывает на одну строку в T1 и T2
пример2:
SELECTT1.F1, MAX(T2.F2) FROM T1, T2 WHERE T1.ID=T2.ID [GROUP BY T1.F1]
выражение группировки взял в [...] потому что некоторые SQL могут и без этой контсрукции.
в этом запросе одна строка из запроса соответствует одной строке из T1 и нескольким из T2
обновление такого запроса невозможно стандартными стредствами.
В ODAC например есть возможность руками прописать алгоритм UPDATЕ и DELЕTЕ. В ADO не видел такого. Придется вешаться на события навигатора, либо на BeforeDelete, DeforeUpdate
8 сентября 2009 в 21:04
DBGrid имеет какой-нибудь способ указать ключ в используемой таблице? иначе в режиме статического набора записей ориентироваться у него не получится. либо используйте другой режим для открытия таблицы.
8 сентября 2009 в 18:04
Видел такое, только в Дельфях… Вроде у компонента ADOQuery должно быть свойство вроде CursorLocation или Position, там должно стоять Server.
(думаю в билдере ADO должна выглядеть примерно так же)