Помощь - Поиск - Пользователи - Календарь
Полная версия: Access & C++(Rad studio 2010)
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Nike0
Доброго времени суток, появился вопрос при написании курсовой: есть база данных Нажмите для просмотра прикрепленного файла, имеется форма Нажмите для просмотра прикрепленного файла, в первый комбобокс я записываю все значения столбца Отделение таблицы Отделения (идентификатор Id_отделения я хотел использовать для дальнейших целей):
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ADOTable1->Open();
DBGrid3->Visible = False;
DBComboBox1->Clear();
for (ADOTable1->First(); !ADOTable1->Eof; ADOTable1->Next())
{
DBComboBox1->Items->Add(ADOTable1->FieldValues["Id_отделения","Отделение"]);
}
}

затем я хочу, чтобы при выборе определенного отделения у меня из таблицы Группы записывались значения столбца Группа в комбобокс2, я пытался все это счастье сделать так:
void __fastcall TForm1::DBComboBox1Change(TObject *Sender)
{
try
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
DBComboBox2->Enabled = True;
ADOTable2->Open();
DBComboBox2->Clear();
ADOQuery1->SQL->Add("SELECT Группы.Группа FROM Отделения INNER JOIN Группы ON Отделения.Id_отделения = Группы.Id_отделения WHERE Отделения.Отделение='"+DBComboBox1->Text+"'");
ADOQuery1->ExecSQL();
for (ADOTable2->First(); !ADOTable2->Eof; ADOTable2->Next())
{
DBComboBox2->Items->Add(ADOTable2->FieldValues["Id_группы","Группа"]);
}
DBComboBox2->Enabled = True;
}
catch(...)
{
//MessageBox(0,"Такая таблица не существует, сначала создайте её!","Ошибка!",MB_OK);
}
}

но почему-то он игнорирует сравнение идентификаторов и записывает все значения таблицы Группы.
Подскажите мб как это делать, просто на C# чтобы все это сделать надо 4 раза мышкой щелкнуть, зато никак там с добавлением данных в таблицу разобраться не могу.
volvo
Цитата
просто на C# чтобы все это сделать надо 4 раза мышкой щелкнуть
И зачем эта информация? Тебе ж надо на С++ сделать? Вот и делай, не смотри, сколько где раз надо щелкнуть...

Все проще на самом деле:
1) на форме DataSource (2 шт.), ADOTable (2 шт.) и DBLookupComboBox (тоже 2 шт.)
2) настраиваем ADOTable1 на таблицу "Отделения", а ADOTable2 - на "Группы"
3) настраиваем DataSource1 -> Dataset = ADOTable1 и DataSource2 -> Dataset = ADOTable2
4) теперь LookupComboBox-ы.

Первый будет отображать отделения. Для этого у него:
ListSource = DataSource1; ListField = Отделение; KeyField = Id_Отделение.

Второй - для отображения связанных групп. Сначала настраиваем его вообще на отображение групп:
ListSource = DataSource2; ListField = Группы; KeyField = Id_Группы.

5) А вот теперь надо добавить тот самый функционал, что после выбора определенного значения в первом Lookup-е, во втором останутся только связанные значения. Для этого:
void __fastcall TForm1::DBLookupComboBox1Click(TObject *Sender)
{
ADOTable2->Filtered = false; // Эта таблица связана с Группами, не забыл?

// Просто фильтруем таблицу, чтоб она содержала только нужные записи
ADOTable2->Filter = "[id_branch] = " + IntToStr((int)DBLookupComboBox1->KeyValue);
ADOTable2->Filtered = true;

DBLookupComboBox2->Refresh(); // И обновляем LookupCB
}
Вот и все... А заполнение вручную - выброси из головы, не надо оно. Все делается автоматом...

Ну, и что? Где сложнее настроить нужное поведение?
Nike0
Цитата(volvo @ 26.03.2011 18:56) *

Ну, и что? Где сложнее настроить нужное поведение?

