Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Создание DBGrid'a из нескольких таблиц


Автор: ParaNO1k 14.6.2009, 18:35
Доброго времени суток, Уважаемые Формучане!
Использую базу Acceess 2003.
Доступ через ADO.
Проблему немогу решить уже долгое время, есть несколько связанных таблиц, рисунок БД прилагается.
Необхомо в DBGrid'е вывести список всех учащихся (но желательно определенного класса (хотя это уже решил)) и поля для выбора даты (выбирается отдельно и заносится для всех учащихся), номера уроков (так же выбираются отдельно и заносятся для всей группы), предметов (аналогия с ранее сказанным) и оценок (необходимо сделать для всех учащихся отдельно).
Суть проблемы в том, что не получается сделать весь список класса, с пустыми полями для оценок. Получалось либо повторение данных, либо только те учащиеся, которые уже есть в таблице "jurnal".
Заранее Спасибо!

Автор: Keeper89 14.6.2009, 18:51
Покажите формат вывода данных, т.е. в каком виде вы хотите видеть "весь список класса, с пустыми полями для оценок".

Автор: ParaNO1k 14.6.2009, 19:01
Планировал выводить все в DBGrid'е или DBGridEh'е, выглядеть это должно вот так:

Фамилия      |    Имя          | Оценка  |
---------------------------------------------- |
Сидоров      |  Алексей      |       3      |
Иванив         |  Иван          |               |
Любых         |  Настя          |               |
и тд.
По хорошему поле "Оценка" LookUp поле из таблицы.

Автор: Romikgy 14.6.2009, 19:05
а оценка одна же на предмет или усредненая нужна?

Автор: ParaNO1k 14.6.2009, 19:08
Оценка идет 1, на предмет, на урок и на конкретный день для учащегося.
Это сдаланно для того чтобы после, можно было сделать распечатку отчета, в котором будут указываться промежутки дат, предметы и оценки за это время для класса.

Автор: Romikgy 14.6.2009, 19:11
возможно что то типа такого 
Код

select uch.fam , uch.name, ocenka.ocenka
from jurnal, uch, ocenka
where uch.id_uch=jurnal.id_uch and jurnal.ocenka=ocenka.id;

а вообще БД саму прикрепи ...

Автор: ParaNO1k 14.6.2009, 19:19
Цитата(Romikgy)

возможно что то типа такого

Идия то хорошая и мною разобранная вдоль и поперек, но... главная проблема, что мне необходимо выбирать учеников конкретного класса...:(
Ученики ссылаются на класс при помощи поля id_node в таблице uch и если пытаться сортировать учащихся по классу, то остаются только те поля которые заполнены в таблице jurnal...
В БД, в запросах можешь посмотреть кое какие попытки решить эту проблему...
Отвечаю заранее на вопрос, почему имеется такой код
Код

uch.id_node=1 (или 3)

Это сделанно потому что в Delphi  программно будет указываться номер класса, чтобы выбирались учащиеся этого класса, а не все учащиеся.

Автор: Romikgy 14.6.2009, 19:34
еще раз , как хочется получить результат , можешь показать ?

Автор: ParaNO1k 14.6.2009, 19:45
Я уже писал%)

|Фамилия      |    Имя          | Оценка |
|----------------------------------------------|
|Сидоров      |  Алексей     |       3      |
|Иванов        |  Иван          |               |
|Любых         |  Настя         |               |
|и тд.

По хорошему поле "Оценка" LookUp поле из таблицы.
Как ещё это изобразить на форуме я не знаю...
З.Ы. Отображать нужно учащихся определенного класса, который будет выделен!

Чтото пришла такая мысль: а что если выводить всех учащихся, но перед тем как они появятся, в гриде скрывать тех кто не относится в выбранному классу...
Тогда пролбема получается как скрывать строки с ненужными учащимися  smile 

Автор: Romikgy 14.6.2009, 19:50
Цитата(ParaNO1k @  14.6.2009,  18:19 Найти цитируемый пост)
что мне необходимо выбирать учеников конкретного класса.

тогда это к чему?

Автор: ParaNO1k 14.6.2009, 19:54
Эм... такая система, в Delphi  есть TreeView в котором отображается список класса, при выделении какого-либо класса, берется его ID.
После выделении класса отображается DBGrid с таблицей, в которой должны отображатся список класса и выбор оценок для каждого учащегося.
Отдельно имеются кнопки для выбора предмета, номера урока и даты.

