Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-60945
Mars
2002-08-28 11:22
2002.09.19
Как отследить изменение текущей записи в БД?


1-61147
Zmei-Gorin
2002-09-06 18:45
2002.09.19
CreateProcess???


3-61013
lejik
2002-08-10 21:48
2002.09.19
Программное отключение от базы


3-60985
koks
2002-08-28 16:30
2002.09.19
ключи...


6-61236
Jorchick
2002-07-13 21:27
2002.09.19
Имя компьютера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский