Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > SQL&C++ работа с результатами запроса.


Автор: SimpAlex 4.6.2008, 16:42
Собстна голова уже кругом идет( ...

проблемма в чем - при написании курсовой передо мной стоит такая задачка. Есть БД в формате дбф, в ней допустим список группы с полями : Имя, Фамилия, Пол, Средний бал. Пуская будет 100 записей.

Далее: Соединение с компонентами и прочее я понимаю, равно как и нет никаких проблемм с языком SQL. Моя трабла заключается в том, чтобы понять ЧТО я получаю в результате - массив данных, какаято виртуальная таблица - что я получу в результате выполнения моего запроса в ADOQuery и как мне потом с этими данными работать.

Зачем мне это нада? С результатами запроса (какаято новая выборка) провести следующую операцию - перегнать эту новую выборку в Эксель и построить диаграммку (это я знаю как тоже) ...

Итак вопрос: Как имея эти данные получить массив данных MyGroup выполнив запрос типа : SELECT Name, Sex WHERE AdvScore>=3. Поидее непонятно где и непонятно как пощупать то что получится, создастся какаято таблица в которой будут 2 поля Имя и Пол, строки отсеятся по условию средний бал больше либо равен 3. Как мне теперь обратиться к этим живим данным, как с ними работать?

З.Ы. Под рукой Билдера нет, пишу с работы в ожидании бессонной ночи дома, все вроде продумал, а на этом ступор и дальше не могу нормально моделировать ход работы своей ...

Заранее АГРОМНОЕ спасибо, Знатоки) ...

Автор: Palladin 4.6.2008, 20:05
Сори ничего непонятно, можешь конкретизировать что тебе надо?

Автор: kin 4.6.2008, 20:32
Цитата(SimpAlex @  4.6.2008,  16:42 Найти цитируемый пост)
Собстна голова уже кругом идет( ...

чувствуется, глядя на сообщение smile 
Цитата

проблемма в чем - при написании курсовой передо мной стоит такая задачка. Есть БД в формате дбф, в ней допустим список группы с полями : Имя, Фамилия, Пол, Средний бал. Пуская будет 100 записей.

Далее: Соединение с компонентами и прочее я понимаю, равно как и нет никаких проблемм с языком SQL. Моя трабла заключается в том, чтобы понять ЧТО я получаю в результате - массив данных, какаято виртуальная таблица - что я получу в результате выполнения моего запроса в ADOQuery и как мне потом с этими данными работать.

Зачем мне это нада? С результатами запроса (какаято новая выборка) провести следующую операцию - перегнать эту новую выборку в Эксель и построить диаграммку (это я знаю как тоже) ...

Итак вопрос: Как имея эти данные получить массив данных MyGroup выполнив запрос типа : SELECT Name, Sex WHERE AdvScore>=3. Поидее непонятно где и непонятно как пощупать то что получится, создастся какаято таблица в которой будут 2 поля Имя и Пол, строки отсеятся по условию средний бал больше либо равен 3. Как мне теперь обратиться к этим живим данным, как с ними работать?

З.Ы. Под рукой Билдера нет, пишу с работы в ожидании бессонной ночи дома, все вроде продумал, а на этом ступор и дальше не могу нормально моделировать ход работы своей ...

Заранее АГРОМНОЕ спасибо, Знатоки) ... 

Мил человек, давай с начала. Я надеюсь речь идет о Builder-е от дяди Borland-a
Если все что ты написал перевести на нормальный язык, то получится следующее: у тебя есть dbf-таблица и из нее вытаскиваются данные при помощи компонента TADOQuery . Глупый вопрос, а  такое вообще возможно (из dbf -  при помощи TADOQuery,) smile , для этой цели есть TQuery. Но это не суть, эти компоненты работают с такой штукой, как набор записей (recordset), перебирай их в цикле и пихай в Excel. Зачем тебе массив?  


Автор: SimpAlex 5.6.2008, 17:57
Массив нужен, чтобы не все поля передавать в эксель ...

Да, Билдер 6.0 от дяди Борланда) ...

Мне нужно из ДБФ вырвать кусок таблицы, хочу это сделать СКЛ-запросом, чтобы юзверь мог сам выбирать какие поля ему интересно увидеть в отчете (именно для формирования красивого отчета с диаграммками и выводу на печть использую Эксель), по каким полям ему захочется построить диаграммку.

Меня интересует - реально ли выполнив СКЛ-запрос, полуич результат в виде набора данных - записать этот набор данных в массив, а потом уже работать с этим массивом (массив 2 мерный получается, строки и столбцы) ...

Ну предстаьте сее матрицу 100*100 достим А, я создаю запрос с уловием и мне не нада 100 полей-параметров, а всего 47, а по этим параметрам отсеивается 59 человек, что должны получить в результате? Матрицу 41*47 пусть она будет Б. ну вот мне нужно работать уже с этой новой матрицей ...

Использую ADOQuery, если есть смысл использовать другой - подскажите в чем разница, в примерах подсоединениях ДБФа в программу, как правило использую схему ADOConnection->ADOQuery ну а дальше уже куда это собстна и нада будет юзать) ...

Надеюсь теперь понятнее обрисовал проблемму) ...

