Форум: "Начинающим";
Текущий архив: 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;
в зависимости от модальности закрытия этой формы. Ну я так нашел применение.
← →
kyn66 © (2009-10-28 16:14) [41]НУ что, по совету уважаемого Anatoly Podgoretsky я сделал тестирование минимального кода с последовательным добавлением кусков (пронумированы)
procedure TMainFrm.Button1Click(Sender: TObject);
Var
i : Integer;
begin
With DM1 do
begin
//----------------- 1 -----------------------
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
//----------------- 2 -----------------------
for i := 1 to 10 do
begin
Cps1Tbl.InsertRecord([i, i + 1, i + 2, i + 3, i + 4,
i + 5, i + 6, i + 7, i + 8,
i + 9, i + 2]);
end;
//----------------- 3 -----------------------
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
CpsQuery.Open;
CpsQuery.First;
end;
end;
Все шло нормально(последовательные циклы нажатия на кнопку запуска кода) до вставки 3-го блока. После второго запуска вылетает ранее указанная ошибка 7008. Какие будут соображения?
Для дополнительного размышления... До вставки третьего блока я запускал первые два нормально. Потом параллельно в менеджере ADS(Advantage Data Architect) открыл на просмотр таблицу Cps1. Незамедлительно при следующем запуске кода вылетает ошибка 7008.
← →
Сергей М. © (2009-10-28 16:28) [42]
> в менеджере ADS(Advantage Data Architect) открыл на просмотр
> таблицу Cps1
И при этом требуешь от Cps1Tbl монопольного доступа к таблице ?!
← →
kyn66 © (2009-10-28 16:34) [43]
> И при этом требуешь от Cps1Tbl монопольного доступа к таблице
> ?!
Так это ж как вариант проверки. Вы не поверите, но я кажется нашел причину. Все дело в кактокривосозданности таблицы Cps1. Выполняю аналогичные действия с другими таблицами - все проходит. Возвращаюсь опять к Cps1 - опять ошибка. А вы говорите нет мистики.... Таблицы идентичны. Просто в одной из них (а может и в обеих, оже не помню) мыла попытка создания индекса, с последующим его удалением. Может там в заголовке чего мусор какой остался?
← →
Сергей М. © (2009-10-28 16:39) [44]
> Так это ж как вариант проверки
Так она ж заведомо не пройдет, эта проверка ..
← →
Anatoly Podgoretsky © (2009-10-28 16:48) [45]> kyn66 (28.10.2009 16:14:41) [41]
Тогда это не отработает Cps1Tbl.Exclusive := True;
← →
kyn66 © (2009-10-28 16:48) [46]Да, поспешил обрадоваться, ошибка осталась при самом минимальном коде
procedure TMainFrm.Button1Click(Sender: TObject);
Var
i : Integer;
begin
With DM1 do
begin
//----------------- 1 -----------------------
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
//----------------- 2 -----------------------
for i := 1 to 10 do
begin
Cps1Tbl.InsertRecord([i, i + 1, i + 2, i + 3, i + 4,
i + 5, i + 6, i + 7, i + 8,
i + 9, i + 2]);
end;
//----------------- 3 -----------------------
// CpsQuery.SQL.Clear;
// CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
// CpsQuery.Open;
// CpsQuery.First;
// CpsQuery.Close;
//----------------- 4 -----------------------
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add("SELECT * FROM Cps");
CpsQuery.Open;
CpsQuery.First;
CpsQuery.Close;
end;
end;
Компонент Cps1Tbl связял с таблицей Cps. В надежде, что ошибка была из за структуры первой. Значит именно сам запрос как то влияет на эту таблицу
← →
kyn66 © (2009-10-28 16:51) [47]
> Anatoly Podgoretsky © (28.10.09 16:48) [45]
Как раз с Exclusive проблем нет, ошибку выдает как и раньше на EmtyTable
← →
Anatoly Podgoretsky © (2009-10-28 16:58) [48]> kyn66 (28.10.2009 16:51:47) [47]
Естественно, ошибка при применение, а не при установке
← →
Сергей М. © (2009-10-28 17:02) [49]
> с Exclusive проблем нет
А с ним по идее и не должно быть проблем.
Фактическую попытку монопольного доступа к таблице осуществляет именно EmtyTable.
← →
kyn66 © (2009-10-28 17:16) [50]
Сергей М. © (28.10.09 17:02) [49]
> Фактическую попытку монопольного доступа к таблице осуществляет
> именно EmtyTable.
Так как раз методом Exclusive := True мы ему в этом и помогаем выполнить без ошибок. Даже если принять во внимание тот факт, что при "первом проходе" ошибки нет, а стоит нам не установить Exclusive := True, то и EmptyTable не отработает корректно. Значит получается, что и при первом и при втором проходах Exclusive устанавливается в True. А дает ли он монопольность таблице после своей "второй" отработки? Вот в чем вопрос. А может здесь искать нужно первопричину?
← →
SergeyIT © (2009-10-28 17:54) [51]Когда-то работал с БД из дельфи, но вот TTable не использовал, все через TQuery. C Table (не ADO) какие-то заморочки были...
← →
turbouser © (2009-10-28 18:30) [52]Точно EmptyTable закрывает таблицу? А если сделать
with Cps1Tbl do
begin
if Active then
Close;
Exclusive := True;
EmptyTable;
if Active then
Close;
Exclusive := False;
Open;
end
← →
Inovet © (2009-10-28 18:56) [53]Короче. Всю ветку не стал читать. ADS может оставлять файлы открытыми после закрытия Query для более быстрого открытия в следующий раз, не знаю как это с данной проблемой с очичткой таблицы соотносится. Попробую AdsCloseSQLStatement - закрывает все.
← →
Inovet © (2009-10-28 19:52) [54]> [53] Inovet © (28.10.09 18:56)
А чем "DELETE FROM Cps1tbl" не устраивает или у тебя DBF? Потом под временные лучше временные и применять #Cps1tbl
← →
Amoeba © (2009-10-28 21:13) [55]
> if Active then
> Close;
Уже говорилось, что
if Active then
это абсолютно излишне. Эта проверка и так будет сделана при выполнении Close - эта процедура устанавливает Active в False, и проверка будет сделана в сетере.
← →
turbouser © (2009-10-29 00:01) [56]
> Amoeba © (28.10.09 21:13) [55]
> это абсолютно излишне
:) не факт. компоненты разные бывают.
← →
Amoeba © (2009-10-29 01:17) [57]
> turbouser © (29.10.09 00:01) [56]
>
>
> > Amoeba © (28.10.09 21:13) [55]
>
>
> > это абсолютно излишне
>
> :) не факт. компоненты разные бывают.
Если правильный наследник TDataSet, то факт.
← →
turbouser © (2009-10-29 02:07) [58]
> Amoeba © (29.10.09 01:17) [57]
>
>
> Если
← →
kyn66 © (2009-10-29 09:24) [59]
> turbouser © (28.10.09 18:30) [52]
> Точно EmptyTable закрывает таблицу? А если сделать
Похоже на закрытие силком :). Дело в том, что EmptyTable не начнет свою работу, пока таблица активна. Выдается ошибочное сообщение. Поэтому повторное закрытие совершеннот никчему.
← →
kyn66 © (2009-10-29 09:30) [60]
> А чем "DELETE FROM Cps1tbl" не устраивает или у тебя DBF?
> Потом под временные лучше временные и применять #Cps1t
Так здесь не удалять нужно. Сперва с одной таблицы(OborotTbl) идет разделенный отбор в две другие(SborTbl и Cps1Tbl) таблицы, данные одной из которых(Cps1) в последствии подвергаются отбору по критерию CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod") Вот такая технология.
← →
kyn66 © (2009-10-29 10:05) [61]
> Inovet © (28.10.09 18:56) [53]
> Короче. Всю ветку не стал читать. ADS может оставлять файлы
> открытыми после закрытия Query для более быстрого открытия
> в следующий раз, не знаю как это с данной проблемой с очичткой
> таблицы соотносится. Попробую AdsCloseSQLStatement - закрывает
> все.
AdsCloseSQLStatement
Completely closes all files associated with any TAdsQuery instance.
Вроде заработало, однако нужно предварительно закрывать CpsQuery.Close . Тогда определение назначения не совсем понятно.
← →
Anatoly Podgoretsky © (2009-10-29 10:16) [62]> kyn66 (29.10.2009 09:30:00) [60]
А что по твоему делает EmptyTable в рамках твоей задачи?
← →
Anatoly Podgoretsky © (2009-10-29 10:17) [63]И также учитывая твои способности.
← →
kyn66 © (2009-10-29 10:31) [64]
Anatoly Podgoretsky © (29.10.09 10:16) [62]
> А что по твоему делает EmptyTable в рамках твоей задачи?
Пардон, действительно пропустил суть своего-же вопроса...
> Anatoly Podgoretsky © (29.10.09 10:17) [63]
> И также учитывая твои способности.
А это к чему?
← →
Anatoly Podgoretsky © (2009-10-29 11:31) [65]> kyn66 (29.10.2009 10:31:04) [64]
Это к тому, что их недостаточно для быстрого решения простейшей задачи.
← →
Inovet © (2009-10-29 12:51) [66]> Тогда определение назначения не совсем понятно.
Закрытие на уровне файлов закрытых Query. Не стоит её тыркать куда не попадя. Вот твоя задача мне не очень понятна всё к тому чтобы отсортировать и без дублей что ли: вводишь данные, "Затем выбираю из нее данные данные по критерию", затем в другой раз старые удаляешь
← →
kyn66 © (2009-10-29 14:58) [67]
> Inovet © (29.10.09 12:51) [66]
Да нет конечно, повторно ничего не нужно делать. Это я просто случайно нажал второй раз и вышла такая ситуация. Вот и решил ее устранить, т.к. юзер тоже может повторить такие же действия ни о чем не думая.
Мне твое предложение подошло очень даже. Все пошло работать как надо. Большое спасибо за совет.
← →
kyn66 © (2009-10-29 15:00) [68]
> Anatoly Podgoretsky © (29.10.09 11:31) [65]
> > kyn66 (29.10.2009 10:31:04) [64]Это к тому, что их недостаточно
> для быстрого решения простейшей задачи.
Ну не всем же носить ордена мастера.... No comments. Некоторые (Inovet) даже дельные советы дают, реально помогающие, прошу заметить...
← →
Anatoly Podgoretsky © (2009-10-29 15:01) [69]> kyn66 (29.10.2009 15:00:08) [68]
Ну вот наконец и обругал, а сначала приличным прикидывался.
← →
Inovet © (2009-10-29 15:46) [70]> Мне твое предложение подошло очень даже. Все пошло работать
> как надо. Большое спасибо за совет.
Пожалуйста, вот только за какой из
> [53] Inovet © (28.10.09 18:56)
> [54] Inovet © (28.10.09 19:52)
← →
kyn66 © (2009-10-29 15:49) [71]
> Inovet © (29.10.09 15:46) [70]
[53] - точно в цель! Спасибо еще раз.
← →
Inovet © (2009-10-29 15:53) [72]> [71] kyn66 © (29.10.09 15:49)
>
> > Inovet © (29.10.09 15:46) [70]
>
> [53] - точно в цель! Спасибо еще раз.
А на
[54] Inovet © (28.10.09 19:52)
ты не ответил. Мне вот этот метод больше нравится.
← →
kyn66 © (2009-10-29 15:55) [73]
> Anatoly Podgoretsky © (29.10.09 15:01) [69]
> > kyn66 (29.10.2009 15:00:08) [68]Ну вот наконец и обругал,
> а сначала приличным прикидывался.
Да и не думал даже обругивать. Просто форум, тем более ветка "Начинающим" и служит для того, чтобы более грамотные товарищи помогали своим начинающим, неопытным и т.д. коллегам, а не хвалились своим мастерством по отношению к слабейшим. И тем более не красиво высказывать свои оскорбления И также учитывая твои способности.... Это к тому, что их недостаточно для быстрого решения простейшей задачи. в их сторону. Модерам, сорри за офтоп.
← →
Anatoly Podgoretsky © (2009-10-29 15:59) [74]> kyn66 (29.10.2009 15:55:13) [73]
А ты не путай оценки со своими тараканами, все правильно, оценка точная.
← →
kyn66 © (2009-10-29 16:04) [75]
> Inovet © (29.10.09 15:53) [72]
>Мне вот этот метод больше нравится.
Так это как разновидность метода очистки. Просто EmptyTable как то раньше , на автомате на ум пришло. А вот насчет очистки с помощью
SQL у меня есть непонятки. Когда то задавал вопрос на форуме, но так и не получил ответа. Удаляю из таблицы с 1630918 записями , ну к примеру 110000 строк. Так вот процесс удаления DELETE FROM занимает некоторое продолжительное время, ну где то сек 30. Не понятно, почему SQL так долго удаляет
← →
kyn66 © (2009-10-29 16:07) [76]
> А ты не путай оценки со своими тараканами, все правильно,
> оценка точная.
Иногда твои мысли проблематично понять...
← →
Anatoly Podgoretsky © (2009-10-29 16:11) [77]> kyn66 (29.10.2009 16:04:15) [75]
Потому что при EmptyTable ничего не удаляется, таблица просто обрезается, остается только заголовок. А при DELETE происходит реальное удаление, при этом может делаться много невидимой работы, например ведение журнала тразакций, если данная СУБД с этим работает, а например для DBase присходит запись в каждую строку пометки, что запись удалена.
← →
Inovet © (2009-10-29 16:12) [78]> [75] kyn66 © (29.10.09 16:04)
> Не понятно, почему SQL так долго удаляет
Ну первое что приходит на ум - индексы не подходящие под условие WHERE, или вообще их нет.
← →
Anatoly Podgoretsky © (2009-10-29 16:12) [79]> kyn66 (29.10.2009 16:07:16) [76]
Привыкай или терпи, или спрашивай пояснения, как в данном случае.
Могу иногда ответить, если конечно еще буду помнить почему я так сказал.
← →
kyn66 © (2009-10-29 16:14) [80]
> Anatoly Podgoretsky © (29.10.09 16:11) [77]
Очень доходчиво и поучительно. Спасибо.
← →
Anatoly Podgoretsky © (2009-10-29 16:16) [81]> Inovet (29.10.2009 16:12:18) [78]
Индексы тоже, их же перестраивать нужно.
← →
kyn66 © (2009-10-29 16:23) [82]
> Inovet © (29.10.09 16:12) [78]
> > [75] kyn66 © (29.10.09 16:04)> Не понятно, почему SQL
> так долго удаляетНу первое что приходит на ум - индексы
> не подходящие под условие WHERE, или вообще их нет.
Да нет, индексы есть, правда составной по двум полям "Tir;Nom" - к примеру и вот удаляю так
...
SQL.Add("DELETE FROM TiragSL WHERE Tir = :p1");
Params[0].Value := tir;
ExecSQL;
...
Tir - как раз и есть поле с индексом. Пардон, удаляю с таблицы, в которой 2937140 записей, если это что изменит.
← →
kyn66 © (2009-10-29 16:26) [83]Может как раз то что таблица имеет индексы и при удалении записи переиндексируются, а это занимает определенное время. Может как вариант перед удалением записей удалить индексы (индексный файл) и потом уже их пересоздать заново, на новом наборе записей?
← →
Inovet © (2009-10-29 16:39) [84]> [82] kyn66 © (29.10.09 16:23)
Да вроде всё нормально, но 30 секунд многовато, как будто индекс не используется
> [83] kyn66 © (29.10.09 16:26)
> вариант перед удалением записей удалить индексы (индексный
> файл) и потом уже их пересоздать заново, на новом наборе
> записей?
Файл сам удалится при удалении последнего индекса, только вот для DELETE они нужны как раз нужны. А для текущей задачи вообще без условия и без индексов удаление, только для DBF в отличии от ADT на место удалённых новые не будут записываться, а будут в конец.
← →
Anatoly Podgoretsky © (2009-10-29 16:48) [85]> kyn66 (29.10.2009 16:26:23) [83]
Такой метод существует, только тебе же удалить все записи, а ты почему то про WHERE завел речь
DELETE {*/ALL} FROM Tbl
← →
Anatoly Podgoretsky © (2009-10-29 16:49) [86]> Inovet (29.10.2009 16:39:24) [84]
Для полного удаления, как раз индексы не нужны, только лишний тормоз.
← →
Inovet © (2009-10-29 16:59) [87]> [86] Anatoly Podgoretsky © (29.10.09 16:49)
> > Inovet (29.10.2009 16:39:24) [84]
>
> Для полного удаления, как раз индексы не нужны, только лишний
> тормоз.
Я это специально подчеркнул
> [84] Inovet © (29.10.09 16:39)
> А для текущей задачи вообще без условия и без индексов удаление
Ещё о временной таблице я говорил имя начинается с "#" будет видна только в текущем соединении.
← →
kyn66 © (2009-10-29 17:22) [88]
> Anatoly Podgoretsky © (29.10.09 16:48) [85]
> > kyn66 (29.10.2009 16:26:23) [83]Такой метод существует,
> только тебе же удалить все записи, а ты почему то про WHERE
> завел речь
В данном случае было ответвление небольшое на другую тему [72] Там удаление выполнялось выборочно. Это задета тема касаемо метода DELETE FROM Tbl
← →
kyn66 © (2009-10-29 17:24) [89]
> Inovet © (28.10.09 19:52) [54]
> Потом под временные лучше временные и применять #Cps1tbl
Пардонс, упустил этот момент. Не слыхал про такой. Подробнее можно?
← →
Inovet © (2009-10-29 17:35) [90]> [89] kyn66 © (29.10.09 17:24)
>
> > Inovet © (28.10.09 19:52) [54]
> > Потом под временные лучше временные и применять #Cps1tbl
>
> Пардонс, упустил этот момент. Не слыхал про такой. Подробнее
> можно?
Во всём аналогичны обычным таблицам, только видны в текущем Connection, т.е. одно имя можно использовать, например, в сети и не заботиться о конфликтах, хранятся в каталоге %TEMP%, при закрытии соединения все удаляются, имя начинается с #. Не помню в какой версии ADS появились.
← →
kyn66 © (2009-10-29 17:40) [91]
> Inovet © (29.10.09 17:35) [90]
Т.е. имя присваивается компонентту TADsTable?
Типа TADsTable.Name := "#Cps1Tbl" ?
← →
kyn66 © (2009-10-29 17:49) [92]Description
CreateTable is used to create a new table defined by the current dataset"s field definitions. If the table already exists, CreateTable will overwrite the table’s data and structure. To avoid overwriting an existing table, check the Exists property before calling CreateTable. If the name of the table begins with the # character, the newly created table will be a temporary table that is only visible on the current connection.
Т.е. получается что ее можно создать во время работы программы. Да я делал и простое создание с последующим удалением физически с диска. А эта временная... потом полями ее набивать...
← →
Inovet © (2009-10-29 17:53) [93]> [91] kyn66 © (29.10.09 17:40)
>
> > Inovet © (29.10.09 17:35) [90]
>
>
> Т.е. имя присваивается компонентту TADsTable?
> Типа TADsTable.Name := "#Cps1Tbl" ?
Не, компонент - это обёртка над API.
Examples:// Create a temporary table named Temp1 with two columns
CREATE TABLE #Temp1 ( Name Char( 30 ), seqid integer );
// Пользуемся
INSERT INTO #Temp1 (Name, seqid) VALUES ("Test 123", 123)
SELECT * FROM #Temp1
// Можно удалить или удалится при закрытии Connection
DROP TABLE #Temp1
Ещё из справки пример// This example creates two temporary tables for intermediate results
// Step 1. Create a temporary table named DeptCount and at the same time
// populate it with summary data from an existing table in the
// database
SELECT deptnum, count(*) as NumEmployees
INTO #DeptCount
FROM employees
GROUP BY deptnum
// Step 2. Create another temporary table named LocCount which list the
// number of employees in each location for each department.
SELECT deptnum, location, count(*) as cnt
INTO #LocCount
FROM employees
GROUP BY deptnum, location
// Finally using the 2 temporary tables to list the percent of employee
// on each location for each department
SELECT a.deptnum, a.location, ( a.cnt * 100 ) / b.NumEmployees As PercentAtLocation
FROM #LocCount a, #DeptCount b
WHERE a.deptnum = b.deptnum
← →
Dennis I. Komarov © (2009-10-29 17:55) [94]
> Т.е. имя присваивается компонентту TADsTable?
> Типа TADsTable.Name := "#Cps1Tbl" ?
Суров...
← →
kyn66 © (2009-10-29 18:00) [95]
> Inovet © (29.10.09 17:53) [93]
Да , спасибо, уже сам нашел в хэлпе...
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
Память: 0.74 MB
Время: 0.007 c