Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

после выполнения 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.055 c
14-1092737617
Sandman25
2004-08-17 14:13
2004.09.05
Инопланетяне


1-1092839081
Toshanius
2004-08-18 18:24
2004.09.05
Очет


4-1090323947
TKV
2004-07-20 15:45
2004.09.05
Помогите поймать данные посылаемые из дос программы в порт LPT


1-1092905782
snake1977
2004-08-19 12:56
2004.09.05
QuickReport


4-1090306483
TKV
2004-07-20 10:54
2004.09.05
Помогите поймать данные посылаемые из дос программы в порт LPT