Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

после выполнения SQL запроса результат не отображается [D7, Paradox]


Страницы:   1 2 3 4

Алексей ©   (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у

даблклик по гриду - есть колумны?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо