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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2010, 00:20   #1
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию Проблемы с формированием SQL-запроса

Здравствуйте, в общем пишу одну программку для работы а акцессовской БД.
в базе несколько таблиц-отделов, не связанных между собой. Пользователь с помощью комбобоксов производит выборку данных.
1) выбирает отдел, он выводится в DBGrid. Одновременно заполняю Items во втором комбобоксе (из заголовков столбцов таблицы).
2) далее нужно отфильтровать смену, при выборе смены у меня формируется следующий SQL-запрос:

Код:
procedure TAdminForm.ComboBox2Change(Sender: TObject);
begin
if Combobox2.Text='Все смены' then SMENA:='*' else
begin
SMENA:=Combobox2.Text;
    with ADOQuery1 do begin
    SQL.Clear;
    SQL.Add('SELECT');
    SQL.Add('Data, '+SMENA);
    SQL.Add('FROM '+OTDEL);
    SQL.Add('ORDER BY Data, '+SMENA);
    Open;
    Close;
    SQL.Clear;
    end;
end;
end;
OTDEL,SMENA - string есстественно
Здесь то вылетает ошибка:

Подскажите, в чем может быть ошибка? или есть какие-либо более простые способы фильтрации данных? (всё это делаю, так как нужно автоматом получать список таблиц в БД и количество смен в них)
Nigadyai вне форума Ответить с цитированием
Старый 11.03.2010, 07:52   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
далее нужно отфильтровать смену
То есть Вам нужно расположить записи в порядке возрастания?
Код:
SQL.Add('ORDER BY Data, '+SMENA);
А зачем Вы пишите
Цитата:
, '+SMENA
?

P.S. Не забывайте про QuotedStr. Не знаю как Access к ней относится, но лучше заключать текстовые имена полей в кавычки.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 11.03.2010 в 07:56.
artemavd вне форума Ответить с цитированием
Старый 11.03.2010, 08:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но лучше заключать текстовые имена полей в кавычки.
Это еще что за финт?
Имена полей да и в принципе обьектов в микрософтовских СУБД заключаются в [] (брекеты короче, не знаю как они правильно называются)
Цитата:
в чем может быть ошибка?
Ну вообще-то не рекомендуется в названии обьекта первым символом число ставить. Как минимум заключай имя поля поля в []
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.03.2010, 10:12   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) не будет вообще ничего выбираться, если выбрать в ComboBox2 - "Все смены" (надо после else убрать begin, ну и соответствующие ему end, разумеется)

2) 2_smena - это что?! Есть такое поле в таблице Сборка дверей ?!
дайте структуру таблицы?

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

Код:
    SQL.Add('SELECT');
    SQL.Add('[Data], ['+SMENA+'] ');
    SQL.Add('FROM ['+OTDEL+']');
    SQL.Add('ORDER BY [Data], ['+SMENA+']');
4) а зачем после открытия запроса тут же его закрывать и очищать!?!?!? o_O!!!

5) для отладки ОЧЕНЬ помогает выдача запроса перед тем, как его выполнить (перед Open )
Код:
например, так:
Application.MessageBox(ADOQuery1.SQL.Text,'Debug', MB_OK);

Последний раз редактировалось Serge_Bliznykov; 11.03.2010 в 10:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2010, 12:36   #5
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
То есть Вам нужно расположить записи в порядке возрастания?
То есть мне нужно, чтобы в таблице осталась только Дата и выбранная в комбобоксе смена.

Цитата:
Ну вообще-то не рекомендуется в названии обьекта первым символом число ставить. Как минимум заключай имя поля поля в []
Хорошо, попробую

Цитата:
1) не будет вообще ничего выбираться, если выбрать в ComboBox2 - "Все смены" (надо после else убрать begin, ну и соответствующие ему end, разумеется)
да это понятно , просто хочу сначала со сменами разобраться

