Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
1-1104026419
Muhan
2004-12-26 05:00
2005.01.16
Как узнать путь к файлу, который запустил программу?


14-1104043729
SergP
2004-12-26 09:48
2005.01.16
Я фигею с эры


6-1097776696
Viper
2004-10-14 21:58
2005.01.16
Обучение работы с сетью


1-1104224195
Vasiliy
2004-12-28 11:56
2005.01.16
Помогите нужен тулбар


11-1085131526
*Pavel
2004-05-21 13:25
2005.01.16
Есть ли в KOL e Application.Handle ?