Ммм, все оказалось проще, чем я думал, спасибо, просто я не знаю всех тонкостей работы с бд, если вдруг появятся какие-то сложности, то я знаю, где могут дать совет и подсказатьsmile.gif
Nike0
В ходе написания проги возник вопрос: мне нужно вывести успеваемость студентов определенной группы в дбгрид. Я почитал книгу по скл запросам, нашел INSERT INTO SELECT, т.е. из одной в другую переносит значения, однако есть жесткие ограничения насчет количества столбцов. потом пробывал сделать в аксесе запрос, который просто подключил бы к адотейбл и выводил бы всех студентов и запросом ограничивал бы группу. Но и здесь проблема: в гриде выводит только одно поле'ФИО' и все, очтальную информацию не показывает, а в аксесе все норм.
volvo
Добавляю в Access-базу Query следующего вида:
Нажмите для просмотра прикрепленного файла
, добавляю на форму еще одну AdoTable3 и DataSource3, связываю AdoTable3 с q2, и DBGrid - с этой самой Adotable3, так, что у меня сразу в гриде появляется вся статистика, независимо от группы:
Нажмите для просмотра прикрепленного файла
, а потом, по какому-то событию (например, по изменению DBLookupCombobox2, не зря ж на него навешивалось отображение групп, правда?), точно так же, как и выше, делаю фильтрацию:
void __fastcall TForm1::DBLookupComboBox2Click(TObject *Sender)
{
if(DBLookupComboBox2->Text.Length() > 0)
{
ADOTable3->Filtered = false;
ADOTable3->Filter = "[group] = " + QuotedStr(DBLookupComboBox2->Text);
ADOTable3->Filtered = true;
}
}
, после чего запускаю программу, выбираю в первом Lookup-е отделение, во втором - группу, и ...
Нажмите для просмотра прикрепленного файла
Что я делаю не так? smile.gif
Nike0
Цитата(volvo @ 2.04.2011 20:36) *

Что я делаю не так? smile.gif

кхм-кхм, смейтесь или нет, но у меня поле фио 255 символов, я сидел на ноуте с экономией и нижней полосы прокрутки видно не было smile.gif я то делал все правильно, вот белый экран подвел)) все равно спасибо что время уделили)
Nike0
Добрый вечер, опять вопросы: нашал более-менее структурированно делать курсач, поэтому для редактирования таблиц завел 2 форму, повесил туда пока 2 лукапа (отделения и группы) и по 3 кнопки с эдитами на каждую (add,edit,del). Затем начал подключать к лукапам таблицы с первой формы в ListSource (Form1.DataSource1 и тд). НО, когда я хочу добавить\изменить\удалить запись, у меня выскакивает экспепшн Missing Connection or ConnectionString. Затем я все нужные таблицы, квери и адооконнекшн закинул на 2 форму, но все равно такая ошибка, в чем проблема тогда?
Nike0
решил с этим проблему, остался последний вопрос: какой компонент для формирования отчета в Excel есть в С++? мне преподаватель нарисовал приблизительно форму отчета, только не знаю в чем его делать
Nike0
Почитал. Есть компонент QuickReport, но он у меня отсутствует, посоветуете может какое другое средство для формирования отчетов?
volvo
Что значит "отсутствует"? Версия Билдера какая? Может он есть, но не установлен по умолчанию, и его надо доустановить (как было с Дельфи 7). В 2009-м Билдере по умолчанию ставится Rave Reports (закладка Rave ,все имена классов начинаются с TRv...)

В конце концов можно напрямую работать с Excel-ем, через OLE, без посредников...
Nike0
Цитата(volvo @ 11.04.2011 12:53) *

Что значит "отсутствует"? Версия Билдера какая? Может он есть, но не установлен по умолчанию, и его надо доустановить (как было с Дельфи 7). В 2009-м Билдере по умолчанию ставится Rave Reports (закладка Rave ,все имена классов начинаются с TRv...)

В конце концов можно напрямую работать с Excel-ем, через OLE, без посредников...

ну вот просто вкладки нет, code gear 2010, Rave Reports по умолчанию ставились, но в компонентах его нет и все...
Я бы делал через Excel, но там сложноватая структура отчета у меня... И если нет компонента, его скачать и просто в пакет билдера доустановить?
volvo
Цитата
code gear 2010, Rave Reports по умолчанию ставились, но в компонентах его нет и все...
Если ставились - то ходи в меню Component -> Install Packages, и проверяй, установлена ли вот эта галочка:
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.