![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EVariantError - При вызове Locate [D5, Paradox]
leonon © (2004-12-14 09:26:00)Привет всем. Есть простая задача - два набора данных а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 11:43:00) [1]
> кроме того вынеси
> > for K:=0 to aSource.Fields.Count-1 do
> > VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant;
>
> перед циклом WHILE
с этим тоже прогнал. Все правильно, ты же там значения получаешь...
Плохиш (2004-12-14 11:41:00) [2]
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:32:00) [3]
> также сделай цикл
> aDest.Last;
> While Not aDest.Bof do begin
не надо, это я прогнал
stone (2004-12-14 11:29:00) [4]попробуй так:
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
leonon (2004-12-14 11:04:00) [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 10:59:00) [6]Еще раз для тех кто в танке:
VarArrдолжен быть array of Variant
+ см. хэлп по работе с динамическими массивами
leonon (2004-12-14 10:23:00) [7]если давать
VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsVariant
происходит то же самое
stone (2004-12-14 10:16:00) [8]VarArr должен быть array of Variant
stone (2004-12-14 10:14:00) [9]ИМХО, ошибка происходит тут:
> VarArr[K] := aDest.FieldByName(aSource.Fields.Fields[K].FieldName).AsString;