Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Внизпосле выполнения SQL запроса результат не отображается Найти похожие ветки
← →
Алексей (2004-08-09 13:35) [0]Здравствуйте.
Собственно это и есть вопрос. После выполнения 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 .
Что я делаю неправильно?
← →
Sergey13 © (2004-08-09 13:39) [1]А как связаны "Main_FIO.db" , "Adress.db" , "Pasport.db" , "Rozisknoe_Delo.db" между собой в запросе? Просто у тебя, ИМХО, получается произведение всех таблиц и комп входит в ступор от объема. Покажи первоначальный запрос, когда "все работает".
← →
Алексей (2004-08-09 14:11) [2]Наверно я неправильно объяснил. Когда поместил Query на DataModule2, задал базу данных, в SQL записал SELECT * FROM Main_FIO.db и в DBGrid появились и поля и их значения, всё нормально. Запускаю программу всё отображается, но стоит обработать запрос, даже такой же как и был раньше (SELECT * FROM Main_FIO.db), и DBGrid умирает. В нём нет ничего. С Query я только начал работать, до этого общался с TTable и всё делал через Filter, а тут прям как упёрся, не доходит что не так и всё тут.
← →
Соловьев © (2004-08-09 14:13) [3]
> но стоит обработать запрос, даже такой же как и был раньше
> (SELECT * FROM Main_FIO.db), и DBGrid умирает.
т.е.? ошибка? пустой набор данных?
localsql.hlp+table names
SELECT * FROM "Main_FIO.db"
← →
Sergey13 © (2004-08-09 14:30) [4]2[2] Алексей (09.08.04 14:11)
>но стоит обработать запрос
Что за "обработать"? Конкретно.
SELECT * FROM Main_FIO.db
И
SELECT M.id FROM "Main_FIO.db" As M, "Adress.db" As A, "Pasport.db" As P, "Rozisknoe_Delo.db" As RD WHERE " + s_GreatFilter
Это слегка разные вещи, не кажется тебе?
Да, и убери в запросе + ";"
← →
Алексей (2004-08-09 14:38) [5]DBGrid просто "умирает", в нём ничего нет, никаких ошибок не возникает, программа работает. Когда DBGrid на форму ложишь, он пустой, вот такой же он и становится. Т.е. выглядит так, что когда я Query закрыл для создания SQL запроса он и базу данных закрыл, а потом когда его открываешь база данных закрыта, но ведь это бред, Query.Close не должен закрывать базу и не закрывет. В программе используются паралельно TTable и TQuerу подключенные к одному DataBase. Умирающий DBGrid подключён к TQuerу. Те что подключены к TTable продолжают всё показывать.
← →
Соловьев © (2004-08-09 14:43) [6]
> Умирающий DBGrid подключён к TQuerу
даблклик по гриду - есть колумны?
← →
Sergey13 © (2004-08-09 14:44) [7]2[5] Алексей (09.08.04 14:38)
Скажу проще. Твой "длинный" запрос - фигня, ибо не определены связи таблиц. Поэтому делается полное произведение всех таблиц.
← →
Алексей (2004-08-09 14:50) [8]";" это уберу, спасибо. В программе "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 "умирает".
← →
Наталия © (2004-08-09 14:54) [9]Своим запросом ты получаешь полное перемножение всех своих таблиц. Неудивительно, что у тебя всё "умирает". Добавь в условие связи между этими таблицами
← →
Соловьев © (2004-08-09 14:55) [10]Та не "умирает" у него. Если бы умерло то мы бы видели вопрос про зависание проги. А у него 100% колумны остались от старого запроса в гриде.
← →
Sergey13 © (2004-08-09 14:57) [11]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:57) [12]Для Соловьев ©
даблклик по гриду ничего не даёт. По крайней мере ничего не появляется.
Для 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 15:04) [13]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 15:05) [14]
> По крайней мере ничего не появляется
врешь - должно появиться окошко - список колумнов. Возможно пустой. Правый клик - активна кнопка Add All Fields?
← →
Алексей (2004-08-09 15:07) [15]Для 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, и программа не виснет, работает.
← →
Sergey13 © (2004-08-09 15:10) [16]Бр-р-р. А нельзя просто написать текст результирующего запроса? Без If Form6.Edit1.Text
← →
Алексей (2004-08-09 15:17) [17]Для Соловьев ©
Понял, я говорил о работающей программе, там пропадают данные из грида. При программировании, как только поместил 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? просто отобразить поля, почему не работает?
← →
Val © (2004-08-09 15:19) [18]Коллеги, мне кажется что вы что-то упускаете, начав разбирать запрос автора. Обратите внимание
1.
> ...Когда поместил Query на DataModule2, задал базу данных,
> в SQL записал SELECT * FROM Main_FIO.db и в DBGrid появились
> и поля и их значения, всё нормально. Запускаю программу
> всё отображается, но стоит обработать запрос, даже такой
> же как и был раньше (SELECT * FROM Main_FIO.db), и DBGrid
> умирает....
2.
> ...DBGrid просто "умирает", в нём ничего нет, никаких ошибок
> не возникает, программа работает. Когда DBGrid на форму
> ложишь, он пустой, вот такой же он и становится....
Подозреваю, что он отцепляет сетку от источника данных, либо закрывает его где-то. Если запрос ничего не вернул бы - у него остались бы заголовки колонок. У него "пустеет сетка" при любом запросе.
← →
Соловьев © (2004-08-09 15:22) [19]
> 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
← →
Алексей (2004-08-09 15:27) [20]Для 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:32) [21]Для Соловьев ©
localsql.hlp + join - это значит читать хелпы и использовать связывание таблиц?
У меня и книги по Delphi7 есть, толстые, как написано так и сделал, в результате пишу Вам.
← →
Соловьев © (2004-08-09 15:33) [22]
> У меня и книги по 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:34) [23]Для Val ©
Абсолютно точно, но, в программе используются паралельно TTable и TQuerу подключенные к одному DataBase. Умирающий DBGrid подключён к TQuerу. Те что подключены к TTable продолжают всё показывать и работать
← →
Sergey13 © (2004-08-09 15:36) [24]В результате должгно быть нечто вроде
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:36) [25]Соловьев ©
По идее он должен отобразить все поля id таблицы Main_FIO.db
Так это задумывалось.
← →
Sergey13 © (2004-08-09 15:40) [26]2[25] Алексей (09.08.04 15:36)
Соловьев ©
>По идее он должен отобразить все поля id таблицы Main_FIO.db
Идея не воплощена в жизнь.
← →
Соловьев © (2004-08-09 15:43) [27]2 Алексей
Так что там по посту [14]?
← →
Алексей (2004-08-09 15:56) [28]Для Sergey13 ©
согласен, забыл показать скобки, в программе они есть, прописал лишний 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 (A.A_TipAdresa LIKE "%АБВ%" AND M.ID=A.A_Main_ID) AND (P_PNomerPasprta LIKE "%АБВ%" AND M.ID=P.M_ID) AND (RD_NomerRD LIKE "%АБВ% AND M.ID=RD.M_ID)
это пример получаемого запроса ко всем таблицам по результатам которого должны отбираться записи в главной таблице.
Так это задумывалось.
но вопрос не в запросе :), грид умирает и без него, SELECT *
FROM Main_FIO.db програмно и он умер.
← →
Алексей (2004-08-09 16:02) [29]Для Соловьев ©
Add All Fields на Query работает (на этапе программирования), на гриде список пустой, поэтому, если я не ошибаюсь, грид заполняется в соответствии с полями таблицы? по правой кнопке предлагает редактор колумнов :)
← →
Sergey13 © (2004-08-09 16:03) [30]2Алексей (09.08.04 15:56)
>По идее он должен отобразить все поля id таблицы Main_FIO.db
>SELECT M.id FROM
>грид умирает и без него
Значит думай над [18]
← →
Алексей (2004-08-09 16:09) [31]Sergey13 ©
Так я ж об этом и говорю. База данных не закрывается (элемент DataBase), потому что к ней паралельно присоеденены и TTable и TQuery? на обоих повешаны гриды (через DataSourse) и тот что на TQuery после запроса умирает а на TTable продолжает жить и работать. Вот в чём непонятка.
← →
Sergey13 © (2004-08-09 16:13) [32]2[31] Алексей (09.08.04 16:09)
Стоят два дома. Один на постоянном фундаменте - нормальный. Другой - на фиг знает каком, при быстрой смене фундамента - падает. Примерно такая аналогия. Вывод - строить нормально. ИМХО, не стОит менять запрос под гридом настолько кардинально.
← →
Val © (2004-08-09 16:13) [33]Какая непонятка? Вы закрываете/отвязываете набор данных, который "привязан" к сетке - DBGrid1.Datasource.DataSet. И TDataBase здесь не причем, если все остальное продолжает работать.
← →
Алексей (2004-08-09 16:13) [34]Ощущение такое что почему то TQuery отключается от DataBase а обратно не подключается...
← →
Val © (2004-08-09 16:16) [35]>[32] Sergey13 © (09.08.04 16:13)
согласитесь, гриду все-равно что отображать :)
← →
Алексей (2004-08-09 16:17) [36]Для Val ©
И как его привязать :)
Для Sergey13 ©
Аналогия понятна и в общем с ней согласен, и как конкретно поступать в моём случае, да и вообще, на будущее?
← →
Val © (2004-08-09 16:18) [37]>[34] Алексей (09.08.04 16:13)
Не обязательно. Вы можете также отцепить его от сетки, хотя запрос. отработает.Соответсвенно, сетка ничего не покажет.
Проверьте свои ощущения с помощью пошагового выполнения.
← →
Sergey13 © (2004-08-09 16:19) [38]2[35] Val © (09.08.04 16:16)
>согласитесь, гриду все-равно что отображать :)
Согласен, если ему внятно объяснить, то да. 8-)
← →
Алексей (2004-08-09 16:22) [39]Для Val ©
согласен, но я меняю SQL запрос по форме
DataModule2.Query1.Close;
...
DataModule2.Query1.Open;
сам грид от DataSourse не отвязываю, работаю только с TQuery? почему же он не привязывается обратно???
← →
Алексей (2004-08-09 16:25) [40]Val ©
тоесть сама сетка отцепляется, и если после выполнения запроса её обратно прицепить програмно, то всё заработает? МЫСЛЬ. надо попробовать.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.042 c