Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
ВнизНе понятно что удерживает таблицу Найти похожие ветки
← →
kyn66 © (2009-10-28 12:42) [0]Добрый день. Для временного хранения использую таблицу на диске. Перед использованием ее очищаю
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
.. Нашпиговываю данными
while not OborotQuery.EOF do
begin
Cps1Tbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value,
OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
Затем выбираю из нее данные данные по критерию
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
CpsQuery.Open;
CpsQuery.First;
while not CpsQuery.EOF do
begin
Cps2Tbl.InsertRecord([CpsQueryRegKod.Value, CpsQueryTovKod.Value, CpsQueryTovCena.Value]);
CpsQuery.Next;
end;
За первым проходом все нормально. Стоит повторно выполнить эту опреацию - ошибка именно на этом месте Cps1Tbl.EmptyTable; http://yurec66.narod.ru/Vopros/errcps1.jpg/ Такое ощущение, что таблица почему то не закрывается, чтото ее удерживает.
← →
Сергей М. © (2009-10-28 13:02) [1]
> чтото ее удерживает
CpsQuery ее удерживает - ты же не закрыл этот запрос
← →
kyn66 © (2009-10-28 13:06) [2]Закрыл, просто строка не захватилась в код
while not CpsQuery.EOF do
begin
Cps2Tbl.InsertRecord([CpsQueryRegKod.Value, CpsQueryTovKod.Value,
CpsQueryTovCena.Value]);
CpsQuery.Next;
end;
CpsQuery.Close;
← →
Anatoly Podgoretsky © (2009-10-28 13:09) [3]> kyn66 (28.10.2009 12:42:00) [0]
Между прочим, обычно приложение указывает ошибку, если нет то убери except end
← →
kyn66 © (2009-10-28 13:09) [4]Подсознательно я понимаю, что ошибка в этом коде
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
CpsQuery.Open;
CpsQuery.First;
Т.к. отключая его, ошибки не возникает. Но без этого куска никак. Вот и непонимаю, в чем дело...
← →
kyn66 © (2009-10-28 13:15) [5]Если размышлять логически без кода... Есть открытая таблица с набором данных. Выполняем запрос для олучения данных из этой таблицы. После получения запроса таблица не нужна. Закрываем ее. Обработав запрос , закрываем и его. Повторяем действия..... - в отладчике свойства таблицы:
Active - False
Exclusive - True;
Вроде все должно быть нормально. Выполняю очистку - обломс!
← →
Anatoly Podgoretsky © (2009-10-28 13:17) [6]
> Подсознательно я понимаю, что ошибка в этом коде
В этом коде ошибки нет.
← →
Сергей М. © (2009-10-28 13:18) [7]
> kyn66 © (28.10.09 13:06) [2]
>
> Закрыл
Значит не закрыл. Чудес-то не бывает)
Ставь брейкпойнт на CpsQuery.Close и лови закрытие.
Вот как поймаешь, так и поедем дальше.
← →
Anatoly Podgoretsky © (2009-10-28 13:21) [8]> Сергей М. (28.10.2009 13:18:07) [7]
Можно и не поймать, ведь никакой обработки ошибок в коде нет, есть увереность, что ошибок НИКОГДА не будет.
← →
Сергей М. © (2009-10-28 13:24) [9]
> Anatoly Podgoretsky © (28.10.09 13:21) [8]
Можно и не поймать.
Но в голове при этом должна родиться мысль - искать почему оно не клюёт
← →
kyn66 © (2009-10-28 13:31) [10]Не успел сказать об этом. Действительно, отлавливать закрытие сложно. Знать бы в каком месте ожидать подвоха, на что конкретно обратить внимание.
← →
Сергей М. © (2009-10-28 13:34) [11]
> Знать бы в каком месте ожидать подвоха
Да что там искать-то ? У тебя там всего-то дюжина строк, можно и пошагово пройтись ..
Но для начала [3]
← →
kyn66 © (2009-10-28 13:37) [12]
> Но для начала [3]
Ну так я же ошибку и указал http://yurec66.narod.ru/Vopros/errcps1.jpg
← →
kyn66 © (2009-10-28 13:40) [13]Я пошагово прошел полностью для CpsQuery.Close ТАм закрываются курсоры и т.д. и т.п. Т. е. выхода на исключения нету. А за вторым разом до брекпоинта уже не доходит, тем более я писал, что таблица принимает статус [5]
← →
Сергей М. © (2009-10-28 13:41) [14]
> я же ошибку и указал
Это ты видишь при запуске под отладчиком или автономно ?
← →
kyn66 © (2009-10-28 13:43) [15]Да, забыл добавить(плохо что форум не оборудован редактированием постов) что таблица не имеет ни индексов, ни мемо полей...
← →
kyn66 © (2009-10-28 13:46) [16]
> Это ты видишь при запуске под отладчиком или автономно ?
Под отладчиком, ну из Delphi запускаю. Автономно - тоже самое.
← →
Сергей М. © (2009-10-28 13:49) [17]А как там остоит дело с транзакциями ?
← →
kyn66 © (2009-10-28 13:51) [18]Автономно ошибка выглядит вот так http://yurec66.narod.ru/Vopros/eravto.jpg
Если есть необходимость, могу выложить полный кусок кода, по нажатию на пункт меню, за вторым нажатием на который и происходит эта ошибка. Может это как то мастерам прояснит что то?
← →
Сергей М. © (2009-10-28 13:53) [19]Выкладывай
← →
Anatoly Podgoretsky © (2009-10-28 13:54) [20]> kyn66 (28.10.2009 13:46:16) [16]
Не может быть, сообщение характерное для отладки.
← →
Anatoly Podgoretsky © (2009-10-28 14:03) [21]> kyn66 (28.10.2009 13:51:18) [18]
Э, а ты умеешь копировать текст из формы?
Вместо посылания черт знает куда, что бы посмотреть картинку.
Cps1Tbl: Error 7008: The spe....
← →
Сергей М. © (2009-10-28 14:04) [22]
> таблица не имеет .. индексов
Это как ?
В одной таблице и номенклатура и движение ?!
← →
Dennis I. Komarov © (2009-10-28 14:08) [23]Выкинуть Table и Query и заменить одним DS
← →
Amoeba © (2009-10-28 14:10) [24]
> if Cps1Tbl.Active then
> Cps1Tbl.Close;
Маленькое замечание. Проверка на Active перед Close абсолютно лишняя, она и так делается в коде, выполняемом при вызове Close.
← →
kyn66 © (2009-10-28 14:40) [25]Вот исходник клика по пункту меню:
procedure TMainFrm.N3Click(Sender: TObject);
begin
try
HaveChild := False; // Эмуляция параметра
PeriodFrm := TPeriodFrm.Create(Application);
if PeriodFrm.ShowModal = mrOK then
begin
MesFrm := TMesFrm.Create(nil);
MesFrm.Lab1.Caption := "Формируется документ, ожидайте...";
MesFrm.Show;
MesFrm.Update;
MesP := PeriodFrm.MesComboBox.ItemIndex + 1;
GodP := PeriodFrm.GodSpinEdit.AsInteger;
With DM1 do
begin
if SborTbl.Active then
SborTbl.Close;
SborTbl.Exclusive := True;
SborTbl.EmptyTable;
SborTbl.Exclusive := False;
SborTbl.Open;
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
if Cps2Tbl.Active then
Cps2Tbl.Close;
Cps2Tbl.Exclusive := True;
Cps2Tbl.EmptyTable;
Cps2Tbl.Exclusive := False;
Cps2Tbl.Open;
RegionTbl.Open;
PeriodTbl.Open;
OpsTbl.Open;
OpsTbl.First;
while not OpsTbl.EOF do
begin
if PeriodTbl.Locate("RegKod;Mes;God", VarArrayOf([OpsTblKod.Value, MesP, GodP]), []) then
begin
// Отбор по основным РУПС
OborotQuery.SQL.Clear;
OborotQuery.SQL.Add("SELECT * FROM Oborot WHERE RegKod < 200 AND PerID = :p2 ORDER BY TovKod, Cena");
OborotQuery.Params[0].Value := PeriodTblID.Value;
OborotQuery.Open;
OborotQuery.First;
while not OborotQuery.EOF do
begin
SborTbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value, Nil,
OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
// Отбор для ЦПС
OborotQuery.SQL.Clear;
OborotQuery.SQL.Add("SELECT * FROM Oborot WHERE RegKod > 200 AND PerID = :p2 ORDER BY TovKod, Cena");
OborotQuery.Params[0].Value := PeriodTblID.Value;
OborotQuery.Open;
OborotQuery.First;
while not OborotQuery.EOF do
begin
Cps1Tbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value,
OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
end;
OpsTbl.Next;
end;
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
CpsQuery.Open;
CpsQuery.First;
while not CpsQuery.EOF do
begin
Cps2Tbl.InsertRecord([CpsQueryRegKod.Value, CpsQueryTovKod.Value,
CpsQueryTovCena.Value]);
CpsQuery.Next;
end;
CpsQuery.Close;
//-------------------------------------------------------------------
// из-за ошибки дальнейшая обработка данных не реализована пока
//-------------------------------------------------------------------
Cps1Tbl.Close;
Cps2Tbl.Close;
SborTbl.Close;
RegionTbl.Close;
PeriodTbl.Close;
end;{With DM1}
MesFrm.Hide;
MesFrm.Free;
end;
finally
PeriodFrm.Close;
PeriodFrm.Free;
end;
end;
← →
Dennis I. Komarov © (2009-10-28 14:45) [26]Create
try
...
finally
Free;
end;
← →
kyn66 © (2009-10-28 14:45) [27]
> Это как ?В одной таблице и номенклатура и движение ?!
Это пока делаю запросы через SQl, индексы мне не нужны. Потом для связки , может быть через MasterSources продумаю какие нужны индексы.
← →
Dennis I. Komarov © (2009-10-28 14:46) [28]
> OborotQuery.Next;
> end;
> // Отбор для ЦПС
> OborotQuery.SQL.Clear;
Close?
← →
Сергей М. © (2009-10-28 14:51) [29]
> kyn66
Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1 при втором проходе осуществляется успешно ?
← →
kyn66 © (2009-10-28 14:55) [30]2Dennis I. Komarov ©
> Close?
Эта часть кода не имеет отношения к таблице Cps1Tbl. Только с этой проблемы.
← →
kyn66 © (2009-10-28 14:56) [31]
> Сергей М. © (28.10.09 14:51) [29]
> > kyn66Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1
> при втором проходе осуществляется успешно ?
А я ее эсклюзивом и не открываю. В Эксклюзив перевожу только для очистки и все, т.к. по другому EmptyTable не разрешит сделать.
← →
Сергей М. © (2009-10-28 14:59) [32]Ну я и иею ввиду очистку..
Что если при втором проходе вместо попытки очистки снчала попытаться открыть НЕэксклюзивно ?
← →
kyn66 © (2009-10-28 15:07) [33]А, типа проверить даст ли открыть впринципе, если уже кем то удерживается? Я вот тут в отладке нашел место куда заходит прога при очистке
{**********************************************************
* Module: TAdsDataSet.EmptyTable
* Input:
* Output:
* Description: Empty (or zaps) the table.
**********************************************************}
procedure TAdsDataSet.EmptyTable;
var
hHoldHandle : ADSHANDLE;
begin
{$IFDEF CALLTRACE }
WriteCallTrace( "TAdsDataSet.EmptyTable" );
{$ENDIF }
if Active then
begin
{ Make sure we are in browse mode or raise exception }
CheckBrowseMode;
{ If the table is active then use the active handle and zap }
ACECheck( self, ACE.AdsZapTable( self.Handle ) );
{ Clear all buffers }
ClearBuffers;
{ Cause a dataevent to let event handler know that the DataSet has changed }
DataEvent( deDataSetChange, 0 );
end
else
begin
hHoldHandle := OpenAdvantageFiles;
try
{ Open a temporary table and zap the table }
ACECheck( self, ACE.AdsZapTable( hHoldHandle ) );
except
ACECheck( self, ACE.AdsCloseTable( hHoldHandle ) );
raise;
end;
ACECheck( self, ACE.AdsCloseTable( hHoldHandle ) );
end;
end;
Переходит сразу в "жирный" блок. Значит говорит о чем, что таблица уже имеет статус неактивности. Ошибка вылетает в процедуре ACECheck. Сейчас буду ее расковыривать дальше
← →
kyn66 © (2009-10-28 15:11) [34]
> Что если при втором проходе вместо попытки очистки снчала
> попытаться открыть НЕэксклюзивно ?
Поверил, открывает без ошибки
// if Cps1Tbl.Active then
// Cps1Tbl.Close;
// Cps1Tbl.Exclusive := True;
// Cps1Tbl.EmptyTable;
// Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
← →
Сергей М. © (2009-10-28 15:13) [35]Если дело не в транзакциях, то весьма похоже на кривизну ADS
← →
Anatoly Podgoretsky © (2009-10-28 15:28) [36]
> kyn66 © (28.10.09 14:40) [25]
Не будет это работать, ресурсы не защены.
← →
kyn66 © (2009-10-28 15:33) [37]Вот нашел конкретное место, где сваливает на ошибку
hHoldHandle := OpenAdvantageFiles;(из предыдущего куска кода)
Выложу уже и его , может какие мысли появятся...
{*******************************************************************************
* Module: TAdsTable.OpenAdvantageFiles
* Input:
* Output:
* Return: ADSHANDLE - Handle of open table
* Description: Opens the table and the associated indexes
*******************************************************************************}
function TAdsTable.OpenAdvantageFiles : ADSHANDLE;
...
Форум не позволяет вставить полностью код этой функции
← →
kyn66 © (2009-10-28 15:35) [38]
> Anatoly Podgoretsky © (28.10.09 15:28) [36]
А в каком конкретно месте смущает и что именно?
← →
Anatoly Podgoretsky © (2009-10-28 15:41) [39]> kyn66 (28.10.2009 15:35:38) [38]
Меня смущает весь код, его надо полностью переписывать.
Суть в try finally, у тебя оно ничего не защищает, а точнее наоборот. Например создание формы должно быть до try и внутри должны быть защищены все ресурсы.
В третьих для отладки надо создать мини код, ничего кроме Cps1Tbl.EmptyTable; и обрамляющего его кода. Может ты не там ищешь где потерял, а там где светлее.
← →
kyn66 © (2009-10-28 15:50) [40]
> Anatoly Podgoretsky © (28.10.09 15:41) [39]
....... м-да, логично. Нужно минимизировать код для проверки. Суть в try finally у меня в корректном закрытии промежуточной формы (PeriodFrm) и только. Т.к мне дважды пришлось бы выполнять код
PeriodFrm.Close;
PeriodFrm.Free;
в зависимости от модальности закрытия этой формы. Ну я так нашел применение.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.009 c