![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование типа ;Byte к вещественному Double... [D5, MSSQL]
Helen © (2002-04-10 16:25:00)Все ссылки между таблицами в базе хранятся в поле типа Byte. Для
дальнейшей работы необходимо видеть их в более удобочитаемом виде. Пробую преобразовать к типу Double...ругается.
Подскажите пожалуйста, в чем здесь ошибка? или можно как-то по-дугому?
procedure NameProc;
var s: variant;
begin
S :=
VarAsType(AdoTable1.FieldByName("F$Nrec").AsVariant,$0005);
end;
wicked (2002-04-11 11:31:00) [1]2 Helen ©
> По поводу примера, как вообще снять ранее определенное условие
> на OnFilterRecord (очистить? чтобы он потом не "смешивался"
> с уловием TDataSet.Filter)?
маленький совет - не используйодновременно и Filter, и OnFilterRecord, так как это есть источник потенциальных, трудноуловимых граблей... OnFilterRecord"а хватит с головой, если наборы данных невелики...
Lusha (2002-04-11 10:56:00) [2]Извините. Забыл одну строчку в обработчике...
procedure TForm1.DataSetFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var V : Variant;
begin
V := DataSet.FieldByName("F$NREC").AsVariant;
Accept := (V[1] = 25) and (V[2] = 128);
end;
Lusha (2002-04-11 10:46:00) [3]>Helen
>Хорошо, Вы пробовали поставить фильтр с присутствием в нем >значения типа Variant???
Повторяю. Для определения критериев фильтрации по значению с типом Variant используйте обработчик на событие OnFilterRecord...
Обработчик при этом будет выглядеть приблизительно так...
procedure TForm1.DataSetFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var V : Variant;
begin
Accept := (V[1] = 25) and (V[2] = 128);
end;
>По поводу примера, как вообще снять ранее определенное условие на OnFilterRecord
OnFilterRecord := nil;
Helen (2002-04-11 10:34:00) [4]Lusha © (11.04.02 10:27)
Хорошо, Вы пробовали поставить фильтр с присутствием в нем значения типа Variant??? Я же говорю, что не получается, ошибка что "не могу преобразовать..."
По поводу примера, как вообще снять ранее определенное условие на OnFilterRecord (очистить? чтобы он потом не "смешивался" с уловием TDataSet.Filter)?
Lusha (2002-04-11 10:27:00) [5]>Helen © (11.04.02 10:19)
Начнем с того, что OnFilterRecord это указатель на процедуру. А процедур может быть несколько (каждая задает свой критерий фильтрации). И менять можно не текст строки TDataSet.Filter, а значение указателя OnFilterRecord.
Например:
...
Filtered := False;
OnFilterRecord := procedure1;
Filtered := True;
...
...
Filtered := False;
OnFilterRecord := procedure2;
Filtered := True;
...
P.S. А привести Ваш variant к строке и работать с ним в свойстве Filter, мне кажется Вам не удаться...
Helen (2002-04-11 10:19:00) [6]>Lusha © (11.04.02 09:02)
Все это конечно хорошо, но фильтр не работает со значениями типа Variant, а OnFilterRecord это метод, а не свойство. Значит он будет работать все время как только свойство *.Filtred := True. Мне это не очень подходит, потому что по ходу программы я все время меняю свойство *.Filter. <- Им бы и удобнее было пользоваться, но для этого нужно сформировать символьную строку условия, а этот Variant у меня никак к нему не преобразовывается.
Lusha (2002-04-11 09:02:00) [7]Да, признаться виноват. В реплике Lusha © (10.04.02 17:21) можно обойтись одним оператором присваивания...
V := TADOTable.FieldByName("F$NREC").AsVariant;
Lusha (2002-04-10 17:47:00) [8]А если нужно просто отфильтровать НД используйте свойство OnFilterRecord... Я думаю - это то, что Вам нужно...
Lusha (2002-04-10 17:39:00) [9]>...можно было его запомнить...
Вот я Вам и предоставил пример как его можно запомнить... У Вас есть идеи как это сделать иначе? У меня нет... :(
Helen (2002-04-10 17:35:00) [10]Lusha:
я что-то не понимаю. Я не хочу ничего никуда сливать.
Как Variant я итак вижу поля,
TADOTable.FieldByName("F$NREC").AsVariant
Мне нужно видеть значение поля так, чтобы можно было его запомнить и по нему поставить фильтр в другой таблице.
Johnmen (2002-04-10 17:30:00) [11]AsInteger ?
Lusha (2002-04-10 17:24:00) [12]Гы-гы. Забыл вычесть единичку... :)
Helen (2002-04-10 17:24:00) [13]В книжках по это ничего не пишут, но пишут, что можно в String,
тогда
S:=VarAsType(AdoTable1.FieldByName("F$Nrec").AsVariant,$0100);
но что-то тоже не получается...
Lusha (2002-04-10 17:21:00) [14]А чему равняется DataSize?
И если он больше 1, то как Вы себе вообще представляете преобразование этого массива в Double?
А слить в вариант, я думаю, можно так...
var V : Variant;
begin
V := VarArrayCreate([0, TADOTable.FieldByName("F$NREC").DataSize], VarByte);
V := TADOTable.FieldByName("F$NREC").AsVariant;
...
Alex G u e s t (2002-04-10 17:18:00) [15]А не проще ли Byte преобразовывать в Char?
Helen (2002-04-10 17:12:00) [16]Пробовала.
"Cannot access field "F$NREC" as type Float"...
Удобочитаемый это чтобы можно было например поставить по нему фильтр.
Johnmen (2002-04-10 16:43:00) [17]procedure NameProc;
var s: double;
begin
S := AdoTable1.FieldByName("F$Nrec").AsFloat;
end;
И вообще неясно, зачем их видеть и что значит "в удобочитаемом виде" ?