Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADO+MS Access: помогите разобраться! Не получается добавлять записи 
:(
    Опции темы
Rowi
Дата 19.2.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Здравствуйте, все!

Такая ситуация:
Наконец дошли руки до БД (в самой Delphi кое-что уже умею). Через TTable(BDE) по мелочи простейшие вещи получались. Но чтобы уйти от BDE (из-за необходимости при распространении таскать за собой кучу всякого), решил попробовать связку Delphi+ADO(Jet.OLEDB.4.0)+MS Access.

Сделал в самом Access'e тренировочную базочку на 3 таблички: "Сотрудники"(КодСотрудника, ФамилияСотрудника), "Клиенты"(КодКлиента, ФамилияКлиента), "Заказы"(КодЗаказа, КодКлиента, КодСотрудника, ДатаРазмещения).
Для того, чтобы подсмотреть ;) содержание запроса, там же создал запрос "ЗаказыЗапрос", чтобы выдавал то же, что и таблица "Запрос", но вместо "КодКлиента" и "КодСотрудника" подставлял соответственно Фамилии того и другого.

Подсмотренный текст запроса такой:
Код

SELECT Заказы.КодЗаказа, Заказы.ДатаРазмещения, Клиенты.ФамилияКлиента, Сотрудники.ФамилияСотрудника
FROM Сотрудники INNER JOIN (Клиенты INNER JOIN Заказы ON Клиенты.КодКлиента = Заказы.КодКлиента) ON Сотрудники.КодСотрудника = Заказы.КодСотрудника
ORDER BY Заказы.КодЗаказа;

В самом Access'e всё работает прекрасно: в таблицу выводится нужная информация, можно редактировать и добавлять записи.

Далее пробовал то же самое и через TADOQuery, и через TADODataSet(кстати, так и не понял, что лучше использовать?). Запрос с тем же "плагиатным" текстом вроде работает (информация в TDBGrid выводится правильная и даже получается что-то редактировать), но не могу добавлять записи!
Т.е. они вроде вводятся и сохраняются(?), но при повторном применении того же запроса (для обновления данных) новых записей нет!

Проверяю через Access - в таблицах "Сотрудники" и "Клиенты" новые записи есть (правда, дублирует фамилию столько раз, сколько ей должно быть сопоставлено Заказов) , а в "Заказах" тоже новые записи есть, но поля "КодКлиента" и "КодСотрудника" пустые. Видимо поэтому новый запрос их и не видит?

Помогите пожалуйста разобраться - что я не так делаю?

Заранее спасибо!
PM MAIL   Вверх
YurikGL
Дата 19.2.2006, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата

и через TADODataSet(кстати, так и не понял, что лучше использовать?).

Лучше TADODataSet... Глюков меньше.


Цитата

но не могу добавлять записи!

Больно сложный запрос для добавления... я бы lookup поля использовал. Т.е. двойной клик на adodataset, правый клик add new field тип lookup дальше интуитивно понятно.... только для справочников предварительно сделай датасеты...
--------------------
 
PM MAIL WWW ICQ   Вверх
Rowi
Дата 20.2.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



YurikGL, Огромное спасибо, получилось!!! Нечто подобное я уже делал раньше с TTable, но не знал, что используя SQL, можно делать так же...

Т.е. я добавил два доп. датасета (setWorkers и setCustomers), затем в основном датасете через FieldsEditor добавил подстановочные поля CustName и WorkerName (правда, сами связующие поля "КодКлиента" и "КодСотрудника" пришлось тоже включить и поставить Visible:= false, чтобы на глазах не маячили), а в CommandText основного датасета записал просто 'SELECT * FROM Заказы'.
И теперь всё чудненько и добавляет, и редактирует! smile

НО!!! Не получается сделать простейшую фильтрацию типа
'SELECT * FROM Заказы WHERE CustName = "Вася" ' : ругается, что "Отсутствует значение для одного или нескольких требуемых параметров." smile
Я, вообще-то догадываюсь, что он хочет не CustName (подстановочное поле), а "КодСотрудника", но ведь пользователь не видит (зачем ему голову забивать!) этот код! Он знает только ИМЯ сотрудника, и хочет найти все записи с этим именем!

Как тут быть? Ведь без элементарной (хотя бы) фильтрации зачем тогда SQL? Видимо, я что-то ещё не так делаю. Но что?

P.S. По дате фильтрует нормально

