IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Проблема с методом поиска, Проблема с поиском по нескольким записям в БД
сообщение
Сообщение #1


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


всем привет. Сделал бд в делфи ..в ней..имеется две таблицы, одна из них дочерняя , а др родительская, для каждой таблицы сделал две кнопки, которые реализуют поиски разными методами(первый метод-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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


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

Добавлено через 5 мин.
Volvo, спасибо за оперативную подсказку!) понял и исправил..не хватало еще одного аттрибута (названия поля которое должно выводиться в результате поиска!)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ошибка у тебя здесь:
Цитата
   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, и выводи те элементы, которые там ЕСТЬ, а не те, которые ты решил, что должны быть...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


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')
и всё сразу чики- чики)

Сообщение отредактировано: dron4ik -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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


Гость






Цитата(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?
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.10.2020 19:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name