Автор: kin 5.6.2008, 20:59
Цитата(SimpAlex @  5.6.2008,  17:57 Найти цитируемый пост)
Мне нужно из ДБФ вырвать кусок таблицы, хочу это сделать СКЛ-запросом, чтобы юзверь мог сам выбирать какие поля ему интересно увидеть в отчете (именно для формирования красивого отчета с диаграммками и выводу на печть использую Эксель), по каким полям ему захочется построить диаграммку.

Меня интересует - реально ли выполнив СКЛ-запрос, полуич результат в виде набора данных - записать этот набор данных в массив, а потом уже работать с этим массивом (массив 2 мерный получается, строки и столбцы) ...

Ну предстаьте сее матрицу 100*100 достим А, я создаю запрос с уловием и мне не нада 100 полей-параметров, а всего 47, а по этим параметрам отсеивается 59 человек, что должны получить в результате? Матрицу 41*47 пусть она будет Б. ну вот мне нужно работать уже с этой новой матрицей ... 

Все намного проще,зачем усложнять, да и задача поставлена не верно. Сначала определяются критерии запроса (поля, условия, сортировка и т.д), затем он выполняется, а затем обрабатывается. 
Утебя же получается наоборот. Зачем выбирать 100 полей, если нужно всего 47? Ну, как говориться, хозяин - барин. Теперь по сути вопроса: У компонентов TQuery (TADOQuery) есть свойства и методы, наследуемые от TDataSet (First, Next, Fields и пр.). С помощью них перебирай записи, выбирай нужные тебе поля, и пихай их в Excel. Проще говоря, TDataSet и есть тот массив, который ты хочешь получить.

Цитата
Использую ADOQuery, если есть смысл использовать другой - подскажите в чем разница, в примерах подсоединениях ДБФа в программу, как правило использую схему ADOConnection->ADOQuery ну а дальше уже куда это собстна и нада будет юзать) ...

Честно говоря, никогда об этом не задумывался; TQuery использует BDE от Борланда, TADOQuery - ADO от Microsoft. TADOQuery легче TQuery в плане наследования, да и BDE таскать с программой ненужно. Насчет использования для доступа к dbf, честно говоря, ниразу не видел, чтобы использовался TADOQuery, по-этому и был удивлен. Посмотрев help, пришел к выводу, что можно использовать и тот, и другой. Вот собственно и все...

Автор: SimpAlex 8.6.2008, 18:21
Спасибо огромное Kin) ... Не могу репутацию добавить, кто может - дайте +1) ...

Решил проблеммку немного иначе:


Код

void __fastcall TForm2::Button1Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
String mySQL="SELECT "+Edit2->Text+" FROM 2004"; //тут формируется строка запроса.
ShowMessage(mySQL); //ну как не оттестить что получается)) ...
ADOQuery1->SQL->Add(mySQL); //делаем запросик.
ADOQuery1->Open();

}


После этого мы получаем Dataset (спасибо Kin).

Код

void __fastcall TForm2::Button3Click(TObject *Sender)
{
ADOQuery1->First();
for (int i=1; i<=ADOQuery1->RecordCount;i++) //Делаем цикл, где конечное значение - количество строк
        {
        if (ADOQuery1->Fields->Fields[0]->AsString==Edit3->Text) //считываем из Эдита имя Поля, значения которого нужно сравнивать.
                Memo1->Lines->Add(ADOQuery1->Fields->FieldByName("NAME")->AsString); //записываем например в Мэмо значения другого поля из этой же строки.
        ADOQuery1->Next();
        };
}


Мне немного тяжко было врубиться, так как больше работал в последнее время c PHP и прочими текствовыми вариациями( ...

Всем спасибо за помощь) ... надеюсь вдальнейшем тоже откликнитесь на просьбы) ...

Автор: orthrus 9.6.2008, 16:07
А почему бы не сделать запрос такого вида:
Код

String mySQL="SELECT "+Edit2->Text+" FROM 2004 WHERE field = " + Edit3->Text;

где field нужно заменить на имя поля по которому происходит отбор, а результаты получать без условия:
Код

ADOQuery1->First();
for (int i=1; i<=ADOQuery1->RecordCount;i++) //Делаем цикл, где конечное значение - количество строк
        {
         Memo1->Lines->Add(ADOQuery1->Fields->FieldByName("NAME")->AsString); //записываем например в Мэмо значения другого поля из этой же строки.
        ADOQuery1->Next();
        };

Цитата(SimpAlex @  8.6.2008,  18:21 Найти цитируемый пост)
Не могу репутацию добавить, кто может - дайте +1) ...

Без проблем, добавил плюсик smile 

Автор: SimpAlex 10.6.2008, 01:16
Кстати именно так и сделал, но тут не обновил данные)) ...

Код

void __fastcall Prosmotr(int ProsmotrGod)
{

MainForm->ProsmotrConnection->Open();
AnsiString MySQLZapros="SELECT "+MainForm->MySQLPart1+" FROM "+IntToStr(ProsmotrGod)+" WHERE VIDD IN ("+MainForm->MySQLPart2+")";
/*где MainForm->MySQLPart1 глобальная переменная Параметров,а MainForm->MySQLPart2 набор необходимых значений) ...*/
}

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