Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.06.2009, 14:25
kvadratnt kvadratnt вне форума
Прохожий
 
Регистрация: 07.06.2009
Сообщения: 6
Репутация: 10
По умолчанию БД, Запрос на приход/расход, не получается задействовать несколько обьектов

Ребята помогите пожалуйсто доработать запрос на приход/расход. Не получается задействовать начальную дату, конечную дату и наименование товара.
Формулировка запроса: Вывести перечень прихода и расхода введённой складской еденицы за введёный период, подсчитав общее количество прихода, расхода и сумму остатка на складе.

БД весит более 97 кб поэтому не могу прикрепить её, а заливаю на дамп.
http://dump.ru/file/2857750
Ответить с цитированием
  #2  
Старый 07.06.2009, 18:30
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

ну во-первых: ехе-файлы в архивы никто не пакует.
во-вторых: в табл. "накладные" переименуй поле "Sum" - это слово является зарезервированным
в-третьих, сам код (так как спешил - мог чего-то не заметить ... но сама идея верная):
Код:
SELECT DISTINCT NK.N_naklad, NK.Data, NK.Kolvo_otpusk_tov, NK.Kolvo_prin_tov,
NK.Sum_NDS, NK.Sum_s_NDS, ORG.Nazv_org,
(SELECT COUNT(Kolvo_otpusk_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE 'Тапки домашние'
AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer) as kol_rashoda,
(SELECT COUNT(Kolvo_prin_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE 'Тапки домашние'
AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer AND kolvo_prin_tov>0) as kol_priem

FROM tovar TV, organiz ORG, nakladn NK

WHERE NK.Data between '20.06.1991' and '20.04.1992'
AND TV.Nazv LIKE 'Тапки домашние'
AND NK.Nomenkl_nomer = TV.Nomenkl_nomer
AND ORG.INN_org = NK.INN_org
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 08.06.2009, 02:33
kvadratnt kvadratnt вне форума
Прохожий
 
Регистрация: 07.06.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
ну во-первых: ехе-файлы в архивы никто не пакует.
во-вторых: в табл. "накладные" переименуй поле "Sum" - это слово является зарезервированным
в-третьих, сам код (так как спешил - мог чего-то не заметить ... но сама идея верная):
Код:
SELECT DISTINCT NK.N_naklad, NK.Data, NK.Kolvo_otpusk_tov, NK.Kolvo_prin_tov,
NK.Sum_NDS, NK.Sum_s_NDS, ORG.Nazv_org,
(SELECT COUNT(Kolvo_otpusk_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE 'Тапки домашние'
AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer) as kol_rashoda,
(SELECT COUNT(Kolvo_prin_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE 'Тапки домашние'
AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer AND kolvo_prin_tov>0) as kol_priem

FROM tovar TV, organiz ORG, nakladn NK

WHERE NK.Data between '20.06.1991' and '20.04.1992'
AND TV.Nazv LIKE 'Тапки домашние'
AND NK.Nomenkl_nomer = TV.Nomenkl_nomer
AND ORG.INN_org = NK.INN_org
Насчет екзешника и названия поля принял к сведению, спасибо за совет.

Твой вариант запроса конечно работает, но только "домашних тапок" и заданых тобой дат. А как сделать его более универсальным? Чтобы самому можно было задавать и начальную дату, и конечную дату, и наименование товара через выпадающие списки на форме №13?
Ответить с цитированием
  #4  
Старый 08.06.2009, 12:52
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

где-то так:
Код:
Query4.Close;
Query4.SQl.Text:='SELECT DISTINCT NK.N_naklad, NK.Data, NK.Kolvo_otpusk_tov, NK.Kolvo_prin_tov, '+
'NK.Sum_NDS, NK.Sum_s_NDS, ORG.Nazv_org, '+
'(SELECT COUNT(Kolvo_otpusk_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE "'+DBLookupComboBox2.Text+'" '+
'AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer) as kol_rashoda, '+
'(SELECT COUNT(Kolvo_prin_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE "'+DBLookupComboBox2.Text+'" '+
'AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer AND kolvo_prin_tov>0) as kol_priem '+
'FROM tovar TV, organiz ORG, nakladn NK '+
'WHERE NK.Data between "'+DateToStr(DateTimePicker1.Date)+'" and "'+DateToStr(DateTimePicker2.Date)+'" '+
'AND TV.Nazv LIKE "'+DBLookupComboBox2.Text+'" '+
'AND NK.Nomenkl_nomer = TV.Nomenkl_nomer '+
'AND ORG.INN_org = NK.INN_org';
Query4.Open;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #5  
Старый 11.06.2009, 01:05
kvadratnt kvadratnt вне форума
Прохожий
 
Регистрация: 07.06.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
где-то так:
Благодарю, но при нажатии на кнопку запрос ошибки всё время выдаёт. Мне кажется что что-то с кодом кнопки, только не могу понять что именно не так.
Код:
procedure TForm13.Button1Click(Sender: TObject);
begin
datamodule1.Query4.Close;
datamodule1.Query4.SQL.Clear;
datamodule1.Query4.SQL.Append('SELECT DISTINCT NK.N_naklad, NK.Data, NK.Kolvo_otpusk_tov, NK.Kolvo_prin_tov, NK.Sum_NDS, NK.Sum_s_NDS, ORG.Nazv_org, ');
datamodule1.Query4.SQL.Append('SELECT COUNT(Kolvo_otpusk_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE "'+DBLookupComboBox2.Text+'" AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer) as kol_rashoda, ');
datamodule1.Query4.SQL.Append('AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer) as kol_rashoda, ');
datamodule1.Query4.SQL.Append('(SELECT COUNT(Kolvo_prin_tov) FROM nakladn, tovar WHERE tovar.Nazv LIKE "'+DBLookupComboBox2.Text+'" ');
datamodule1.Query4.SQL.Append('AND nakladn.Nomenkl_nomer = tovar.Nomenkl_nomer AND kolvo_prin_tov>0) as kol_priem ');
datamodule1.Query4.SQL.Append('FROM tovar TV, organiz ORG, nakladn NK ');
datamodule1.Query4.SQL.Append('WHERE NK.Data between "'+DateToStr(DateTimePicker1.Date)+'" and "'+DateToStr(DateTimePicker2.Date)+'" ');
datamodule1.Query4.SQL.Append('AND TV.Nazv LIKE "'+DBLookupComboBox2.Text+'" ');
datamodule1.Query4.SQL.Append('AND NK.Nomenkl_nomer = TV.Nomenkl_nomer ');
datamodule1.Query4.SQL.Append('AND ORG.INN_org = NK.INN_org');
case form13.RadioGroup1.ItemIndex of
-1: showmessage('Выберите тип запроса');
0:
 begin
  datamodule1.Query4.SQL.Append('WHERE   (Nakladn.Kolvo_prin_tov > 0)');
  datamodule1.Query4.SQL.Append('AND  (Nakladn.Kolvo_otpusk_tov = 0)');
 end;
1:
 begin
  datamodule1.Query4.SQL.Append('WHERE   (Nakladn.Kolvo_prin_tov = 0)');
  datamodule1.Query4.SQL.Append('AND  (Nakladn.Kolvo_otpusk_tov > 0)');
 end;
2:
 begin
  datamodule1.Query4.SQL.Append('WHERE   ((Nakladn.Kolvo_prin_tov >= 0)');
  datamodule1.Query4.SQL.Append('OR  (Nakladn.Kolvo_otpusk_tov >= 0))');
 end;
end;
if form13.CheckBox1.Checked then
if form13.DBLookupComboBox1.Text<>'' then
begin
 datamodule1.Query4.SQL.Append('AND  (Organiz.INN_org = :p_inn)');
 datamodule1.Query4.ParamByName('p_inn').AsInteger:=form13.DBLookupComboBox1.KeyValue;
end;
datamodule1.Query4.Open;
end;

procedure TForm13.Button2Click(Sender: TObject);
begin
  form13.Hide;
  form1.show;
end;

procedure TForm13.Button3Click(Sender: TObject);
begin
form13.RvProject1.Execute;
end;
Ответить с цитированием
  #6  
Старый 11.06.2009, 12:14
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Так... Выжимаю из себя всё, что знаю по SQL.
1: LIKE в SQL используется с % (иначе теряет смысл)
Код:
select * from user where email like '%@mail.ru%'
2: Строки в SQL пишутся не в кавычках (") а в апострофах ('), а в Делфи для ввода апострофа нужно ввести их 2 подряд.
Код:
  ShowMessage (' '' '); //выведет '
Это пока всё, что заметил... Пробуй.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 11.06.2009, 13:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
2: Строки в SQL пишутся не в кавычках (") а в апострофах ('), а в Делфи для ввода апострофа нужно ввести их 2 подряд.
Спорное утверждение, т.к. и тот и другой вариант нормально обрабатываются.
А вот что действительно потенциальную ошибку может вызвать так это вот эта запись, особенно если база на Акцесе:
Код:
'WHERE NK.Data between "'+DateToStr(DateTimePicker1.Date)+'" and "'+DateToStr(DateTimePicker2.Date)+'" '+
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 11.06.2009 в 13:24.
Ответить с цитированием
  #8  
Старый 11.06.2009, 15:05
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А! А до меня допёрло. По case вы добавляете ещё один WHERE, а насколько я понял, надо писать AND. Хех, я смотрю, все ступили...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025