Форум: "Базы";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизПомогите огранизовать структуру бд. Найти похожие ветки
← →
michael_b (2002-08-27 13:10) [0]Помогите огранизовать структуру бд. Бд должна содержать, к которой можно бы было получить следующую таблицу:
|январь |февраль |......|декабрь | |1|2|3|....|31|1|2|..|30|......|1|2|....|31|ср. балл|
где |1|2|3|...|31| чила в месяце в этих столбцах должны храниться целые одно разрядные числа. Последний солбец (ср. балл)должен содержать
среднее значение за каждое число каждого месяца.
Я хочу спросить неужели для каждого числа в месяце нужно заводить свой столбец
Их ведь тогда с января по май будет огромное кол-во. Может как нибудь по-другому?!
← →
Jeer (2002-08-27 13:15) [1]Ты лучше задачу с нуля опиши.
А там уж как нибудь и совет получишь.
← →
Mick (2002-08-27 13:38) [2]сделай две связанные таблицы Месяцы и Дни.
← →
Alexandr (2002-08-27 13:47) [3]то, что тебе нужно называется перекрестные таблицы и к СУБД не относится, а формируется на клиенте.
← →
MsGuns (2002-08-27 14:51) [4]Не надо путать 2 очень разные вещи: физ.структура БД и визуальные средства работы с ней.
В данном случае БД должна иметь след.вид:
Таблица Ocenka Содержит динамику податно
------------------
Год, Месяц, Дата, ФИО (т.е. к кому относится оценка) - все ключи, оценка, ну, может, еще предмет (тогда тоже ключом бы надо).
Пример
2002 09 1.09.02 Иванов - (нет оценки)
2002 09 1.09.02 Петров 4
2002 09 2.09.02 Иванов 5
2002 09 2.09.02 Петров 3
...
2002 09 30.09.02 Иванов 2
2002 09 30.09.02 Петров -
Таблица Itogi (Master) - содержит ср.оценку за месяц
Год, Месяц, Дата, ФИО (т.е. к кому относится оценка) - все ключи, оценка, ну, может, еще предмет (тогда тоже ключом бы
2002 09 Иванов 3
2002 09 Петров 4
В форме же можно организовать DBCtrlGrid с числом сегментов = кол-ву записей (дней) в месяце. Можно, конечно, сделать крутой запрос и в возвращаемом НД организовать кол-во колонок по числу дней, но на фига накие выкрутасы ?
← →
michael_b (2002-08-28 09:06) [5]
> Можно, конечно, сделать крутой запрос и в возвращаемом НД
> организовать кол-во колонок по числу дней, но на фига накие
> выкрутасы ?
В том то и дело что это нужно. Не подскажите как?
← →
ЮЮ (2002-08-28 09:34) [6]>в этих столбцах должны храниться целые одно разрядные числа
>среднее значение за каждое число каждого месяца.
Что усреднять-то, одну ячейку?
>В том то и дело что это нужно. Не подскажите как?
Зачем это нужно? Записи Запроса, в принципе, не модифицируются, сл-но DBGrid ни к чему. Результаты запроса последовательно считаешь (построчно) и запишешь в нужные ячейки, например, StringGrida
← →
MsGuns (2002-08-28 11:42) [7]"Крутой запрос"
Имеется в виду запрос, который превращает строки исходной таблицы в столбцы результирующей. В Paradox эта мулька называлась CrossTab. В Дельфях я с такой возможностью не знаком, поэтому делаю ручками: Создаю массив-таблицу в памяти, туда в цикле заношу информацию из исх.таблицы, которая просматривается в нужном диапазоне ключей (скажем, в пределах месяца), затем по полученной структурной инф-ции массива в памяти (кол-во стабулированных колонок) создаю временную таблу, куда и сбрасываю все из памяти Append`ом. Врем.таблицу закрываю и уже оттуда переношу что надо, например, в соотв.отчет.
Такой алгоритм часто-густо используется при печати разных бухгалтерских журналов - там от этого не уйти. Но зачем делать так в экранной форме - я не пойму.
← →
michael_b (2002-08-28 12:50) [8]
> Такой алгоритм часто-густо используется при печати разных
> бухгалтерских журналов - там от этого не уйти. Но зачем
> делать так в экранной форме - я не пойму.
В том то и дело что нужно делать так в экранной форме. Экранная форма должна иметировать страницу школьного журнала с оценками.
|январь |февраль |......|декабрь | |1|2|3|....|31|1|2|..|30|......|1|2|....|31|ср. балл|
Нельзя ли такое сделать например в QuantumGrid
← →
ЮЮ (2002-08-28 13:37) [9]Тогда Это только 33 столбика:
ФИО (или ID школьника), Месяц (Или 1-е число месяца как TDate) и 31 столбик для каждого дня месяца. Такую таблицу отобразит любой DBGrid ^-)
← →
MsGuns (2002-08-28 14:40) [10]>ЮЮ
>Такую таблицу отобразит любой DBGrid
При условии, конечно, что табла имеет столько полей, т.е. построена "горизонтально". Для формы (грида) это может быть и удобно, но для выборок - полный отстой. Как, например, Вы планируете из такой таблицы извлечь показатель средней успеваемости или среднюю оценку по географии всех мальчиков ?
← →
MsGuns (2002-08-28 14:42) [11]>ЮЮ
>Такую таблицу отобразит любой DBGrid
К сведению: Показатель средней успеваемости не есть
Сумма всех средних успеваемостей / кол-во учеников, но
Сумма всех оценок всех учеников / кол-во всех оценок
← →
michael_b (2002-08-28 14:57) [12]
> ЮЮ © (28.08.02 13:37)
> Тогда Это только 33 столбика:
> ФИО (или ID школьника), Месяц (Или 1-е число месяца как
> TDate) и 31 столбик для каждого дня месяца. Такую таблицу
> отобразит любой DBGrid ^-)
А как тогда отобразить в гриде оценки не за один а за несколько месяцев?
← →
michael_b (2002-08-28 23:08) [13]Неужели, всемогущий QuantumGrid не может отображать перекрестные таблицы?
← →
ЮЮ (2002-08-29 02:51) [14]QuantumGrid, всё же,наверное отражает DataSourse,
а Запрос должен 30 раз сделать Left Join чтобы получить "перекрестную таблицу"
>А как тогда отобразить в гриде оценки не за один а за несколько месяцев?
Связать с помощью Left Join
>Вы планируете из такой таблицы извлечь показатель средней успеваемости или среднюю оценку по географии всех мальчиков ?
Выбрать всех мальчиков по географии и обработать выборку на клиенте или в ХП.
Я не утверждаю, что такой способ лучше, но уж очень хочется автору увидеть журнал в DBGride, а не в StringGride.
← →
Виталий Панасенко (2002-08-29 08:57) [15]Вообще-то, мне сдается, тут лучше использовать поля типа массив
← →
grosh (2002-08-29 14:08) [16]мне кажется, что тут путаются две вещи реальное представление журнала и электронное отображение.
Судя по вопросу
>А как тогда отобразить в гриде оценки не за один а за несколько месяцев?
следующим будет а как эти месяцы листать
Для начала небходимо понять что необходимо вводить.
Затем какую статистику получать.
Чаще всего после того как это будет сделано вопрос отображения всего журнала отпадет сам собой...
а если это всетаки необходимо, то можно сделать следующим образом
База
1 таблица Ученики
Id_Children - идентификатор
LastName - Фамилия
FirstName - Имя
MiddleName - Отчество
Birthday - Дата рождения
2 таблица Классы
ID_class - Идентификатор
NameClass - Цифра и Буква класса
firstYear - Год начала класса например 1999-2000
firstYear - Год окончания класса
3 таблица связка классов и людей
ID_class - Внешний ключ
Id_Children - Внешний ключ
4 таблица Оценки
Id_grade - Идентификатор
ID_Children - Внешний ключ
subject - предмет
Value - оценка
Date - дата оценки
Таблица учеников необходима для того, чтобы через год не пришлось эти-же людей забивать еще раз
Таблица Классов необходима для того, чтобы велась история каждого человека не только по датам, но и по классам, чаще всего это необходимо.
Таблица связки необходима для связки
← →
grosh (2002-08-29 14:11) [17]Забыл... предметы тоже выносятся в отдельную таблицу :))))
← →
michael_b (2002-08-30 11:32) [18]
> grosh (29.08.02 14:08)
Большое спасибо все понял.
Только возникла другая проблема: в поле оценки может быть не только оценка, а еще буква н (отсутствовал). Возникает вопрос какого типа его сделать, чтобы потом ср. балл и все такое удобно считать?
← →
grosh (2002-08-30 11:56) [19]> michael_b
Тут есть несколько решений
1) под Буквенные отметки как-то Н - небыл, б - болел и т.д.Огранизуется отдельное поле типа WarChar (MS SQL) (символьное)
2) Для всех отметок, в том числе и буквенных создается одно поле типа int (MS SQL) (целочисленное) и в него записывается не значение а код символа и потом по коду вычисляется значение..
3) для всех отметок создается поле типа WarChar (MS SQL) (символьное)
Отличие всех этих методов только в интерфейсной реализации
для вар 1 тебе будет необходимо после ввода значения анализировать что это буква или цифра
для этого например можно использовать конструкцию
try
except
end; // try..except
тоже для третьего, но там анализ на значение производится только при вычислении средних величин.
Пример 1
поле А типа TEdit
может содержать как буквы, так и цифры
имеются некие промежуточные переменные
s : String;
i : integer;
a.text := 4;
i := 0;
s := "";
Try
i := strtoint(a.text);
except
S := a.text;
end; // try..except
т.к. функция strtoint не вызвала ошибку, то
i = 4
s = ""
a.text := а;
i := 0;
s := "";
Try
i := strtoint(a.text);
except
S := a.text
end; // try..except
т.к. функция strtoint вызвала ошибку, то
i = 0
S = 4
Либо можно использовать переменную типа variant
v : Variant;
V := a.text;
case VarType (V) of
varInteger : Some CODE Here ;
varString : Some CODE Here;
else ;
end; //case..else
Боле подробное описание функции VarType есть в справке Delphi
В общем как данную проблему нужно решить нужно думать самому
← →
grosh (2002-08-30 12:14) [20]И еще для более рациональной обработки данных лучше всего построить объектную модель и потом ее реализовывать.
в данном случае есть насколько я вижу 5 объектов
1) Ученик
2) Класс
3) Оценка
4) Предмет
Они все могут наследоваться скажем от некоевого TAbstractClass
у которого будет свойство
Id - integer
и методы
Assign(item)
Clear;
Compare(item)
затем все объекты последовательно описываются
В общем это все есть в книгах по ООП, если возникнут вопросы лучше пиши на е-майл т.к. писать в форуме это не имеет смысла.. :)))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.012 c