Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122

Переход по записям в цикле. Вывод записей

26.04.2013, 22:47. Показов 2931. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется база данных из 3-х таблиц: студент, группа, стипендия.
Необходимо в обычный СтрингГрид вывести название группы, ФИО студента и размер стипендии (и др.).
Для этого использую запрос:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int StudentCount = DataModule2->Student->RecordCount;
//....
for(int i=1; i<StudentCount; i++)
    {
        if(DataModule2->Query1->Active)
                        DataModule2->Query1->Close();
        DataModule2->Query1->SQL->Clear();
        DataModule2->Query1->SQL->Add("SELECT Name AS g_name, PIB AS pib, Seredniy_bal AS s_bal, Rozmir AS razmer FROM Grupa, Student, Stipendiya WHERE ((GRUPA_ID = ID_Grupa)AND(STIPENDIYA_ID=ID_Stipendiya)AND(ID_Student = "+IntToStr(i)+"))");
        DataModule2->Query1->Open();
        
        Form5->SG->RowCount++;
        Form5->SG->Cells[0][i] = DataModule2->Query1->FieldByName("g_name")->AsString;
        Form5->SG->Cells[1][i] = DataModule2->Query1->FieldByName("pib")->AsString;
        Form5->SG->Cells[2][i] = DataModule2->Query1->FieldByName("s_bal")->AsString;
        Form5->SG->Cells[3][i] = DataModule2->Query1->FieldByName("razmer")->AsString;
//...
}
Понимаю, что так переходить по записям - абсурд, но как по-другому сделать не знаю.
Проблема в том, что ID записей, при их удалении не "возвращается назад". Например, создали три записи. Потом удалили запись с номером 3 и создали еще одну. У новой будет ИД = 4. Из-за этого - ошибка при поиске и выводе.
Можно ли как-то "по-культурному" переходить по записям, без использования "индекса"? Наведите пример.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.04.2013, 22:47
Ответы с готовыми решениями:

Вывод записей из одной таблицы соответствующих записям в другой
Как вывести записи из одной таблицы, соответствующие записям в другой. Например: Таблица Goods id ... title_id .... category ......

Переход по записям (изменение вида формы кликом - переход на определенную запись)
есть форма ленточная, хочу сделать чтобы при нажатии на инфу открывалась запись на которую нажали в режиме одиночная на конкретную запись

Переход по записям
Добрый день. В БД во вложении хочу при крутить переход по записям. при выборе месяца и года отображалась запись, если такой записи нету то...

12
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.04.2013, 23:13
Prostoplus,
Цитата Сообщение от Prostoplus Посмотреть сообщение
обычный СтрингГрид
А чем же, если не секрет, не устроил обычный DBGrid?


Цитата Сообщение от Prostoplus Посмотреть сообщение
Можно ли как-то "по-культурному" переходить по записям, без использования "индекса"?
Можно. У компонента ADOQuery (а точнее у базового класса TDataSet) для этого существуют определенные методы. В Вашем случае это:
First()
и
Next()

а также свойство RecordCount или Eof.
1
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
26.04.2013, 23:18  [ТС]
The_Immortal,
А чем же, если не секрет, не устроил обычный DBGrid?
Такой привычнее, так как работаю с базами данных от силы три дня.
Можно. У компонента ADOQuery для этого существуют определенные методы.
Я использую обычный Query, так как работаю с доисторическими базами данных и старым билдером.
Сейчас попробую...
0
45 / 37 / 9
Регистрация: 26.04.2013
Сообщений: 90
26.04.2013, 23:23
Не совсем понятно что вы пытаетесь сделать и чем вас не устраивает DBGrid. Я так понял, что вы имеете какую то таблицу Student, почему бы вам не брать значение поля Student->FieldByName("ID_Student ") и при каждом проходе цикла делать что то вроде Student->Next(), а в своем запросе написать вместо +IntToStr(i)+ Student->FieldByName("ID_Student ")
0
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
26.04.2013, 23:25  [ТС]
Цитата Сообщение от Tim979 Посмотреть сообщение
Не совсем понятно что вы пытаетесь сделать и чем вас не устраивает DBGrid. Я так понял, что вы имеете какую то таблицу Student, почему бы вам не брать значение поля Student->FieldByName("ID_Student ") и при каждом проходе цикла делать что то вроде Student->Next(), а в своем запросе написать вместо +IntToStr(i)+ Student->FieldByName("ID_Student ")
В принципе да, только имеется 3 связанных таблицы со связями один ко многим. Вывожу в таблицу данные сразу из трех таблиц.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.04.2013, 23:30
Prostoplus,
Цитата Сообщение от Prostoplus Посмотреть сообщение
использую обычный Query
Обычный это TQuery?

