![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
после выполнения SQL запроса результат не отображается [D7, Paradox]
Алексей © (2004-08-09 13:35:00)Здравствуйте.
Собственно это и есть вопрос. После выполнения SQL запроса результат не отображается в DBGrid. Даже столбцов становится не видно, как будто нет подключения к базе данных. Тоесть когда программа запускается, то всё работает как задано в начале на этапе разработки, а потом, когда меняю SQL запрос програмно, в DBGrid ничего не видно.
DataModule2.Query1.Close;
DataModule2.Query1.SQL.Clear;
DataModule2.Query1.SQL.Add('SELECT M.id');
DataModule2.Query1.SQL.Add('FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD');
DataModule2.Query1.SQL.Add('WHERE ' + s_GreatFilter + ';');
DataModule2.Query1.Open;
Здесь s_GreatFilter програмно созданное условие запроса типа M.DataRojdeniya = "31.12.2000".
Нужно отобрать ключевые поля M.id записей таблицы Main_FIO.db отвечающих заданному условию s_GreatFilter .
Что я делаю неправильно?
Алексей (2004-08-09 15:36:00) [41]Соловьев ©
По идее он должен отобразить все поля id таблицы Main_FIO.db
Так это задумывалось.
Sergey13 (2004-08-09 15:36:00) [42]В результате должгно быть нечто вроде
SELECT SELECT M.id
FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
WHERE M.Familiya LIKE "%АБВ%" AND M.Imiya LIKE "%АБВ%"
AND M.ID=A.M_ID AND M.ID=P.M_ID AND M.ID=RD.M_ID
Хотя логический смысл запроса мне недоступен. Ты проверяешь текстовые поля разных таблиц, а выводишь только ИДшник главной.
ЗЫ: Что то мне версия [18] Val © (09.08.04 15:19) все больше нравится.
Алексей (2004-08-09 15:34:00) [43]Для Val ©
Абсолютно точно, но, в программе используются паралельно TTable и TQuerу подключенные к одному DataBase. Умирающий DBGrid подключён к TQuerу. Те что подключены к TTable продолжают всё показывать и работать
Соловьев (2004-08-09 15:33:00) [44]
> У меня и книги по Delphi7 есть, толстые, как написано так
> и сделал, в результате пишу Вам.
SELECT M.id
FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
А там не написано что хотят получить в таком запросе?
Алексей (2004-08-09 15:32:00) [45]Для Соловьев ©
localsql.hlp + join - это значит читать хелпы и использовать связывание таблиц?
У меня и книги по Delphi7 есть, толстые, как написано так и сделал, в результате пишу Вам.
Алексей (2004-08-09 15:27:00) [46]Для Sergey13 ©
Запрос формируется пользователем в процессе работы программы. Сам запрос должен выглядеть или как
s_GreatFilter := 'M.Familiya LIKE "%" || "' + Form6.Edit1.Text + '" || "%"'
если запрос один или
s_GreatFilter := s_GreatFilter + 'M.Familiya LIKE "%" || "' + Form6.Edit1.Text + '" || "%"'
если запрос добавляется к предыдущему и получается в итоге, например так
SELECT SELECT M.id
FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
WHERE M.Familiya LIKE "%" || "АБВ" || "%" когда запрос один
или
SELECT SELECT M.id
FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
WHERE M.Familiya LIKE "%" || "АБВ" || "%" AND M.Imiya LIKE "%" || "АБВ" || "%"
Так это задумывалось.
Соловьев (2004-08-09 15:22:00) [47]
> DataModule2.Query1.SQL.Add('SELECT M.id');
> DataModule2.Query1.SQL.Add('FROM "Main_FIO.db" As M, "Adress.db"
> As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD');
localsql.hlp + join
Val (2004-08-09 15:19:00) [48]Коллеги, мне кажется что вы что-то упускаете, начав разбирать запрос автора. Обратите внимание
1.
> ...Когда поместил Query на DataModule2, задал базу данных,
> в SQL записал SELECT * FROM Main_FIO.db и в DBGrid появились
> и поля и их значения, всё нормально. Запускаю программу
> всё отображается, но стоит обработать запрос, даже такой
> же как и был раньше (SELECT * FROM Main_FIO.db), и DBGrid
> умирает....
2.
> ...DBGrid просто "умирает", в нём ничего нет, никаких ошибок
> не возникает, программа работает. Когда DBGrid на форму
> ложишь, он пустой, вот такой же он и становится....
Подозреваю, что он отцепляет сетку от источника данных, либо закрывает его где-то. Если запрос ничего не вернул бы - у него остались бы заголовки колонок. У него "пустеет сетка" при любом запросе.
Алексей (2004-08-09 15:17:00) [49]Для Соловьев ©
Понял, я говорил о работающей программе, там пропадают данные из грида. При программировании, как только поместил Query на DataModule2, задал базу данных, в SQL записал SELECT * FROM Main_FIO.db, то в DBGrid появились и поля и их значения, всё нормально, Activ = true, работает. Запускаю программу всё отображается, но стоит нажать на кнопку с запросом типа
DataModule2.Query1.Close;
DataModule2.Query1.SQL.Clear;
DataModule2.Query1.SQL.Add('SELECT M.id');
DataModule2.Query1.SQL.Add('FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD');
DataModule2.Query1.Open;
начинаются проблемы как я говорил. Умирает грид.
Для Sergey13 ©
Синтаксис подучу. Я так понял что ВЕСЬ запрос (после WHERE) должен быть в кавычках? Ну а если без WHERE? просто отобразить поля, почему не работает?
Sergey13 (2004-08-09 15:10:00) [50]Бр-р-р. А нельзя просто написать текст результирующего запроса? Без If Form6.Edit1.Text
Алексей (2004-08-09 15:07:00) [51]Для Sergey13 ©
Условие отбора формируется для главной таблицы как
If Form6.Edit1.Text <> '' then if s_GreatFilter <> '' then s_GreatFilter :=
s_GreatFilter + ' AND ' + 'M.Familiya LIKE "%" || "' + Form6.Edit1.Text + '" || "%"'
else s_GreatFilter := 'M.Familiya LIKE "%" || "' + Form6.Edit1.Text + '" || "%"';
А для подчинённых таблиц
If Form6.Edit9.Text <> '' then if s_GreatFilter <> '' then s_GreatFilter :=
s_GreatFilter + ' AND ' + '(' + 'A.A_TipAdresa LIKE "' + Form6.Edit9.Text + '"' +
' AND ' + 'M.id = A.A_Main_id' + ')'
else s_GreatFilter := '(' + 'A.A_TipAdresa LIKE "' + Form6.Edit9.Text + '"' +
' AND ' + 'M.id = A.A_Main_id' + ')';
Но даже без этих запросов, простой запрос типа
DataModule2.Query1.Close;
DataModule2.Query1.SQL.Clear;
DataModule2.Query1.SQL.Add('SELECT M.id');
DataModule2.Query1.SQL.Add('FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD');
DataModule2.Query1.Open;
Убивает DBGrid, и программа не виснет, работает.
Соловьев (2004-08-09 15:05:00) [52]
> По крайней мере ничего не появляется
врешь - должно появиться окошко - список колумнов. Возможно пустой. Правый клик - активна кнопка Add All Fields?
Sergey13 (2004-08-09 15:04:00) [53]2[12] Алексей (09.08.04 14:57)
>Но почему умирает DBGrid?
Да не грид умирает, а связаный датасет.
>SELECT M.id FROM "Main_FIO.db" As M LEFT JOIN "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
Можно и с джоином можно и без него, только синтаксис подучи. Главное сказать, что
""Поле подчинённой" = "условию" AND "Ключевое поле главной" = "сохранённому ключевому полю подчинённой". "
Алексей (2004-08-09 14:57:00) [54]Для Соловьев ©
даблклик по гриду ничего не даёт. По крайней мере ничего не появляется.
Для Sergey13 ©
И чего надо сделать?
SELECT M.id FROM "Main_FIO.db" As M LEFT JOIN "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD
Я правильно понял? Но почему умирает DBGrid?
Sergey13 (2004-08-09 14:57:00) [55]2[8] Алексей (09.08.04 14:50)
>В программе "Main_FIO.db" As M это главная таблица, а "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" это подчинённые таблицы которые хранят ключ главной, и в запросе могут отбираться записи в главной таблице Main_FIO.db по принципу
"Поле подчинённой" = "условию" AND "Ключевое поле главной" = "сохранённому ключевому полю подчинённой".
Вот ТЫвсе знаешь, осталось объяснить это базев запросе. 8-)
Соловьев (2004-08-09 14:55:00) [56]Та не "умирает" у него. Если бы умерло то мы бы видели вопрос про зависание проги. А у него 100% колумны остались от старого запроса в гриде.
Наталия (2004-08-09 14:54:00) [57]Своим запросом ты получаешь полное перемножение всех своих таблиц. Неудивительно, что у тебя всё "умирает". Добавь в условие связи между этими таблицами
Алексей (2004-08-09 14:50:00) [58]';' это уберу, спасибо. В программе "Main_FIO.db" As M это главная таблица, а "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" это подчинённые таблицы которые хранят ключ главной, и в запросе могут отбираться записи в главной таблице Main_FIO.db по принципу
"Поле подчинённой" = "условию" AND "Ключевое поле главной" = "сохранённому ключевому полю подчинённой". Но даже если эти запросы исключить, ничего не отбирать :), а создать SQL запрос вида SELECT M.id FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD т.е просто показать все записи таблицы Main_FIO.db, как я понимаю, то всё равно DBGrid "умирает".
Sergey13 (2004-08-09 14:44:00) [59]2[5] Алексей (09.08.04 14:38)
Скажу проще. Твой "длинный" запрос - фигня, ибо не определены связи таблиц. Поэтому делается полное произведение всех таблиц.
Соловьев (2004-08-09 14:43:00) [60]
> Умирающий DBGrid подключён к TQuerу
даблклик по гриду - есть колумны?