C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
доступ к полям, СУБД InterBase 6.x, компоненты IBX
kea
Отправлено: 03.11.2005, 14:39


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте!
Я решил использовать один компонент IBQuery для выполнения запроса select, который в зависимости от выбора пользователя обращается к одной из трех таблиц со статистическими данными. Все эти таблицы имеют поле типа DateTime, остальные — типы Integer и Float. Количество полей у всех таблиц разные. После выполнения запроса первым идет поле DateTime, затем остальные. Как мне обратиться к значениям полей в цикле, например, для вывода их в строку?

IBQuery->Close();
IBQuery->SQL->Clear();
IBQuery->SQL->Add(CreateQueryStr());
IBQuery->Open();

while( !IBQuery->Eof )
{

for ( int i = 0; i < IBQuery->FieldCount; i ++ )
{
//здесь должно быть обращение к значению поля

}

IBQuery->Next();

}
Guest
Отправлено: 03.11.2005, 14:51


Не зарегистрирован







если IB наследник dataset, то обращаться можно по индексу
ds->Fields->Fields[i]->
(а он таки наследник)
** kea
Отправлено: 08.11.2005, 17:04


Не зарегистрирован







Здравствуйте!
Использовал для вывода в строку такую кострукцию:
IBQuery->Fields->Fields[i]->AsString.

Среди выводимых полей были вычисляемые поля (процент выполненея),
имеющие тип numeric(5,2) в хранимой процедуре. Для просмотра результатов ее выполнения используется IBQuery. При представлении в виде строки для вычисляемых полей нули после десятичной точки отбрасыввались: например выводится 100 вместо 100,00. Значения вида 96,51 выводились без отбрасывания знаков после точки. Запускал хранимую процедуру непосредственно в IBConsole там тоже отбрасываются нули после десятичной точки. Как этого избежать?

Для расчета процентов в хранимой процедуре исползовалось выражение:
if ( zaplan is not null and zaplan != 0 and exec is not null ) then
percent = 100.00 * exec / zaplan;

поле percent вычисляемое и возвращаемое из процедуры и имеет тип numeric(5,2).
0xb800
Отправлено: 08.11.2005, 21:17


Не зарегистрирован







Если используете DBGridEh, то
CODE
DBGridEh->Columns->Items[i]->DisplayFormat="0.000";

для показа трёх знаков после запятой, "0.00" — два знака и т.д.
AVC
Отправлено: 09.11.2005, 09:28


Ветеран

Группа: Модератор
Сообщений: 1583



А если не используете, то приводите поле к TNumericField и ставите нужный DisplayFormat
Guest
Отправлено: 09.11.2005, 17:31


Не зарегистрирован







Я так и делал. Проверял тип поля равенство ftFloat и ставил нужный формат. Хотелось бы обойтись без этой операции сравнения, поскольку остальные поля имеют тип integer. Или вызов функции AsString все равно бы убрал 2 нуля после точки? Если не убирает, то как получить на выходе хранимой процедуры 60.00 %, а не 60 %
0xb800
Отправлено: 09.11.2005, 20:32


Не зарегистрирован







CODE
select
   cast(percent as varchar(6))
from your_table
where (your_conditions)
** guest
Отправлено: 10.11.2005, 14:10


Не зарегистрирован







20xb800
Интересное решение! Только зачем для varchar 6 символов?
точка, два знака после нее, 3 знака перед ней? Если будет допустим 1000% (гипотетически)?
0xb800
Отправлено: 11.11.2005, 00:23


Не зарегистрирован







Это только на первый взгляд biggrin.gif
kea
Отправлено: 11.11.2005, 15:28


Станционный диспетчер

Группа: Участник
Сообщений: 80



6 символов достаточно на все случаи жизни?

Вернуться в Работа с базами данных в C++Builder