Автор: Romikgy 14.6.2009, 20:03
Код

SELECT uch.fam, uch.name, ocenka.ocenka
FROM uch, jurnal, ocenka
where
jurnal.id_uch=uch.id_uch and jurnal.ocenka=ocenka.id
order by uch.fam
;


так ?

Добавлено через 2 минуты и 35 секунд
или
Код

SELECT uch.fam, uch.name, ocenka.ocenka
FROM uch, jurnal, ocenka
where
jurnal.id_uch=uch.id_uch and jurnal.ocenka=ocenka.id 
and uch.id_node=2
order by uch.fam
;


and uch.id_node=2 это для выбора по классу

Автор: ParaNO1k 14.6.2009, 20:28
Сорри, но не то :(
Он все равно делает выборку из тех учащихся которые занесены в таблицу jurnal, а нужно чтобы он брал учащихся из класса, а потом уже заносил в эту таблицу, когда проставлены оценки.

Автор: Romikgy 14.6.2009, 21:39
Цитата(ParaNO1k @  14.6.2009,  19:28 Найти цитируемый пост)
Он все равно делает выборку из тех учащихся которые занесены в таблицу jurnal, а нужно чтобы он брал учащихся из класса, а потом уже заносил в эту таблицу, когда проставлены оценки.

не понял ((

Автор: ParaNO1k 14.6.2009, 21:54
Эх... почему мозги у меня не так работают?! :(
Ладно, поробую тогда так: в ДБГрид, надо сделать список класса, класс формируется по значению ид_ноде в таблице уч. Так же напротив каждого учащегося надо сделать выпадающий список с оценкой, которой он получил(ит).
Может быть станет понятнее, если увидишь форму...
На кнопки добавить день и урок, не обращая внимания, толку от них пока все равно ни какого...
В зависимости от выбранного дня формируется подобная форма, на ней отображаются номера уроков, предмет который был выбран в соответствии с уроком, в ДИБГрид появляется список ВСЕХ учащихся ЭТОГО КЛАССА. Нужно чтобы ещё справа от списка учащихся появлялось ЛукАп поле с выбором оценки учащемуся, при нажатии кнопки сохранить, данные сохранялись в таблицу jurnal.
Пока для вывода списка использую:
Код

SELECT id_uch, fam, name
FROM uch;

Автор: ParaNO1k 15.6.2009, 15:01
Часть проблемы решена, для того чтобы отображать данные из таблицы jurnal использую код предложенный Romikgy
Код

SELECT uch.fam, uch.name, jurnal.ocenka
FROM uch, jurnal
WHERE jurnal.id_uch=uch.id_uch and uch.id_node=3
ORDER BY uch.fam;

Только с той поправкой, что была изменена база: были удалены связи таблицы jurnal с таблицами predmet и ocenka.
Используя следующий код добавляю всем учащимся класса, дату и номер урока:
Код

INSERT INTO Jurnal ( id_uch, data, nom_uroka, predmet, ocenka )
SELECT id_uch, Format("12.12.2009","mm\/dd\/yyyy\"), 1, "??", ""
FROM uch
WHERE id_node = 3;

Где за место вопросиков будет ставится предмет, но в виде текстового поля, так как он будет указываться во время создания урока в какую то дату. А оценка будет добавлятся позже отдельно, так же как текст (убрал связи).
Теперься такая проблема, как сделать выпадающий список оценок, чтобы заносились не ID поля, а его текстовку, потому что связи пришлось убрать...

Автор: Romikgy 15.6.2009, 16:17
ParaNO1k, у тя много оценок будет  ? имхо проще выбросить эту табл и писать цифры напрямую,
по просьбе, кидай комбобокс , и заполняй его из БД текст как текстовые оценки , объекты как ид текстовой оценки (юзая AddObject)

Автор: ParaNO1k 15.6.2009, 16:27
Оцени 1..5 + Н, того 6, я бы с удовольствием, всё выкинул, но нельзя... ещё немного осталось smile
Попробую, а можно в DBGrid или DBGridEh как нить реализовать LookUp поле из уже готовых значений (программно забить эти оценки), чтобы они не брались из БД, тем самым облегчить себе работу и  лишний раз не юзать БД?

Автор: Romikgy 15.6.2009, 16:31
Цитата(ParaNO1k @  15.6.2009,  15:27 Найти цитируемый пост)
реализовать LookUp 

низнаю насчет этого , я вообще пытался не юзать компоненты из db кучи 

Автор: ParaNO1k 15.6.2009, 16:35
Хорошо, поробую, как сделаю/не сделаю отпишусь! smile 

Автор: flomaster 16.6.2009, 02:08
Вы хотите сделать Пустую страницу (шаблон) Журнала, наподобие как в Екселе?
Чтобы учитель, открыв Вашу таблицу проставлял оценки?
Либо надо добавлять каждый день на каждого ученика по каждому предмету пустую запись, и ее редактировать в гриде, либо иметь  гемор с редактированием через ДБГрид несуществующих еще записей.
Код

//Готовим шаблон на новый день по всем предметам и ученикам
 INSERT INTO jurnal (PredmetID, id_uch, UchDate )
 SELECT Predmets.PredmetId, uchs.id_uch, Date() 
 FROM Predmets, Uchs;

Дальше как обычно делаем датасет, открываем редактируем...
Только указывайте соответствующие условия (ParamClass и ParamPredmet)
Код

Select ... from Uchs inner join jurnal ON uchs.id_uch = jurnal .id_uch
WHERE (uchs.id_node =:ParamClass and jurnal.PredmetID= :ParamPredmet);


Рекомендую изменить название поля Date, т.к. будут неудобства в дальнейшем.
Полям jurnal.predmet и predmet.id дать одно название напр, в [PredmetId] и т.д.
К слову, использование одинаковых названий для полей и таблиц ведет к путанице в голове. 
Удобно для таблиц как название использовать существительное множественного числа, для поля - единственного числа.
Применение таблицы "Оценка" - вообще бессмысленно, если Вы планируете там указывать цифровые обозначения оценок.

Для использования поля подстановки его нужно создать дизайнером в ДатаСете.
В гриде оно появится автоматом.

Автор: ParaNO1k 16.6.2009, 06:46
Спасибо за предложенную идею, но данную часть задачи я уже решил, почти аналогичным способом, написанную ранее (или выше, в начале страницы)).
Сейчас у меня проблема с созданием отчета для вывода на печать...
Необходимо выводить в ДБГрид(Ех) (или ещё куданить откуда можно распечатать без особых проблем), следующие очеты:
1) список учащихся, а так же предметы и уроки с оценками за определенный промежуток времени; (наверное придется отказаться, слишком тяжело на вывод и не удобно в печати из-за возможного большого кол-ва данных)
2) список учащихся и оценки по конкретному предмету за промежуток времени;
3) для каждого учащегося отдельный отчет, в котором за промежуток времени указываются предметы и оценки. (самый распространеный отчет, который будет чаще всего использоваться)
В книге Excel на каждой странице я отобразил примерно как это должно выглядеть.
лист 1: ParamPredmet - отображает название предмета и в это поле заносятся все оценки по этому предмету за промежуток времени;
лист 2: Data1 - зачем я её поставил не понял, поэтому можно отказаться и просто выводить оценки сплошником;
лист 3: ничего особенного не заметил.
З.Ы. Все что выделенно синим, в это место необходимо вставлять оценки  smile 

Автор: flomaster 16.6.2009, 22:53
При изменении региональных настроек полезут грабли.
Изучайте запросы с параметрами. Dataset.Parameters
Только это избавит вас от головняка с передачей дат в запрос.

Автор: ParaNO1k 17.6.2009, 06:21
Эм... проблем с датами нет и возникнуть не должно... лист 2: Data1 просто указывает дату когда была проставленна оценка...
Сейчас парю мозг над тем как скинуть данные в Excel, если есть хорошие ссылки по этой информации поделитесь плиз... Заранее спасибо!

Автор: flomaster 17.6.2009, 12:16
http://www.delphikingdom.com/asp/search.asp
Есть статья про Excel и БД. Называется "Excel ЧаВо..." в пяти частях.
Найдется по "Excel  ADO"

Не надейся. 
Работа с датами через параметры - единственный ГАРАНТИРОВАНО надежный способ.

Автор: ParaNO1k 17.6.2009, 12:22
Цитата(flomaster)

http://www.delphikingdom.com/asp/search.asp
Есть статья про Excel и БД. Называется "Excel ЧаВо..." в пяти частях.
Найдется по "Excel  ADO"

Спасибо) попробую)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)