Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1092373880
DION
2004-08-13 09:11
2004.09.05
Как узнать...Присутствует ли клавиатура???


1-1093010645
Gear
2004-08-20 18:04
2004.09.05
опять поток!


8-1087015047
dimon_programmer
2004-06-12 08:37
2004.09.05
Аналог Scanline в C++


3-1091954696
Bee
2004-08-08 12:44
2004.09.05
SQL. Агрегатные функции


4-1090506451
юзверь
2004-07-22 18:27
2004.09.05
SendMessage - ToolbarWindow32 - TB_ADDBUTTONS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский