![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не понятно что удерживает таблицу [D7, ADS]
kyn66 © (2009-10-28 12:42:00)Добрый день. Для временного хранения использую таблицу на диске. Перед использованием ее очищаю
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 15:13:00) [61]Если дело не в транзакциях, то весьма похоже на кривизну ADS
kyn66 (2009-10-28 15:11:00) [62]
> Что если при втором проходе вместо попытки очистки снчала
> попытаться открыть НЕэксклюзивно ?
Поверил, открывает без ошибки
// if Cps1Tbl.Active then
// Cps1Tbl.Close;
// Cps1Tbl.Exclusive := True;
// Cps1Tbl.EmptyTable;
// Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
kyn66 (2009-10-28 15:07:00) [63]А, типа проверить даст ли открыть впринципе, если уже кем то удерживается? Я вот тут в отладке нашел место куда заходит прога при очистке
{**********************************************************
* 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. Сейчас буду ее расковыривать дальше
Сергей М. (2009-10-28 14:59:00) [64]Ну я и иею ввиду очистку..
Что если при втором проходе вместо попытки очистки снчала попытаться открыть НЕэксклюзивно ?
kyn66 (2009-10-28 14:56:00) [65]
> Сергей М. © (28.10.09 14:51) [29]
> > kyn66Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1
> при втором проходе осуществляется успешно ?
А я ее эсклюзивом и не открываю. В Эксклюзив перевожу только для очистки и все, т.к. по другому EmptyTableне разрешит сделать.
kyn66 (2009-10-28 14:55:00) [66]2Dennis I. Komarov ©
> Close?
Эта часть кода не имеет отношения к таблице Cps1Tbl. Только с этой проблемы.
Сергей М. (2009-10-28 14:51:00) [67]
> kyn66
Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1 при втором проходе осуществляется успешно ?
Dennis I. Komarov (2009-10-28 14:46:00) [68]
> OborotQuery.Next;
> end;
> // Отбор для ЦПС
> OborotQuery.SQL.Clear;
Close?
kyn66 (2009-10-28 14:45:00) [69]
> Это как ?В одной таблице и номенклатура и движение ?!
Это пока делаю запросы через SQl, индексы мне не нужны. Потом для связки , может быть через MasterSources продумаю какие нужны индексы.
Dennis I. Komarov (2009-10-28 14:45:00) [70]Create
try
...
finally
Free;
end;
kyn66 (2009-10-28 14:40:00) [71]Вот исходник клика по пункту меню:
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;
Amoeba (2009-10-28 14:10:00) [72]
> if Cps1Tbl.Active then
> Cps1Tbl.Close;
Маленькое замечание. Проверка на Active перед Close абсолютно лишняя, она и так делается в коде, выполняемом при вызове Close.
Dennis I. Komarov (2009-10-28 14:08:00) [73]Выкинуть Table и Query и заменить одним DS
Сергей М. (2009-10-28 14:04:00) [74]
> таблица не имеет .. индексов
Это как ?
В одной таблице и номенклатура и движение ?!
Anatoly Podgoretsky (2009-10-28 14:03:00) [75]> kyn66 (28.10.2009 13:51:18) [18]
Э, а ты умеешь копировать текст из формы?
Вместо посылания черт знает куда, что бы посмотреть картинку.
Cps1Tbl: Error 7008: The spe....
Anatoly Podgoretsky (2009-10-28 13:54:00) [76]> kyn66 (28.10.2009 13:46:16) [16]
Не может быть, сообщение характерное для отладки.
Сергей М. (2009-10-28 13:53:00) [77]Выкладывай
kyn66 (2009-10-28 13:51:00) [78]Автономно ошибка выглядит вот так http://yurec66.narod.ru/Vopros/eravto.jpg
Если есть необходимость, могу выложить полный кусок кода, по нажатию на пункт меню, за вторым нажатием на который и происходит эта ошибка. Может это как то мастерам прояснит что то?
Сергей М. (2009-10-28 13:49:00) [79]А как там остоит дело с транзакциями ?
kyn66 (2009-10-28 13:46:00) [80]
> Это ты видишь при запуске под отладчиком или автономно ?
Под отладчиком, ну из Delphi запускаю. Автономно - тоже самое.