Это сообщение отредактировал(а) Rowi - 20.2.2006, 01:07
PM MAIL   Вверх
YurikGL
Дата 20.2.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



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

Кстати, можно еще попробовать заранее сделать запрос в Access и загружать его в программу, как обычную таблицу.
--------------------
 
PM MAIL WWW ICQ   Вверх
Rowi
Дата 21.2.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Цитата(YurikGL @ 20.2.2006, 20:19 Найти цитируемый пост)
По логике, запись должна будет исчезнуть т.к. она оказывается вне фильтра

По логике - вроде да! А по опыту пользователя:
Цитата(YurikGL @ 20.2.2006, 20:19 Найти цитируемый пост)
Ты хочешь отфильтровать записи и отфильтрованный список редактировать...

Именно! А как же иначе! Ведь весь список может быть "о-го-го"! Как же пользователь найдёт этого самого "Васю", которого надо заменить на "Петю"? (Пардон за каламбур...)
Это наверняка можно (и нужно!) сделать, только, возможно, каким-то другим способом...
PM MAIL   Вверх
Rowi
Дата 22.2.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Цитата(YurikGL @ 20.2.2006, 20:19 Найти цитируемый пост)
Кстати, можно еще попробовать заранее сделать запрос в Access и загружать его в программу, как обычную таблицу.

Пробовал. Результат тот же:
Цитата(Rowi @ 19.2.2006, 01:29 Найти цитируемый пост)
Т.е. они вроде вводятся и сохраняются(?), но при повторном применении того же запроса (для обновления данных) новых записей нет!
Проверяю через Access - в таблицах "Сотрудники" и "Клиенты" новые записи есть (правда, дублирует фамилию столько раз, сколько ей должно быть сопоставлено Заказов) , а в "Заказах" тоже новые записи есть, но поля "КодКлиента" и "КодСотрудника" пустые. Видимо поэтому новый запрос их и не видит?

К тому же такой запрос не получится изменять в программе "по ходу дела"...
PM MAIL   Вверх
sexton
Дата 22.2.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 5.5.2004
Где: Ульяновск

Репутация: нет
Всего: 9



А первичные ключи в таблицах прописаны?
PM MAIL WWW ICQ   Вверх
Rowi
Дата 22.2.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Я создавал эти таблицы в Access'е через мастера таблиц, так что он сам предложил сделать первичными ключами для каждой таблицы соответственно КодЗаказа, КодКлиента и КодСотрудника. Я и не отказывался...
PM MAIL   Вверх
sexton
Дата 22.2.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 5.5.2004
Где: Ульяновск

Репутация: нет
Всего: 9



ОК, а в ConnectionString доступ соответствующий даден? Может стоит представить обществу пример проекта на рассмотрение...
PM MAIL WWW ICQ   Вверх
Rowi
Дата 22.2.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Цитата(sexton @ 22.2.2006, 14:10 Найти цитируемый пост)
ОК, а в ConnectionString доступ соответствующий даден?

Установлено "Share Deny None"


Цитата(sexton @ 22.2.2006, 14:10 Найти цитируемый пост)
Может стоит представить обществу пример проекта на рассмотрение...

Дико извиняюсь, что не догадался сразу!
Цепляю к посту архив с исходниками и "тренировочной" базой...

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  ADO_Tests.zip 47,30 Kb
PM MAIL   Вверх
YurikGL
Дата 25.2.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата(Rowi @ 21.2.2006, 23:01 Найти цитируемый пост)
Как же пользователь найдёт этого самого "Васю", которого надо заменить на "Петю"?


Сортировкой...
А потом, в ehGrid есть фишка, когда начинаешь набирать на клавиатуре "Петя" и курсор сам позиционируется на петю...
--------------------
 
PM MAIL WWW ICQ   Вверх
SergeBS
Дата 26.2.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Rowi,
DelphiKingdom, там статья "Немного об использовании ADO...". Когда будет решена проблема с вписыванием ключевых полей (не должны они быть пустыми, post/requery!), тогда и запросы заработают. TEdit - поменять на лукапкомбобоксы, чтобы из выбранного "Петя" получать значение ключевого поля и его уже загонять в select. Иначе придется вначале по "Петя" находить его код и уже его впихивать в select - лишний гимор, плюс возможность ввода "ППетя" с нулевым результатом.
Если не сработает, то рекомендую проверить лукап - есть ли связка между полями справочников (где коды, а не "Пети").

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.