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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2015, 19:35   #1
MarcusAurelius
Пользователь
 
Регистрация: 11.09.2015
Сообщений: 12
По умолчанию Нужна помощь в решении задачи

1. Существует две таблицы: FIRM - организации, CITY - города.
В таблице FIRM есть поля FIRM.JUR_CITY_ID (не может быть пустым) для города юридического адреса и FIRM.POST_CITY_ID (может быть пустым) для города почтового адреса.
В таблице CITY есть поле CITY_ID (ИД записи). Все заполненные FIRM.JUR_CITY_ID, FIRM.POST_CITY_ID существуют в таблице FIRM.
Кроме этого в таблицах есть поля FIRM.NAME – название организации и CITY.NAME – название города


2. На первом этапе требуется построить SQL-запрос, который обеспечивал бы фильтрующий поиск информации по названию организации и по названиям городов почтового и юридического адреса. (Следует учесть, что поля могут заполняться в разных регистрах).


Вывод в Delphi, БД Access.
MarcusAurelius вне форума Ответить с цитированием
Старый 11.09.2015, 19:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Черновик:
Код:
select * 
from  FIRM join CITY on (
      (FIRM.JUR_CITY_ID=CITY_ID)
  or (FIRM.POST_CITY_ID=CITY_ID)
and (upper( CITY.NAME)='мегАсити')
)
where 
 upper(FIRM.NAME)='блэкмамба'
А вообще ИМХО маловато данных по структуре...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 19:53   #3
MarcusAurelius
Пользователь
 
Регистрация: 11.09.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Черновик:
Код:
select * 
from  FIRM join CITY on (
      (FIRM.JUR_CITY_ID=CITY_ID)
  or (FIRM.POST_CITY_ID=CITY_ID)
and (upper( CITY.NAME)='мегАсити')
)
where 
 upper(FIRM.NAME)='блэкмамба'
А вообще ИМХО маловато данных по структуре...
Спасибо!
По этой задаче сможете чем-то помочь? Они связаны между собой.
1. Существует таблицы: DOCUMENT – документы, FIRM – организации, CITY - города
В таблице DOCUMENT есть поля:
• DOC_DATE - дата документа.
• SUM - сумма документа.
• FIRM_ID – ИД организации из таблицы FIRM.
(Описание связок FIRM, CITY – смотри тест 1)

2. На первом этапе требуется построить SQL-запрос, который обеспечивал бы вывод в шахматном виде (табличном) просуммированной информации (SUM) таблицы DOCUMENT. Столбцами таблицы должны быть МЕСЯЦы документов, строками должны быть ГОДа документов.

Примерный вид таблицы:
Год Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
MarcusAurelius вне форума Ответить с цитированием
Старый 11.09.2015, 20:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... с потолка:
Код:
select
 Year(DOC_DATE)
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=1 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Январь
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=2 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Февраль
...
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=12 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Декабрь

from FIRM f
group by 1
Но точно могу тебе сказать, что такие вещи делаются репортами а не browse-ами запросов
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2015, 16:26   #5
MarcusAurelius
Пользователь
 
Регистрация: 11.09.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хм... с потолка:
Код:
select
 Year(DOC_DATE)
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=1 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Январь
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=2 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Февраль
...
 ,(select sum(SUM) from FIRM f2 where Month(DOC_DATE)=12 and Year(f2.DOC_DATE)=Year(f.DOC_DATE)) Декабрь

from FIRM f
group by 1
Но точно могу тебе сказать, что такие вещи делаются репортами а не browse-ами запросов
Прошу написать код более подробно, в частности с начала процедуры. Компонент: AdoQuery1. Некоторые вещи для Вас очевидны, для меня пока нет
MarcusAurelius вне форума Ответить с цитированием
Старый 13.09.2015, 16:50   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для начала в Акцессе создай запрос. В него закинь этот код. Выполни его. Если выполнится - можно использовать в Делфи. Если нет - придется изобретать другой запрос.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2015, 17:06   #7
MarcusAurelius
Пользователь
 
Регистрация: 11.09.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Для начала в Акцессе создай запрос. В него закинь этот код. Выполни его. Если выполнится - можно использовать в Делфи. Если нет - придется изобретать другой запрос.
В Access запрос выполняется, но поле результата пустое.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Для начала в Акцессе создай запрос. В него закинь этот код. Выполни его. Если выполнится - можно использовать в Делфи. Если нет - придется изобретать другой запрос.
Хотя нет, результат выводится. не могли бы Вы более подробно написать код для использования в Delphi?

