Проблема с вычисляемым полем по таблице TMP$ATTACHMENTS

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Проблема с вычисляемым полем по таблице TMP$ATTACHMENTS

Сообщение Pavel_ch » 03 мар 2007, 22:02

Доброго времени суток. Столкнулся с непонятной для меня проблемой.
Суть задачи такова.
У меня в БД есть таблица где по русски записана основная и дополнительная информация о пользователях системы (БД). Основным, ключевым, полем является поле USRLOGIN содержащее имя пользователя под которым он регистрируется на сервере InterBase.
Чтобы получить данные о подключённых в данный момент пользователях и при этом отображать в списке не логины, а реальные имена, делаю вот такой запрос:

Код: Выделить всё

select T.TMP$TIMESTAMP, U.USRNAME, T.TMP$USER_IP_ADDR, T.TMP$USER_HOST, T.TMP$STATE
from TMP$ATTACHMENTS T INNER JOIN USR U ON (T.TMP$USER = U.USRLOGIN)
Здесь в поле TMP$STATE отражается состояние подключения. Мне нужно ввести его в список по-русски. Для этого сделал в запросе (уже в Delphi7, IBQuery из IBX) дополнительное вычисляемое поле Status и на onCalcFields повесил вот такую очевидную вещь:

Код: Выделить всё

procedure TBaseInfo.ConnectedUsersCalcFields(DataSet: TDataSet);
begin
if ConnectedUsers.FieldByName('TMP$STATE').AsString = 'ACTIVE' then
  ConnectedUsersStatus.Value := 'Активен';
if ConnectedUsers.FieldByName('TMP$STATE').AsString = 'CONNECTED' then
  ConnectedUsersStatus.Value := 'Подключён';
end;
Но почему-то после открытия запроса, вычисляемое поле не работает. Если в грид подставлять не вычисляемое поле, а напрямую TMP$STATE то всё отображается, но мне-то нужно по-русски...
Подскажите в чём моя ошибка. Уже вроде всё перепробовал - никак. Или может решение где-то на поверхности, но я его в упор не вижу?

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 04 мар 2007, 08:42

Проще тогда через TField.OnGetText

Код: Выделить всё

procedure TBaseInfo.ConnectedUsersStateFieldGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
if Sender.FieldName='TMP$STATE' then
 begin
 if trim(Sender.AsString) = 'ACTIVE' then
  Text := 'Активен'
 else if trim(Sender.AsString) = 'CONNECTED' then
  Text := 'Подключён';
 end;
end;

Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Сообщение Pavel_ch » 04 мар 2007, 16:08

Большое спасибо за совет, всё заработало как надо

Ответить