Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите спроектировать таблицы, работа с датами. / 6 сообщений из 6, страница 1 из 1
01.04.2012, 15:00
    #37733489
Sobart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
Создается БД на MySQL, интерфейс пишется на Delphi 2009 с использованием ZEOS 7.0.0.
Подскажите, как организовать таблицы в БД, чтобы для пользователя информация выводилась в виде как в прикрепленном файле?

* №автомобиля, ФИО берутся из справочников
* Номер смены должен проставляться пользователем и заноситься в БД
* Столбец «Отработано» рассчитывается, исходя из справочника (Смена; Кол-во часов)

1) Главный вопрос как сделать поля, в которые проставляется смена, так чтобы таблица содержала только числа следующего месяца(т.е. в разное время то 30, то 31 то 28 столбцов)
2) Как хранить занесенные в таблицу значения смен на каждую дату с учетом необходимости различных расчетов по строке и по столбцу?
3) Как в таком случае лучше сделать таблицы и связи между ними?
...
Рейтинг: 0 / 0
01.04.2012, 15:30
    #37733510
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
Sobart1) Главный вопрос как сделать поля, в которые проставляется смена, так чтобы таблица содержала только числа следующего месяца(т.е. в разное время то 30, то 31 то 28 столбцов)
никаких "30, то 31 то 28 столбцов" ! - таблица должна быть {id_кого-то-там,дата,отработано}

свою красивую таблицу, затем будеш получать запросом с
Код: sql
1.
2.
3.
4.
sum(case when day(дата)=1 then отработано end) as отработано_1ого,
sum(case when day(дата)=2 then отработано end) as отработано_2ого,
...
group by id_кого-то-там


Sobart3) Как в таком случае лучше сделать таблицы и связи между ними?
ты бы, чтоле, описал задачу, сначала ...
...
Рейтинг: 0 / 0
01.04.2012, 15:33
    #37733512
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
Sobart интерфейс пишется на Delphi 2009 с использованием ZEOS 7.0.0.Это не важно
Sobart №автомобиля, ФИО берутся из справочников
Код: sql
1.
2.
create table cars (car_id int primary key, car_nuber varchar(10))
create table drivers (driver_id int primary key, driver_name varchar(50))


Так же в справочнике должны быть номера смен.
create table work_shift(work_shift_id, work_shift_name varchar(10))
С отпуском выходными есть два подхода быстрый и правильный.
Правильный - создаем дополнительный справочник причин не выхода наработу
create table no_wokring_reason(no_wokring_reason_id int,no_wokring_reason_descr varchar(20))
и требуем (путем check ограничения) чтобы заполнено (было не null) только одно поле work_shift_id или no_wokring_reason_id
Быстрый способ это добавление в work_shift специальных смен - отпуск, больничный, выходной и т.п. Для маркировки их (work_shift_id) можно сделать отрицательными или добавить специальный флажок.

Sobart Как хранить занесенные в таблицу значения смен на каждую дату с учетом необходимости различных расчетов по строке и по столбцу?
Код: sql
1.
create table work(work_id int primary key, car_id references cars, driver_id references drivers, work_shift_id references work_shift, work_date date references calendar)



Sobart как сделать поля, в которые проставляется смена, так чтобы таблица содержала только числа следующего месяца(т.е. в разное время то 30, то 31 то 28 столбцов)Транспонируя запрос к work. Как это сделать ищите по форуму. Вам придется придумать что ставить в пропуски (если какого либо числа, первого января например, никто не ездил) для этого стоит завести таблицу календарь и заполнить ее всеми датами подряд
Код: sql
1.
create table calendar(work_date date primary key)
...
Рейтинг: 0 / 0
01.04.2012, 15:49
    #37733528
Sobart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
SERG1257,

Спасибо, очень масштабно все объяснили :) Скоро проверю как оно будет.
...
Рейтинг: 0 / 0
02.04.2012, 01:47
    #37734023
Sobart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
qwerty112, SERG1257

Спасибо Вам, Таблицы организовал как писал SERG1257, а вывод в форму пользователя с помощью запроса, похожего на предложенный qwerty112-м:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  case when day(calendar.work_date) = 1 then work_shift.work_shift_id end AS `1`,
  case when day(calendar.work_date) = 2 then work_shift.work_shift_id end AS `2`,
....
  drivers.driver_name,
  cars.car_number
FROM
  work
  ....
  INNER JOIN calendar ON (work.work_date = calendar.work_date)

Наверное, если этот запрос немного доделать, то можно будет при необходимости динамически избавляться от 31 числа, изменяя только таблицу calendar.
В SQL пока не силен, но с Вашим форумом все просто. Надеюсь, в скором времени таких глупых вопросов задавать не буду.
...
Рейтинг: 0 / 0
02.04.2012, 05:24
    #37734046
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите спроектировать таблицы, работа с датами.
Нет запрос должен быть
Код: sql
1.
2.
3.
select ....
from calendar c
left join work w on c.work_date=w.work_date

Суть в том, чтобы позиция была даже если никакой активности в этот день не было.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите спроектировать таблицы, работа с датами. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]