Последний раз редактировалось Stilet; 13.09.2015 в 17:16.
MarcusAurelius вне форума Ответить с цитированием
Старый 13.09.2015, 17:17   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да код то прост:
Код:
With ADOQuery do begin
 sql.Text:='Select * from МойТотСамыйЗапрос'; Open;
end;
Где МойТотСамыйЗапрос - запрос в Акцессе, построенный из моего предложения выше.
Запросы в Акцессе создавать умеешь надеюсь? компоненты на форму в Длфи кинуть и подключить их к базе умеешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2015, 09:11   #9
MarcusAurelius
Пользователь
 
Регистрация: 11.09.2015
Сообщений: 12
Вопрос

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да код то прост:
Код:
With ADOQuery do begin
 sql.Text:='Select * from МойТотСамыйЗапрос'; Open;
end;
Где МойТотСамыйЗапрос - запрос в Акцессе, построенный из моего предложения выше.
Запросы в Акцессе создавать умеешь надеюсь? компоненты на форму в Длфи кинуть и подключить их к базе умеешь?
Благодарю за наставления! Получился следующий код:
Код:
SELECT year(document.doc_date) AS YEARS, 
sum(IIf(month(DOCUMENT.DOC_DATE)=1,DOCUMENT.SUMMA,0)) AS JANUARY,
sum(IIf(month(DOCUMENT.DOC_DATE)=2,DOCUMENT.SUMMA,0)) AS FEBRUAR,
sum(IIf(month(DOCUMENT.DOC_DATE)=3,DOCUMENT.SUMMA,0)) AS MARCH,
sum(IIf(month(DOCUMENT.DOC_DATE)=4,DOCUMENT.SUMMA,0)) AS APRIL,
sum(IIf(month(DOCUMENT.DOC_DATE)=5,DOCUMENT.SUMMA,0)) AS MAY,
sum(IIf(month(DOCUMENT.DOC_DATE)=6,DOCUMENT.SUMMA,0)) AS JUN,
sum(IIf(month(DOCUMENT.DOC_DATE)=7,DOCUMENT.SUMMA,0)) AS JULY,
sum(IIf(month(DOCUMENT.DOC_DATE)=8,DOCUMENT.SUMMA,0)) AS AUGUST,
sum(IIf(month(DOCUMENT.DOC_DATE)=9,DOCUMENT.SUMMA,0)) AS SEPTEMBER,
sum(IIf(month(DOCUMENT.DOC_DATE)=10,DOCUMENT.SUMMA,0)) AS OKTOBER,
sum(IIf(month(DOCUMENT.DOC_DATE)=11,DOCUMENT.SUMMA,0)) AS NOVEMBER,
sum(IIf(month(DOCUMENT.DOC_DATE)=12,DOCUMENT.SUMMA,0)) AS DECEMBER
FROM DOCUMENT
GROUP BY year(DOCUMENT.DOC_DATE);
Теперь задача в следующем: ограничить документы по организациям с помощью ComboBox. Установлена связь в таблицах DOCUMENT и FIRM по FIRM_ID. Т.е. нужно сделать фильтрацию по FIRM_NAME.

Последний раз редактировалось MarcusAurelius; 14.09.2015 в 09:19.
MarcusAurelius вне форума Ответить с цитированием
Старый 14.09.2015, 09:45   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
IIf(month(DOCUMENT.DOC_DATE)=1,DOCU MENT.SUMMA,0)
Красиво. Я бы не догадался.
Цитата:
ограничить документы по организациям
Ну тут я не в курсе как Акцесс с параметрами в представлениях танцует, поэтому вынес бы (ИМХО) этот запрос всетки в Делфи, и закатал бы параметр отсева по фирме.
Код:
With ADOQuery do begin
 sql.Text:='SELECT year(document.doc_date) AS YEARS,'; 
 sql.add('sum(IIf(month(DOCUMENT.DOC_DATE)=1,DOCUMENT.SUMMA,0)) AS JANUARY,');
 ...
 sql.add('sum(IIf(month(DOCUMENT.DOC_DATE)=12,DOCUMENT.SUMMA,0)) AS DECEMBER');
 sql.add('FROM DOCUMENT GROUP BY year(DOCUMENT.DOC_DATE) where FIRM_NAME=:FN');
 Parameters.ParamByName('FN').Value:=ComboBox.Text;
 Open;
end;
В обшем примерно в таком ключе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в решении задачи на C(Си). Pug_from_Mordor Помощь студентам 4 10.11.2014 12:12
С++ Builder6 - Нужна помощь в решении задачи Udji C++ Builder 1 10.04.2014 21:21
Нужна помощь в решении задачи HeaD90 Помощь студентам 0 02.05.2009 18:47
нужна помощь в решении задачи! Elusive Devil Помощь студентам 2 22.03.2009 16:17