|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.08.2013, 20:03 | #1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
БД и календарь
Доброго времени суток!
С БД работал не очень много, потому мало чего умею. Дали задание, создать табель сотрудников: Отображается список сотрудников по вертикали, по горизонтали дни месяца. В каждом дне юзер выбирает ячейку у в таблице и указывает состояние: 0 - не был 1 - был 2 - не известно В зависимости от состояния, ячейка красится в цвет. База данных MS SQL Server или MS Access. Как это реализовать? Я выбрал MS Access. Создал базу данных, 2 таблицы: В первой Workers поля: Поле счетчик ID, ключ без повторов Поле ФИО FIO Вторая таблица Calendar: Числовое поле ID, не ключ Поле даты D Поле состояния S Связал таблицы: От Workers.ID, к Calendar.ID, связью "Один ко многим". Сохранил в Access 2000-2003 MDB формате. Теперь программа: Кинул DBGrid, ADOConnction, DataSource, ADOTable, ADOQuerty В ADOConnection указал провайдера Jet DB 4.0 ADO Provider, и путь к файлу БД. Запретил запрос логина и пароля и поставил Connected в True. В ADOTable указал ADOConnection, выбрал таблицу Workers, выставил Active в True. В DataSource выбрал ADOTable, выставил Active=True. В DBGrid указал DataSource В ADOQuerty указал ADOTable. При запуске программы DBGrid отображает содержимое моей таблицы. Но вот дилема: 1. Отображается колонка Workers.ID, я её в Run-time убираю так: Код:
2. Имена колонок "стремные", переименовываю так: Код:
3. На форму есть TDateTimePicker, юзер может выбирать месяц и год, который хочет посмотреть. Пользуясь DaysInMonth функцией я узнаю сколько дней в выбранном месяце. Мне надо перестроить таблицу, т.е. по горизонтали динамически выставить от 1 до <дней в месяце> колонки и так же пронумеровать, а затем синхронизировать с Workers.FIO и отобразить данные в соотв. с выбранным месяцем, т.е. по каждому из Workers.FIO визуально выдать кто, когда был/не был. Как добавить это "временные колонки" в run-time? Далее, как перебрать все Workers.ID и по ним сделать запрос в таблицу Calendar, для выборки периода между 2 датами? Вроде бы все. Правильно ли я понял и реализовал задачу, может есть проще вариант? |
16.08.2013, 20:12 | #2 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
16.08.2013, 20:31 | #3 | ||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Цитата:
Кинул я ещё 1 ADOTable, указал ему таблицу Calendar. Теперь основываясь на связи Workers.ID с Calendar.ID, мне надо для каждой записи Workers.ID сделать выборку указанного промежутка времени(01.08.2013-31.08.2013) и все найденные даты визуализировать в DBGrid. Собственно как это сделать? В таблице должно отображаться кол-во дней в месяце по горизонтали 100%, но как? Вертикаль берется из таблицы Workers а горизонталь из таблицы Calendar, как из связать и обработать? |
||
16.08.2013, 20:59 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
При такой структуре для отображения табеля в гриде ADOTable не помощник. Нужно запросом выбирать, транспонируя данные из таблицы Calendar. Кстати в ACCESSE по-моему есть конструктор для перекрестных запросов, но никогда не пользовался им
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
16.08.2013, 21:16 | #5 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Заменяю DBGrid на обычный Grid. Как мне руками перебирать данные таблиц и вставлять в мой Grid? |
|
16.08.2013, 21:39 | #6 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
Почитайте про кросс-таблицы, там всё достаточно просто, одна таблица связи на большинство случаев жизни - и запросы простые, и скорость высокая
|
16.08.2013, 22:31 | #7 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
17.08.2013, 00:43 | #8 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Но как добавить свои колонки если реальных данных в DB нет? При запуске ПО из БД берутся ФИО и записываются в колонку ФИО, и все вроде бы шоколадно, но если я пытаюсь добавить свои колонки: Код:
Как лечить? Почитал про перекрестные запросы - пока рано для меня. |
|
17.08.2013, 00:49 | #9 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,896
|
Цитата:
|
|
17.08.2013, 02:00 | #10 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
northener, плюсую. Помогли. Я добавил Field к DBGrid.Columns и добавление в Run-time заработало совместно с тек. полями в БД.
Теперь вопрос другой, надо отобразить данные БД в таблице, визуально. Как перебрать все Workers и получить их ID и для каждого сделать выборку по выбранному месяцу и году, и получить дни? Вот я в MS access наклепал запрос: Код:
месяц и год совпадают с указанной датой в DateTimePicker. Как перебрать всех пользователей? Может цикл какой есть? Пробую так: Код:
Если да, то это очень хорошо, и как мне обращаться с результатом запроса? Если нет, то как быть? Последний раз редактировалось Человек_Борща; 17.08.2013 в 02:27. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Календарь | sid1868 | Общие вопросы Delphi | 1 | 04.05.2011 19:55 |
Календарь | sid1868 | Помощь студентам | 1 | 04.05.2011 19:16 |
БД и календарь | torrtik | БД в Delphi | 2 | 10.04.2011 19:14 |
Календарь | krikaved | Общие вопросы Delphi | 2 | 25.03.2010 22:58 |
Календарь | ruavia3 | Microsoft Office Excel | 6 | 16.04.2009 15:32 |