![]() |
|
|
![]()
|
|
| Rowi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
Здравствуйте, все!
Такая ситуация: Наконец дошли руки до БД (в самой Delphi кое-что уже умею). Через TTable(BDE) по мелочи простейшие вещи получались. Но чтобы уйти от BDE (из-за необходимости при распространении таскать за собой кучу всякого), решил попробовать связку Delphi+ADO(Jet.OLEDB.4.0)+MS Access. Сделал в самом Access'e тренировочную базочку на 3 таблички: "Сотрудники"(КодСотрудника, ФамилияСотрудника), "Клиенты"(КодКлиента, ФамилияКлиента), "Заказы"(КодЗаказа, КодКлиента, КодСотрудника, ДатаРазмещения). Для того, чтобы подсмотреть ;) содержание запроса, там же создал запрос "ЗаказыЗапрос", чтобы выдавал то же, что и таблица "Запрос", но вместо "КодКлиента" и "КодСотрудника" подставлял соответственно Фамилии того и другого. Подсмотренный текст запроса такой:
В самом Access'e всё работает прекрасно: в таблицу выводится нужная информация, можно редактировать и добавлять записи. Далее пробовал то же самое и через TADOQuery, и через TADODataSet(кстати, так и не понял, что лучше использовать?). Запрос с тем же "плагиатным" текстом вроде работает (информация в TDBGrid выводится правильная и даже получается что-то редактировать), но не могу добавлять записи! Т.е. они вроде вводятся и сохраняются(?), но при повторном применении того же запроса (для обновления данных) новых записей нет! Проверяю через Access - в таблицах "Сотрудники" и "Клиенты" новые записи есть (правда, дублирует фамилию столько раз, сколько ей должно быть сопоставлено Заказов) , а в "Заказах" тоже новые записи есть, но поля "КодКлиента" и "КодСотрудника" пустые. Видимо поэтому новый запрос их и не видит? Помогите пожалуйста разобраться - что я не так делаю? Заранее спасибо! |
|||
|
||||
| YurikGL |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Лучше TADODataSet... Глюков меньше.
Больно сложный запрос для добавления... я бы lookup поля использовал. Т.е. двойной клик на adodataset, правый клик add new field тип lookup дальше интуитивно понятно.... только для справочников предварительно сделай датасеты... --------------------
|
||||
|
|||||
| Rowi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
YurikGL, Огромное спасибо, получилось!!! Нечто подобное я уже делал раньше с TTable, но не знал, что используя SQL, можно делать так же...
Т.е. я добавил два доп. датасета (setWorkers и setCustomers), затем в основном датасете через FieldsEditor добавил подстановочные поля CustName и WorkerName (правда, сами связующие поля "КодКлиента" и "КодСотрудника" пришлось тоже включить и поставить Visible:= false, чтобы на глазах не маячили), а в CommandText основного датасета записал просто 'SELECT * FROM Заказы'. И теперь всё чудненько и добавляет, и редактирует! НО!!! Не получается сделать простейшую фильтрацию типа 'SELECT * FROM Заказы WHERE CustName = "Вася" ' : ругается, что "Отсутствует значение для одного или нескольких требуемых параметров." Я, вообще-то догадываюсь, что он хочет не CustName (подстановочное поле), а "КодСотрудника", но ведь пользователь не видит (зачем ему голову забивать!) этот код! Он знает только ИМЯ сотрудника, и хочет найти все записи с этим именем! Как тут быть? Ведь без элементарной (хотя бы) фильтрации зачем тогда SQL? Видимо, я что-то ещё не так делаю. Но что? P.S. По дате фильтрует нормально Это сообщение отредактировал(а) Rowi - 20.2.2006, 01:07 |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Ты хочешь отфильтровать записи и отфильтрованный список редактировать...
А как ты себе представляешь реакцию системы, если ты в отфильтрованном наборе WHERE CustName = "Вася" в поле CustName введешь "Петя"? По логике, запись должна будет исчезнуть т.к. она оказывается вне фильтра. Кстати, можно еще попробовать заранее сделать запрос в Access и загружать его в программу, как обычную таблицу. --------------------
|
|||
|
||||
| Rowi |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
По логике - вроде да! А по опыту пользователя:
Именно! А как же иначе! Ведь весь список может быть "о-го-го"! Как же пользователь найдёт этого самого "Васю", которого надо заменить на "Петю"? (Пардон за каламбур...) Это наверняка можно (и нужно!) сделать, только, возможно, каким-то другим способом... |
||||
|
|||||
| Rowi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
Пробовал. Результат тот же: К тому же такой запрос не получится изменять в программе "по ходу дела"... |
|||
|
||||
| sexton |
|
|||
![]() sexton=Пономарь (eng) ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 5.5.2004 Где: Ульяновск Репутация: нет Всего: 9 |
А первичные ключи в таблицах прописаны?
|
|||
|
||||
| Rowi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
Я создавал эти таблицы в Access'е через мастера таблиц, так что он сам предложил сделать первичными ключами для каждой таблицы соответственно КодЗаказа, КодКлиента и КодСотрудника. Я и не отказывался...
|
|||
|
||||
| sexton |
|
|||
![]() sexton=Пономарь (eng) ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 5.5.2004 Где: Ульяновск Репутация: нет Всего: 9 |
ОК, а в ConnectionString доступ соответствующий даден? Может стоит представить обществу пример проекта на рассмотрение...
|
|||
|
||||
| Rowi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 12.12.2005 Где: Украина Репутация: нет Всего: нет |
Установлено "Share Deny None"
Дико извиняюсь, что не догадался сразу! Цепляю к посту архив с исходниками и "тренировочной" базой... Присоединённый файл ( Кол-во скачиваний: 14 )
ADO_Tests.zip 47,30 Kb |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Сортировкой... А потом, в ehGrid есть фишка, когда начинаешь набирать на клавиатуре "Петя" и курсор сам позиционируется на петю... --------------------
|
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Rowi,
DelphiKingdom, там статья "Немного об использовании ADO...". Когда будет решена проблема с вписыванием ключевых полей (не должны они быть пустыми, post/requery!), тогда и запросы заработают. TEdit - поменять на лукапкомбобоксы, чтобы из выбранного "Петя" получать значение ключевого поля и его уже загонять в select. Иначе придется вначале по "Петя" находить его код и уже его впихивать в select - лишний гимор, плюс возможность ввода "ППетя" с нулевым результатом. Если не сработает, то рекомендую проверить лукап - есть ли связка между полями справочников (где коды, а не "Пети"). |
|||
|
||||
![]()
|
| Правила форума "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. |