Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизЗапрос Найти похожие ветки
← →
Лариса (2003-11-20 13:31) [0]Добрый день!
У меня база Access, я через Query вытащила данные из базы. В цикле хожу по записям и обрабатываю их. Цикл дошел до последней записи и я попыталась закрыть этот запрос: proverka.close; вышла ошибка: "Bof или EOF имеет значение TRUE, либо текущая запись удалена. Для выполнения операции требуется текущая запись".
Что сделать, чтобы избежать такой ошибки?
← →
Digitman (2003-11-20 13:34) [1]код приведи
← →
Fay (2003-11-20 13:37) [2]ADO?
← →
Лариса (2003-11-20 13:45) [3]Я привожу упрощенный вариант без всяких подсчетов
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;
← →
Digitman (2003-11-20 13:49) [4]а что такое q2 ? откуда тут оно взялось ?
← →
Лариса (2003-11-20 13:52) [5]q2 -это просто ошибка? я уже заметила ее
← →
Johnmen (2003-11-20 13:52) [6]http://delphimaster.net/view/3-1069069158/
← →
Лариса (2003-11-20 13:55) [7]Спасибо за ссылку, но вопрос мой она не решает
← →
Johnmen (2003-11-20 13:57) [8]Да, ссылка не решает. Но то, что там написано - полностью.
:)))
← →
chtr (2003-11-20 13:58) [9]А запрос не пустой?
← →
Лариса (2003-11-20 14:01) [10]Нет запрос не пустой.Получается, что когда первая или последняя записи и пытаешься закрыть query, то такая ошибка возникает
← →
Digitman (2003-11-20 14:14) [11]ну раз так, то попробуй явно встать на первую запись
// 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:21) [12]Не выходит. При попытке сделать close опять ошибка. Получается, что с first все нормально, а вот с закрытием проблема.
← →
Vlad (2003-11-20 14:23) [13]
> Лариса (20.11.03 14:01) [10]
Лариса, вам же сказали - это баг в АДО.
Надо ставить апдейт
← →
Лариса (2003-11-20 14:28) [14]> Vlad А зачем апдейт? И как поставить?
← →
Vlad (2003-11-20 14:30) [15]
> Лариса (20.11.03 14:28) [14]
это не тот апдейт, который SQL UPDATE
Это апдейт для АДО. Обновление.
Ставить за тем чтобы не глючило.
Ссылку не помню, где-то она тут в форуме была, поищите.
← →
Лариса (2003-11-20 14:34) [16]:) я поняла, что не тот апдейт.
Хорошо, спасибо, поищу.
← →
sniknik (2003-11-20 14:37) [17]Vlad © (20.11.03 14:30) [15]
записывать надо
пиши это сдесь http://borland.com ;о))
а еще сдесь http://se-ed.net/thaidelphicc/xml/updatepack/
← →
Digitman (2003-11-20 14:37) [18]
> Лариса
дался тебе этот АДО)
брось его, тебе же для твоей задачи не требуется ни совместимость с TDataSet ни визуализация открываемых НД, тебе просто в Excel нужно скопировать что-то из этих НД
просто создай экз-р объекта DAO.DBEngine и обращайся к нему точно так же , как если бы ты это делала в Access VBA : CreateWorkspase(), OpenDatabase(), OpenRecordset() и т.п.
минимальные накл.расходы дадут достатосно эффективный и надежный код, лишенный упомянутых "глюков"
← →
Digitman (2003-11-20 14:46) [19]просто как иллюстрация простоты подхода к решению похожей задачи :
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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c