Цитата:
2) 2_smena - это что?! Есть такое поле в таблице Сборка дверей ?!
дайте структуру таблицы?
Ну на пальцах, так.
Файл БД в акцесс, в нем N-количество таблиц содержится (то есть Отделы). В каждом "отделе" есть поле дата и смены.
Data | 1_smena | 2_smena | ...
таким образом, в каждой таблице разное число смен.

вот так я получаю список смен в отделе.
Код:
procedure TAdminForm.ComboBox1Change(Sender: TObject);
var i: integer;
begin
case Combobox1.ItemIndex of
{Малярка}
0:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Malyarka'; ADOTable1.Active:=true;

    end;
{Сборка дверей}
1:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Dveri'; ADOTable1.Active:=true;

    end;
{Сборка Цех 1}
2:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Sborka_Cex_1'; ADOTable1.Active:=true;

    end;
{Упаковка}
3:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Ypakovka'; ADOTable1.Active:=true;

    end;
{Цех 1 Фрезеровка и Распиловка}
4:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Cex_1_Frez_Raspil'; ADOTable1.Active:=true;

    end;
{Шпонировка}
5:  begin
      ADOTable1.Active:=false; ADOTable1.TableName:='Shponirovka'; ADOTable1.Active:=true;
    end;
end;
    OTDEL:=ADOTable1.TableName;
    Combobox2.Enabled:=True;
    Combobox2.Clear;
    Combobox2.Items.Add('Все смены');
    for i:=1 to DBGrid1.Columns.Count - 1 do begin
    ComboBox2.Items.Add(DBGrid1.Columns.Items[i].FieldName);
    end;
    ComboBox2.Text:=ComboBox2.Items.Strings[0];
end;
Nigadyai вне форума Ответить с цитированием
Старый 11.03.2010, 14:03   #6
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

в общем, подправил sql-запрос, вывел в мему.
Код:
SELECT
[Data], [2_smena]
FROM [Sborka_Cex_1]
ORDER BY [Data], [2_smena]
ошибок не вылетает, но и реакции у DBGrid никакой, как были все смены, так и остались.

вот, если что, скриншот самой формы.
http://imagehost.spark-media.ru/i/90...D89992E0C3.jpg
Nigadyai вне форума Ответить с цитированием
Старый 11.03.2010, 14:14   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как были все смены, так и остались.
А ты в Акцессе этот запрос прогони - что выдаст?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.03.2010, 14:16   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

исходники проекта + тестовая БД -> архив.
архив на любой файлообменник.
сюда ссылочку на скачивание.
Тогда можно предметно поговорить.

иначе только предположения...
DBGrid с каким компонентом связан? Если вытаскивали в DesignTime поля в этот компонент - удалите все поля (они будут заполняться в run-time)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2010, 14:27   #9
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Цитата:
А ты в Акцессе этот запрос прогони - что выдаст?
я в акцессе конечно не алё, нашел там тока мастер запросов...
http://imagehost.spark-media.ru/i/39...53C0D0938C.jpg

Цитата:
исходники проекта + тестовая БД -> архив.
архив на любой файлообменник.
сюда ссылочку на скачивание.
Тогда можно предметно поговорить.
да не вопрос, просто у вас в правилах написано, что только куски кода можно писать, нельзя выкладывать исходники)))
http://upwap.ru/781845 [600kb] рабочая директория C:\Цех
p.s. в 2010 пишу...
Nigadyai вне форума Ответить с цитированием
Старый 11.03.2010, 14:47   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
реакции у DBGrid никакой, как были все смены, так и остались
Может, стоит попробовать добавить в запрос WHERE SMENA= [2_smena] ?
(или что-то в этом духе. Структурка такова, что запросы в ней делать - голову ломать...)

Последний раз редактировалось mihali4; 11.03.2010 в 14:49.
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Оптимизация SQL запроса Phantom SQL, базы данных 4 24.09.2009 16:07
Проблемы с кодировкой при выполнении post запроса FANATID Работа с сетью в Delphi 7 01.03.2009 14:46
Проблема с формированием запроса на выборку.. Tanuska___:) БД в Delphi 3 17.02.2009 16:31