Там также идет наследование от TDataSet, так что
Цитата Сообщение от The_Immortal Посмотреть сообщение
First()
и
Next()
а также свойство RecordCount или Eof.
это все справедливо.
1
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
26.04.2013, 23:31  [ТС]
The_Immortal, спасибо большое, буду пробовать.
0
45 / 37 / 9
Регистрация: 26.04.2013
Сообщений: 90
26.04.2013, 23:41
попробуй что то вроде этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int StudentCount = DataModule2->Student->RecordCount;
Student->First()//установка курсора на первую запись в таблице студент
for(int i=1; i<StudentCount; i++)
    {
        if(DataModule2->Query1->Active)
                        DataModule2->Query1->Close();
        DataModule2->Query1->SQL->Clear();
        DataModule2->Query1->SQL->Add("SELECT Name AS g_name, PIB AS pib, Seredniy_bal AS s_bal, Rozmir AS razmer FROM Grupa, Student, Stipendiya WHERE ((GRUPA_ID = ID_Grupa)AND(STIPENDIYA_ID=ID_Stipendiya)AND(ID_Student = "+IntToStr(Student->FieldByName("ID_Student "))+"))");
        DataModule2->Query1->Open();
        
        Form5->SG->RowCount++;
        Form5->SG->Cells[0][i] = DataModule2->Query1->FieldByName("g_name")->AsString;
        Form5->SG->Cells[1][i] = DataModule2->Query1->FieldByName("pib")->AsString;
        Form5->SG->Cells[2][i] = DataModule2->Query1->FieldByName("s_bal")->AsString;
        Form5->SG->Cells[3][i] = DataModule2->Query1->FieldByName("razmer")->AsString;
Student->Next()//перевод на следующую запись
}
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.04.2013, 23:51
Ну и небольшая поправочка:
C++
1
for(int i=1; i<=StudentCount; i++)
, а то одну запись не учтем.
0
45 / 37 / 9
Регистрация: 26.04.2013
Сообщений: 90
26.04.2013, 23:55
внимания не обратил, согласен
0
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
27.04.2013, 00:12  [ТС]
Tim979, выводит только одну запись несколько раз... сейчас буду разбераться.

Добавлено через 12 минут
Сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
try
{
    //обрываем связи сто бы подсчитало общее количество студентов
    DataModule2->Student->MasterSource = NULL;
    DataModule2->Student->MasterFields = "";
    DataModule2->Student->IndexName = "";
 
    int StudentCount = DataModule2->Student->RecordCount;
 
    DataModule2->Student->First();
 
    for(int i=1; i<=StudentCount; i++)
    {
        if(DataModule2->Query1->Active)
                        DataModule2->Query1->Close();
        DataModule2->Query1->SQL->Clear();
 
        DataModule2->Query1->SQL->Add("SELECT Name AS g_name, PIB AS pib, Seredniy_bal AS s_bal, Rozmir AS razmer FROM Grupa, Student, Stipendiya WHERE ((GRUPA_ID = ID_Grupa)AND(STIPENDIYA_ID=ID_Stipendiya)AND(ID_Student = "+DataModule2->Student->FieldByName("ID_Student")->AsString+"))");
        DataModule2->Query1->Open();
 
        Form5->SG->RowCount++;
        Form5->SG->Cells[0][i] = DataModule2->Query1->FieldByName("g_name")->AsString;
        Form5->SG->Cells[1][i] = DataModule2->Query1->FieldByName("pib")->AsString;
        Form5->SG->Cells[2][i] = DataModule2->Query1->FieldByName("s_bal")->AsString;
        Form5->SG->Cells[3][i] = DataModule2->Query1->FieldByName("razmer")->AsString;
 
        DataModule2->Student->Next();
    }
 
     //возвращаем связи
    DataModule2->Student->MasterSource = DataModule2->GrupaDS;
    DataModule2->Student->MasterFields = "ID_Grupa";
    DataModule2->Student->IndexName = "GRUPA_ID1";
}
Вроде бы работает как нужно.
0
45 / 37 / 9
Регистрация: 26.04.2013
Сообщений: 90
27.04.2013, 00:14
значит у вас не переводится курсор на следующую запись в таблице Student смотрите в эту сторону, а самый лучший вариант изучите компоненты ADOQuery и DBGrid прочтите книгу А.Я. Архангельский Компоненты C++ Builder
0
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
27.04.2013, 00:15  [ТС]
Tim979, после небольших изменений все работает и переходит на следующую строку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2013, 00:15
Помогаю со студенческими работами здесь

Проставить checked записям в цикле
Имеется таблица 1 с именами пользователей, ее необходимо вывести (всех пользователей). В другой таблице 2 в одной из ячеек перечислены...

Переход к первой и последней записям
Здравствуйте. У меня есть таблица суммарного учета книг, в которой записываются данные как о поступивших книгах,так и о тех,которые...

Переход по записям в главной форме
Доброго времени суток! Подскажите пожалуйста что за нюанс, что в моей не работает переход по записям главной формы (только после...

Картинки из в DBImage. Переход по записям
Вся программа в архиве! После запуска программы и нажатия на &quot;Начать тест&quot;. Все вопросы считываются из БД. Проблема, в том, что при...

Открытие и переход по записям с условием
Добрый день! Есть форма фЗанятия, на ней две вкладки, различающие занятия по месту. Вкладка1 - Место1, Вкладка2 - Место2. В поле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru