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