всем привет. Сделал бд в делфи ..в ней..имеется две таблицы, одна из них дочерняя , а др родительская, для каждой таблицы сделал две кнопки, которые реализуют поиски разными методами(первый метод-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.
Так это не "метод Lookup не работает". Это ты с чего-то решил, что Lookup по второй таблице должен вернуть тебе обязательно массив, в котором будет минимум 3 элемента (с индексами 0, 1 и 2). Но LookUpResults, хоть и массив (раз проверку VarIsArray прошел), однако элементов там, как видно, меньше трех, вот тебе и выбрасывается ошибка при попытке обращения к несуществующему элементу.
нифига не понял(((каких еще элементов не хватает?
Добавлено через 5 мин.
Volvo, спасибо за оперативную подсказку!) понял и исправил..не хватало еще одного аттрибута (названия поля которое должно выводиться в результате поиска!)
Ошибка у тебя здесь:
If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox2.Items.Add(LookUpResults[i]);--ОШИБКА УКАЗЫВАЕТ СЮДА.
end
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')и всё сразу чики- чики)
Вот чтоб не получать ошибки - сделай то, что я написал Выводи столько элементов, сколько есть в SafeArray-е, будет программа недоговаривать результаты - сразу поймешь, что не хватает параметров при Lookup-е. Не доводи дело до ошибки во время выполнения программы...
If VarIsArray(LookUpResults) then
begin
for i := 0 to 2 do
listbox2.Items.Add(LookUpResults[i]);--ОШИБКА УКАЗЫВАЕТ СЮДА.
end
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/