Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вывести запрос состоящий из двух таблиц, Если одна из них пустая 
:(
    Опции темы
Chechaco
Дата 20.10.2005, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, вопро с следующий:
Написал я запрос для TQuery
Код

Select Field1, Field2, Field1Table2 from Table1, Table2
Order by Field1, Field2


Причем в Table1 есть данные а Table2 пустая, в результате мне выдается запрос с одним пустым полем. Если объединяю два запроса через UNION - выдает ошибку. Как сделать чтобы в запросе выводились все значения полей из Table1 и рядом, соответственно, пустые поля из Table2?


Это сообщение отредактировал(а) Chechaco - 20.10.2005, 05:12
PM MAIL   Вверх
offline
Дата 20.10.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А у таблиц есть общие поля?
PM MAIL   Вверх
Alex
Дата 20.10.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



При объединении через union все поля в о обоих выборках должны иметь одинаковый тип и их кол-во должно быть равным


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Самурай
Дата 20.10.2005, 15:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

SELECT * FROM Table1 
LEFT JOIN Table2 ON Table1.id=Table2.id;

Проверено на базе данных Microsoft Access, откуда получен вывод, что должно работать на других базах данных.

P. S.
Table1 запелнена, а Table2 не заполнена. В противном случае меняется слово LEFT на слово RIGHT, что можно без труда сделать при автоматической генерации SQL-запроса в программе, т. е. преварительно посмотрев, какая из таблиц является пустой.
  Вверх
Chechaco
Дата 21.10.2005, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, получилось!
То есть, если я правильно понял, чтобы объединить две таблицы (Paradox) в одном запросе у них должны быть общие ключевые поля? Других ограничений для объединения нет?
PM MAIL   Вверх
offline
Дата 21.10.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, что бы включть несколько таблиц в запрос, нужно, что бы они были связанны между собой, но не обязательно ключевыми полями. если Table1.id=Table2.id ID ключевое поле, а таблицы связанны не этими полями, то результат запроса буден неверным smile
PM MAIL   Вверх
Chechaco
Дата 21.10.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А может еще подскажете как вводить данные в таблицу через DBGrid -> Query без дополнительных действий типа нажимания кнопки после ввода, чтобы данные сохранялись в таблице просто после перехода в гриде на другую ячейку (или хотя бы по нажатию Enter)? Благодарю.
PM MAIL   Вверх
Самурай
Дата 21.10.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

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



Цитата(Chechaco @ 21.10.2005, 18:41)
или хотя бы по нажатию Enter

Так что ли?
Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if key = #13
  then
   Query1.Post
end;



Цитата(kirilllius @ 21.10.2005, 11:57)
ключевыми полями.

А если просто создать поле, которое всегда будет равняться единице у двух таблиц? Как в этом случае?
PM MAIL ICQ   Вверх
YurikGL
Дата 22.10.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13
  then
   Query1.Post
end;


Ну-ну.... по Enter осуществляется вход в редактирование поля записи (во всяком случае в EhGrid), и если оказалось, что заполнены не все поля и среди незаполненных остались обязательные к заполнению, будет Exception...

Гораздо лучше post делать по закрытию окна, где редактировались данные.

Цитата
А если просто создать поле, которое всегда будет равняться единице у двух таблиц? Как в этом случае?

Мммм.... зачем такое.....???

Это сообщение отредактировал(а) YurikGL - 22.10.2005, 18:30
--------------------
 
PM MAIL WWW ICQ   Вверх
offline
Дата 22.10.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А если просто создать поле, которое всегда будет равняться единице у двух таблиц? Как в этом случае?

Тогда для связки таблиц лучше не использовать такое поле smile что-бы дров не наломать и головной боли было меньше. Заводи в каждой таблице ключевое автоинкременируемое поле и связывай его с любым полем подчененной таблицы 100% без заморочек.

Цитата
чтобы данные сохранялись в таблице просто после перехода в гриде на другую ячейку

Обрати внимание на пост YurikGL он верно сказал
Цитата
Гораздо лучше post делать по закрытию окна, где редактировались данные.

Данные в сетки лучше не редактировать, это не очень хорошо smile Пользователь может ткнуть случайно или еще что нибудь, а данные уже не вернешь smile Лучше для редактирования создавать специальное окно в котором по нажатию например на кнопочки " Принять" данные будут переноситься в таблицу, а если не нужно то просто закрыть окошко или сделать кнопочку "Отменить" которая вызовет Close. А на сетки лучше установить свойство "Только для чтения"

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


Бывалый
*


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

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



Цитата
Гораздо лучше post делать по закрытию окна, где редактировались данные.

Добавлю, что надо это делать в OnCloseQuery примерно так:

try
Table.post
except
on e:exception do begin
canclose:=false;
raise Exception.Create('Не могу подтвердить изменения записи. Произошла ошибка'+#13+e.Message);
end;

З.Ы. это в том случае, если все же решишь редактировать в сетке...
--------------------
 
PM MAIL WWW ICQ   Вверх
offline
Дата 22.10.2005, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Лучше вешать на отдельную кнопку. Я например хочу закрыть окно не сохраняя изменений. Да и использовать компоненты не связанные с DB, а простые. Хотя это все дело вкуса smile
PM MAIL   Вверх
YurikGL
Дата 22.10.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
Лучше вешать на отдельную кнопку. Я например хочу закрыть окно не сохраняя изменений. Да и использовать компоненты не связанные с DB, а простые. Хотя это все дело вкуса 

Тогда уж Firebird + прямое управление транзакциями smile И можно DB-компоненты пользовать.
--------------------
 
PM MAIL WWW ICQ   Вверх
Chechaco
Дата 24.10.2005, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так, а теперь по порядку. Я поставил Query, подцепил к ней базу, Поставил DataSource, поставил DBGrid, соединил все это дело. В Query написал
SELECT * FROM Table1
LEFT JOIN Table2 ON Table1.id=Table2.id; (по совету Самурая)
Поставил RequestLive = true, Active = true
Начинаю редактировать - а оно не редактируется, в то время как с выборкой из одной таблицы все проходит на ура. Т.е. я так понимаю должен быть какой-то другой выход, а какой? И еще, как сделать чтобы в выборке из двух таблиц (master-detail) запись, введенная в detail-таблицу соответствовала по внешнему ключу записи в master-таблице напротив которой она была введена?

Цитата(kirilllius @ 22.10.2005, 19:20)
Данные в сетки лучше не редактировать, это не очень хорошо smile Пользователь может ткнуть случайно или еще что нибудь, а данные уже не вернешь smile


В моем случае это нет суть важно, на крайний случай все данные есть на бумаге, главное не ставить кнопку "Удалить базу" smile
PM MAIL   Вверх
Grig
Дата 24.10.2005, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Chechaco @ 24.10.2005, 03:43)
Начинаю редактировать - а оно не редактируется

А что именно не редактируется?
Может ошибку выдает какую-нибудь?
Query1.Post стоИт?


--------------------
        
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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