Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Проблема с методом поиска

Автор: dron4ik 19.11.2010 1:08

всем привет. Сделал бд в делфи ..в ней..имеется две таблицы, одна из них дочерняя , а др родительская, для каждой таблицы сделал две кнопки, которые реализуют поиски разными методами(первый метод-Lookup, второй- Locate), у первой таблице два метода работают нормально, а вот у второй таблицы не работает метод-Lookup--выходит ошибка при нажати кнопки---Variant or safe array index out of bounds...как исправить жту ошибку я не знаю...вот коды:

procedure TForm1.Button1Click(Sender: TObject);
var
GrNumTmp1, GrNumTmp2: Integer;
begin

If CheckBox1.Checked then
begin
DataSource1.DataSet:=Table1;
GrNumTmp1 := StrToInt(Edit1.Text);
GrNumTmp2 := StrToInt(Edit2.Text);
With Table1 do
begin
CancelRange;
SetRange([GrNumTmp1],[GrNumTmp2]);
end;
end else
Table1.CancelRange;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
LookUpResults: Variant;
i: integer;
begin
ListBox1.Clear();
LookUpResults:=Table1.Lookup('Soc_nom', StrToInt(Edit3.Text), 'Famil;Imya; Dolgnost');
If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox1.Items.Add(LookUpResults[i]);
end
else
case VarType(LookUpResults) of
varEmpty : listbox1.Items.Add('Пустой результат');
varNull : listbox1.Items.Add('Запись не найдена');
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
LocateResults: Variant;
begin
LocateResults:=Table1.Locate('Soc_nom;Famil;Imya', varArrayof( [1, 'Щеколдин', 'Андрей']),[loCaseInsensitive, loPartialKey]);
Case varType(LocateResults) of
varEmpty : Label6.Caption:='Пустой результат';
varNull : Label6.Caption:='Запись не найдена';
else
Label5.Caption:=LocateResults;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
GrNumTmp3, GrNumTmp4: Integer;
begin

If CheckBox2.Checked then
begin
DataSource2.DataSet:=Table2;
GrNumTmp3 := StrToInt(Edit4.Text);
GrNumTmp4 := StrToInt(Edit5.Text);
With Table2 do
begin
CancelRange;
SetRange([GrNumTmp3],[GrNumTmp4]);
end;
end else
Table2.CancelRange;
end;


procedure TForm1.Button5Click(Sender: TObject);
var
LookUpResults: Variant;
i: integer;
begin
ListBox2.Clear();
LookUpResults:=Table2.Lookup('Kod_lic_ch', StrToInt(Edit6.Text), 'Bank; Soc_nom');
If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox2.Items.Add(LookUpResults[i]);--ОШИБКА УКАЗЫВАЕТ СЮДА.
end
else
case VarType(LookUpResults) of
varEmpty : listbox2.Items.Add('Пустой результат');
varNull : listbox2.Items.Add('Запись не найдена');
end;
end;

procedure TForm1.Button6Click(Sender: TObject);

var
LocateResults: Variant;
begin
LocateResults:=Table2.Locate('Kod_lic_ch;N_lic_ch;Bank', varArrayof( ['1', '1', 'Уралсиб']),[loCaseInsensitive, loPartialKey]);
Case varType(LocateResults) of
varEmpty : Label6.Caption:='Пустой результат';
varNull : Label6.Caption:='Запись не найдена';
else
Label11.Caption:=LocateResults;
end;
end;
end.

Автор: volvo 19.11.2010 1:19

Так это не "метод Lookup не работает". Это ты с чего-то решил, что Lookup по второй таблице должен вернуть тебе обязательно массив, в котором будет минимум 3 элемента (с индексами 0, 1 и 2). Но LookUpResults, хоть и массив (раз проверку VarIsArray прошел), однако элементов там, как видно, меньше трех, вот тебе и выбрасывается ошибка при попытке обращения к несуществующему элементу.

Автор: dron4ik 19.11.2010 1:29

нифига не понял(((каких еще элементов не хватает?

Добавлено через 5 мин.
Volvo, спасибо за оперативную подсказку!) понял и исправил..не хватало еще одного аттрибута (названия поля которое должно выводиться в результате поиска!)

Автор: volvo 19.11.2010 1:37

Ошибка у тебя здесь:

Цитата
   If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox2.Items.Add(LookUpResults[i]);--ОШИБКА УКАЗЫВАЕТ СЮДА.
end
? Значит, Lookup отработал, и что-то вернул в LookUpResults... И это что-то - массив, поскольку VarIsArray(LookUpResults) вернуло истину, иначе б ты не попал в эту ветку. До этого момента понятно?

А теперь скажи мне, где у тебя в коде написано, что этот самый массив, который хранится в LookUpResults, должен содержать три элемента? Где написано, что Lookup вернет массив, состоящий как минимум из трех элементов? Ты обращаешься в цикле к LookUpResults[0], LookUpResults[1] и LookUpResults[2], а вдруг там просто НЕТ LookUpResults[2]? Проверь, каков размер SafeArray, и выводи те элементы, которые там ЕСТЬ, а не те, которые ты решил, что должны быть...

Автор: dron4ik 19.11.2010 1:42

LookUpResults:=Table2.Lookup('Kod_lic_ch', StrToInt(Edit6.Text), 'Bank; Soc_nom')
;---я сюда добавил еще один элемент...вот так




LookUpResults:=Table2.Lookup('Kod_lic_ch', StrToInt(Edit6.Text), 'Bank; Soc_nom; Data_nach_dei')
и всё сразу чики- чики)

Автор: volvo 19.11.2010 2:00

Вот чтоб не получать ошибки - сделай то, что я написал smile.gif Выводи столько элементов, сколько есть в SafeArray-е, будет программа недоговаривать результаты - сразу поймешь, что не хватает параметров при Lookup-е. Не доводи дело до ошибки во время выполнения программы...

Автор: neveseliy2 11.04.2020 21:44

Цитата(volvo @ 19.11.2010 1:37) *

Ошибка у тебя здесь:
Цитата
   If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox2.Items.Add(LookUpResults[i]);--ОШИБКА УКАЗЫВАЕТ СЮДА.
end
? Значит, Lookup отработал, и что-то вернул в LookUpResults... И это что-то - массив, поскольку VarIsArray(LookUpResults) вернуло истину, иначе б ты не попал в эту ветку. До этого момента понятно?

А теперь скажи мне, где у тебя в коде написано, что этот самый массив, который хранится в LookUpResults, должен содержать три элемента? Где написано, что Lookup вернет массив, состоящий как минимум из трех элементов? Ты обращаешься в цикле к LookUpResults[0], LookUpResults[1] и LookUpResults[2], а вдруг там просто НЕТ LookUpResults[2]? Проверь, каков размер SafeArray, и выводи те элементы, которые там ЕСТЬ, а не те, которые ты решил, что должны быть...

блин, вопрос спустя 10 лет, но вдруг поможешь) подскажи пожалуйста, как проверить размер safeArray?

Автор: nishaknapp 16.01.2023 6:56

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://thebuzzie.com/casino-gambling-strategies/