![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос [D5, Access]
Лариса © (2003-11-20 13:31:00)
Добрый день!
У меня база Access, я через Query вытащила данные из базы. В цикле хожу по записям и обрабатываю их. Цикл дошел до последней записи и я попыталась закрыть этот запрос: proverka.close; вышла ошибка: "Bof или EOF имеет значение TRUE, либо текущая запись удалена. Для выполнения операции требуется текущая запись".
Что сделать, чтобы избежать такой ошибки?
Digitman (2003-11-20 14:46:00) [1]
просто как иллюстрация простоты подхода к решению похожей задачи :
procedure LoadDBEngine;
begin
try
DBEngine := CreateOleObject("DAO.DBEngine.36");
except
try
DBEngine := CreateOleObject("DAO.DBEngine.35");
except
DBEngine := Null;
raise;
end;
end;
end;
var
Ws: OleVariant;
Db: OleVariant;
Rs: OleVariant;
begin
NfoPartBaseFound := False;
NfoPartRFound := False;
try
try
LoadDBEngine;
DBEngine.SystemDB := ArgoWGPath;
Ws := DBEngine.CreateWorkspace("", ArgoDBUserName, ArgoDBUserPwd, 2);
Db := Ws.OpenDataBase(ArgoDBPath, False, True, EmptyParam);
Rs := Db.OpenRecordSet("SELECT Sum(Kol1) AS TotalQty FROM [Запчасти " + ArgoDBDefStock + "] WHERE Kol1 IS NOT NULL GROUP BY Cod HAVING Cod LIKE "" + NfoOrigPartNo + """);
NfoPartBaseFound := True;
if Rs.RecordCount > 0 then
begin
NfoPartR := Rs.Fields["TotalQty"].Value;
NfoPartR := Round(NfoPartR * 1000)/1000;
NfoPartRFound := True;
end;
except
on e:Exception do
begin
if e is EOleSysError then
with EOleSysError(e) do
case loword(errorcode) of
499: DBEerrmsg := "Программное обеспечение доступа к базам данных MS DAO не установлено";
3028: DBEerrmsg := "Файл рабочей группы не найден";
3358: DBEerrmsg := "Файл рабочей группы поврежден";
3029: DBEerrmsg := "Неверное имя пользователя и/или пароль пользователя рабочей группы";
3024: DBEerrmsg := "Файл базы данных не найден";
3343: DBEerrmsg := "Файл базы данных поврежден";
3078: DBEerrmsg := "В базе данных не найдена таблица со сведениями о состоянии склада";
3112: DBEerrmsg := "Нет прав на чтение инф-ции о состоянии склада";
else
DBEerrmsg := "Незарегистрированное исключение EOleSysError, код: " + IntToStr(loword(errorcode)) + ", описание: " + e.Message;
end
else
DBEerrmsg := "Незарегистрированное исключение, класс: " + e.ClassName + ", описание: " + e.Message;
end;
end;
finally
Rs := Unassigned;
Db := Unassigned;
Ws := Unassigned;
end;
Digitman (2003-11-20 14:37:00) [2]
> Лариса
дался тебе этот АДО)
брось его, тебе же для твоей задачи не требуется ни совместимость с TDataSet ни визуализация открываемых НД, тебе просто в Excel нужно скопировать что-то из этих НД
просто создай экз-р объекта DAO.DBEngine и обращайся к нему точно так же , как если бы ты это делала в Access VBA : CreateWorkspase(), OpenDatabase(), OpenRecordset() и т.п.
минимальные накл.расходы дадут достатосно эффективный и надежный код, лишенный упомянутых "глюков"
sniknik (2003-11-20 14:37:00) [3]
Vlad © (20.11.03 14:30) [15]
записывать надо
пиши это сдесь http://borland.com;о))
а еще сдесь http://se-ed.net/thaidelphicc/xml/updatepack/
Лариса (2003-11-20 14:34:00) [4]
:) я поняла, что не тот апдейт.
Хорошо, спасибо, поищу.
Vlad (2003-11-20 14:30:00) [5]
> Лариса (20.11.03 14:28) [14]
это не тот апдейт, который SQL UPDATE
Это апдейт для АДО. Обновление.
Ставить за тем чтобы не глючило.
Ссылку не помню, где-то она тут в форуме была, поищите.
Лариса (2003-11-20 14:28:00) [6]
> Vlad А зачем апдейт? И как поставить?
Vlad (2003-11-20 14:23:00) [7]
> Лариса (20.11.03 14:01) [10]
Лариса, вам же сказали - это баг в АДО.
Надо ставить апдейт
Лариса (2003-11-20 14:21:00) [8]
Не выходит. При попытке сделать close опять ошибка. Получается, что с first все нормально, а вот с закрытием проблема.
Digitman (2003-11-20 14:14:00) [9]
ну раз так, то попробуй явно встать на первую запись
// cnt.Close; // никчему держать НД подолгу открытым
//задали параметры
cnt.parameters[0].value:=gruz["gr"];
cnt.parameters[1].value:=gruz["soob"];
//попытались открыть НД
cnt.open;
try
cnt.First; //успешно открыли, пытаемся встать на 1-ю запись НД, предполагая что RecordCount > 0
try
//успешно встали на 1-ю запись, читаем ее
worksheet.cells.item[i,1].value:=cnt["vs"];
finally
// НД больше незачем держать открытым, тут же закрываем его безусловно
cnt.Close; //!!
end;
except
.. // что-то с First не так, принимаем меры
end;
Лариса (2003-11-20 14:01:00) [10]
Нет запрос не пустой.Получается, что когда первая или последняя записи и пытаешься закрыть query, то такая ошибка возникает
chtr (2003-11-20 13:58:00) [11]
А запрос не пустой?
Johnmen (2003-11-20 13:57:00) [12]
Да, ссылка не решает. Но то, что там написано - полностью.
:)))
Лариса (2003-11-20 13:55:00) [13]
Спасибо за ссылку, но вопрос мой она не решает
Johnmen (2003-11-20 13:52:00) [14]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1069069158&n=1
Лариса (2003-11-20 13:52:00) [15]
q2 -это просто ошибка? я уже заметила ее
Digitman (2003-11-20 13:49:00) [16]
а что такое q2 ? откуда тут оно взялось ?
Лариса (2003-11-20 13:45:00) [17]
Я привожу упрощенный вариант без всяких подсчетов
gruz.close;
gruz.parameters[0].value:="51";
gruz.parameters[1].value:=trim(edit1.text);
gruz.open;
gruz.first;
while not (q2.eof) do begin
вывожу данные в Excel
worksheet.cells.item[i,1].value:=gruz["gr"];
подсчитываю по грузу количество
cnt.close; вот на этой строке выдается ошибка. То есть первый раз проходит нормально, а после перехода на следующую строку и возвращения на эту команду выдается ошибка
cnt.parameters[0].value:=gruz["gr"];
cnt.parameters[1].value:=gruz["soob"];
cnt.open;
worksheet.cells.item[i,1].value:=cnt["vs"];
gruz.next;
end;
Fay (2003-11-20 13:37:00) [18]
ADO?
Digitman (2003-11-20 13:34:00) [19]
код приведи