Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.47 MB
Время: 0.044 c
1-1104323219
Jay1982
2004-12-29 15:26
2005.01.16
ICON->BMP


1-1104476625
Jay1982
2004-12-31 10:03
2005.01.16
ActiveControl у чужого приложения


3-1102937302
}|{yk
2004-12-13 14:28
2005.01.16
При удалении дочерних записей получаю ошибку


1-1104219817
Ega23
2004-12-28 10:43
2005.01.16
Variant


1-1103913677
Pabse
2004-12-24 21:41
2005.01.16
эдитить html





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский