Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2012, 11:34   #1
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание Корректный SQL-запрос.

Здравствуйте. Есть база данных Access (2003) со связанными таблицами:

"Анкета" (КодАнкеты, ФИО, ...)
"Места работы" (КодМестаРаботы, КодАнкеты, ДатаПриёма, МестоРаботы, ДатаУвольнения, ПричинаУвольнения)

При клике в ListBox на строке с фамилией необходимо выполнить запрос к двум таблицам и получить из первой таблицы ФИО выбранного работника, а со второй весь его послужной список (если мест работы несколько, то они должны выводиться по-порядку).

Вот мои наработки:

Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
with ADOQuery4 do
 begin
  Close;
  SQL.Clear;
  SQL.Add(Memo1.Text);
  SQL.Add('Where Фамилия Like '+QuotedStr(ListBox1.Items[ListBox1.ItemIndex]+'%'));
  Open;     
 end;
Код SQL-запроса из Memo1:

Код:
SELECT Анкета.Фамилия, Анкета.Имя, Анкета.Отчество, 
[Места работы].[Дата поступления], [Места работы].[Место работы], [Места работы].[Дата увольнения], [Места работы].[Причина увольнения]
FROM Анкета INNER JOIN [Места работы] 
ON Анкета.КодАнкеты=[Места работы].КодАнкеты;
Что здесь не так? Как исправить текст запроса, чтобы он работал правильно? В представленном виде программа выдаёт ошибку.
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 06.07.2012, 11:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Точка с запятой в конце ON останется, явно мешать будет.
И нужна ли она вообще в конце запроса из дельфи?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.07.2012, 11:53   #3
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание

Цитата:
Сообщение от Аватар Посмотреть сообщение
Точка с запятой в конце ON останется, явно мешать будет.
Точку с запятой убрал, но запрос всё-равно не выполняется. При выполнении запроса выскакивает ошибка "Недопустимое использование '.', '!' или '()' в выражении запроса [Места работы].[Причина увольнения]".

В чём может быть причина ошибки?
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 06.07.2012, 13:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
"Места работы" (КодМестаРаботы, КодАнкеты, ДатаПриёма, МестоРаботы, ДатаУвольнения, ПричинаУвольнения)
Цитата:
[Места работы].[Дата поступления], [Места работы].[Место работы], [Места работы].[Дата увольнения], [Места работы].[Причина увольнения]
Что все таки правильно "МестоРаботы" или "Место работы" с пробелом? Остальное аналогично
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.07.2012, 13:46   #5
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание

Цитата:
Сообщение от Аватар Посмотреть сообщение
Что все таки правильно "МестоРаботы" или "Место работы" с пробелом? Остальное аналогично
В базе данных названия полей в таблицах с пробелами, как указано в коде sql-запроса из Memo1 в начале темы. Правильно ли в таком случае использовать квадратные скобки? Или лучше переименовать названия полей, чтобы в них не использовались пробелы?
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 06.07.2012, 13:58   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В базе данных названия полей в таблицах с пробелами, как указано в коде sql-запроса из Memo1 в начале темы. Правильно ли в таком случае использовать квадратные скобки?
для MS Access это абсолютно правильно (я бы даже сказал, только так и можно достучаться до подобных полей)

Цитата:
Или лучше переименовать названия полей, чтобы в них не использовались пробелы?
целиком и полностью зависит от Вас. я лично в своей практике предпочитаю не играть с огнём, используя поля, написанные кириллицей, с пробелами, знаками препинания и т.д. и т.п. стандартные идентификаторы (латинские буква + [ латинские буквы | цифры | знак_подчёркивания ] - это мой личный выбор. но, в принципе, будет работать и так, как у вас - с пробелами и кириллицей. Решайте сами, переименовывать или нет...


по сути проблемы. никакого особого криминала (ну кроме точки с запятой, о которой была речь выше) я не вижу.
возможно, для MS Access важен порядок ключевых слов в запросе...

я бы рекомендовал вывести запрос в отдельное Memo
например, так:
Код:
with ADOQuery4 do
 begin
  Close;
  SQL.Clear;
  SQL.Add(Memo1.Text);
  SQL.Add('Where Фамилия Like '+QuotedStr(ListBox1.Items[ListBox1.ItemIndex]+'%'));
   { Open;   - временно закомментировали, вместно него выводим запрос в memo2 }
  Memo2.Text := SQL.Text;
 end;
потом скопировать полученный текст запроса из Memo2
запустить MS Access. открыть там SQL окошко.
вставить запрос туда и попытаться выполнить...

Последний раз редактировалось Serge_Bliznykov; 06.07.2012 в 14:05.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 14:44   #7
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
...
я бы рекомендовал вывести запрос в отдельное Memo
...
потом скопировать полученный текст запроса из Memo2
запустить MS Access. открыть там SQL окошко.
вставить запрос туда и попытаться выполнить...
Я сделал так, как вы посоветовали. При попытке выполнить получившийся запрос в MS Access появилось такое сообщение:


После нажатия на OK (с введённым местом работы или без него) выводится пустая строка со всеми полями без данных.
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 06.07.2012, 15:20   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Проверьте ОЧЕНЬ тщательно.
скорее всего в таблице Места работы НЕТ поля с названием Место работы!!

может оно в таблице без пробела, может, среди русских буковок есть латинские
попробуйте отличить Mecтo paбoты от Место работы!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 16:11   #9
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Проверьте ОЧЕНЬ тщательно.
скорее всего в таблице Места работы НЕТ поля с названием Место работы!!

может оно в таблице без пробела, может, среди русских буковок есть латинские
попробуйте отличить Mecтo paбoты от Место работы!
Запрос на наличие латинских букв среди русских проверил, даже заново набрал текст запроса. Всё равно не работает (в Delрhi). Хотя после некоторых преобразований:

Было:
Код:
SQL.Add('Where Фамилия Like '+QuotedStr(ListBox1.Items[ListBox1.ItemIndex]+'%'));
Стало:
Код:
SQL.Add('Where Анкета.Фамилия = '+ListBox1.Items[ListBox1.ItemIndex]);
получаемый запрос выполняется в Access нормально (с произвольной фамилией из базы данных).
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 07.07.2012, 09:48   #10
ych_del
Форумчанин
 
Аватар для ych_del
 
Регистрация: 06.02.2011
Сообщений: 150
По умолчанию

Обрати внимание - во втором случае ты таки указал имя таблицы, в которой содержится поле "Фамилия". Теперь попробуй сделать то же самое для первого случая (который с использованием like)
Профессиональный конвертор галлюцинаций заказчика в алгоритмическую структуру.
ych_del вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос vishenkaN Помощь студентам 10 20.01.2012 16:49
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
Корректный запрос (заголовки) к translate.google.ru theYozh Работа с сетью в Delphi 1 02.01.2010 14:25
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15