Главная страница
    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.46 MB
Время: 0.039 c
1-1103876185
whiteswan
2004-12-24 11:16
2005.01.16
не запускается прога в вин98. работаю в винХП,дельфи6.


1-1104652605
Cheguevara
2005-01-02 10:56
2005.01.16
Как отменить последнее действие над картинкой


8-1097334766
DL
2004-10-09 19:12
2005.01.16
Преобразование массива в bitmap


6-1098790899
vadfe
2004-10-26 15:41
2005.01.16
И опять idHTTP и Proxy


14-1103830814
Andy BitOff
2004-12-23 22:40
2005.01.16
Потребление электроэнергии





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский