Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с методом поиска
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
dron4ik
всем привет. Сделал бд в делфи ..в ней..имеется две таблицы, одна из них дочерняя , а др родительская, для каждой таблицы сделал две кнопки, которые реализуют поиски разными методами(первый метод-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
Так это не "метод Lookup не работает". Это ты с чего-то решил, что Lookup по второй таблице должен вернуть тебе обязательно массив, в котором будет минимум 3 элемента (с индексами 0, 1 и 2). Но LookUpResults, хоть и массив (раз проверку VarIsArray прошел), однако элементов там, как видно, меньше трех, вот тебе и выбрасывается ошибка при попытке обращения к несуществующему элементу.
dron4ik
нифига не понял(((каких еще элементов не хватает?

Добавлено через 5 мин.
Volvo, спасибо за оперативную подсказку!) понял и исправил..не хватало еще одного аттрибута (названия поля которое должно выводиться в результате поиска!)
volvo
Ошибка у тебя здесь:
Цитата
   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
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
Вот чтоб не получать ошибки - сделай то, что я написал smile.gif Выводи столько элементов, сколько есть в SafeArray-е, будет программа недоговаривать результаты - сразу поймешь, что не хватает параметров при Lookup-е. Не доводи дело до ошибки во время выполнения программы...
neveseliy2
Цитата(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
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. Casino Gambling Strategies
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.