Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизEVariantError - При вызове Locate Найти похожие ветки
← →
leonon © (2004-12-14 09:26) [0]Привет всем. Есть простая задача - два набора данных аSource и аDest, причем аSource не полный набор аDest (например в аDest есть поля id, name, ...., а в аDest только id (за ранее не известно)). Необходимо из набора аDest удалить записи, отличные (по одноименным полям) от набора аSource. Подхожу следующим образом:
var
aSource, aDest : TTable;
aLocateStr : string;
VarArr : variant;
K : integer;
begin
.......
aLocateStr := "";
for K:=0 to aSource.Fields.Count-1 do
if aLocateStr = cEmpty then
aLocateStr := aSource.Fields.Fields[K].FieldName
else
aLocateStr := aLocateStr + ";"+ aSource.Fields.Fields{K].FieldName;
VarArr := VarArrayCreate([0, aSource.Fields.Count-1], varVariant);
While Not aDest.Eof do begin
for K:=0 to aSource.Fields.Count-1 do
VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsString;
Тут происходит ошибка EVariabtError - Invalid variant type convertion
if aSource.Locate(aLocateStr, VarArrayOf(VarArr), []) then
aDest.Next
else
aDest.Delete;
end;
.......
end;
Что не правильно делаю? Через SQL не хочу, т.к. колличество полей в aSource заранее не известно и фактически они находятся в разных местах.
← →
stone © (2004-12-14 10:14) [1]ИМХО, ошибка происходит тут:
> VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsString;
← →
stone © (2004-12-14 10:16) [2]VarArr должен быть array of Variant
← →
leonon © (2004-12-14 10:23) [3]если давать
VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant
происходит то же самое
← →
stone © (2004-12-14 10:59) [4]Еще раз для тех кто в танке:
VarArr должен быть array of Variant
+ см. хэлп по работе с динамическими массивами
← →
leonon © (2004-12-14 11:04) [5]для тех, кто не в танке...
var
VarArr : array of variant;
begin
.......
aLocateStr := cEmpty;
for K:=0 to aSource.Fields.Count-1 do
if aLocateStr = cEmpty then
aLocateStr := aSource.Fields.Fields[K].FieldName
else
aLocateStr := aLocateStr + ";"+ aSource.Fields.Fields[K].FieldName;
SetLength(VarArr, aSource.Fields.Count);
While Not aDest.Eof do begin
for K:=0 to aSource.Fields.Count-1 do
VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant;
if aSource.Locate(aLocateStr, VarArr, []) then
aDest.Next
else
aDest.Delete;
end;
работает точно такжк с такой же ошибкой
← →
stone © (2004-12-14 11:29) [6]попробуй так:
VarArr: Variant;
...
VarArr := VarArrayCreate([0,aSource.Fields.Count-1], varVariant);
кроме того вынеси
> for K:=0 to aSource.Fields.Count-1 do
> VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant;
перед циклом WHILE
также сделай цикл
aDest.Last;
While Not aDest.Bof do begin
← →
stone © (2004-12-14 11:32) [7]
> также сделай цикл
> aDest.Last;
> While Not aDest.Bof do begin
не надо, это я прогнал
← →
Плохиш © (2004-12-14 11:41) [8]
stone © (14.12.04 11:29) [6]
попробуй так:
VarArr: Variant;
...
VarArr := VarArrayCreate([0,aSource.Fields.Count-1], varVariant);
+
if aSource.Locate(aLocateStr, Variant(VarArr), []) then
← →
stone © (2004-12-14 11:43) [9]
> кроме того вынеси
> > for K:=0 to aSource.Fields.Count-1 do
> > VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant;
>
> перед циклом WHILE
с этим тоже прогнал. Все правильно, ты же там значения получаешь...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c