![]() |
| ||
|
|
Новости |
Поиск |
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/Такое ощущение, что таблица почему то не закрывается, чтото ее удерживает.
kyn66 (2009-10-29 18:00:00) [1]
> Inovet © (29.10.09 17:53) [93]
Да , спасибо, уже сам нашел в хэлпе...
Dennis I. Komarov (2009-10-29 17:55:00) [2]
> Т.е. имя присваивается компонентту TADsTable?
> Типа TADsTable.Name := '#Cps1Tbl' ?
Суров...
Inovet (2009-10-29 17:53:00) [3]> [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
kyn66 (2009-10-29 17:49:00) [4]Description
CreateTableis 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.
Т.е. получается что ее можно создать во время работы программы. Да я делал и простое создание с последующим удалением физически с диска. А эта временная... потом полями ее набивать...
kyn66 (2009-10-29 17:40:00) [5]
> Inovet © (29.10.09 17:35) [90]
Т.е. имя присваивается компонентту TADsTable?
Типа TADsTable.Name := '#Cps1Tbl' ?
Inovet (2009-10-29 17:35:00) [6]> [89] kyn66 © (29.10.09 17:24)
>
> > Inovet © (28.10.09 19:52) [54]
> > Потом под временные лучше временные и применять #Cps1tbl
>
> Пардонс, упустил этот момент. Не слыхал про такой. Подробнее
> можно?
Во всём аналогичны обычным таблицам, только видны в текущем Connection, т.е. одно имя можно использовать, например, в сети и не заботиться о конфликтах, хранятся в каталоге %TEMP%, при закрытии соединения все удаляются, имя начинается с #. Не помню в какой версии ADS появились.
kyn66 (2009-10-29 17:24:00) [7]
> Inovet © (28.10.09 19:52) [54]
> Потом под временные лучше временные и применять #Cps1tbl
Пардонс, упустил этот момент. Не слыхал про такой. Подробнее можно?
kyn66 (2009-10-29 17:22:00) [8]
> Anatoly Podgoretsky © (29.10.09 16:48) [85]
> > kyn66 (29.10.2009 16:26:23) [83]Такой метод существует,
> только тебе же удалить все записи, а ты почему то про WHERE
> завел речь
В данном случае было ответвление небольшое на другую тему [72] Там удаление выполнялось выборочно. Это задета тема касаемо метода DELETE FROM Tbl
Inovet (2009-10-29 16:59:00) [9]> [86] Anatoly Podgoretsky © (29.10.09 16:49)
> > Inovet (29.10.2009 16:39:24) [84]
>
> Для полного удаления, как раз индексы не нужны, только лишний
> тормоз.
Я это специально подчеркнул
> [84] Inovet © (29.10.09 16:39)
> А для текущей задачи вообще без условия и без индексов удаление
Ещё о временной таблице я говорил имя начинается с "#" будет видна только в текущем соединении.
Anatoly Podgoretsky (2009-10-29 16:49:00) [10]> Inovet (29.10.2009 16:39:24) [84]
Для полного удаления, как раз индексы не нужны, только лишний тормоз.
Anatoly Podgoretsky (2009-10-29 16:48:00) [11]> kyn66 (29.10.2009 16:26:23) [83]
Такой метод существует, только тебе же удалить все записи, а ты почему то про WHERE завел речь
DELETE {*/ALL} FROM Tbl
Inovet (2009-10-29 16:39:00) [12]> [82] kyn66 © (29.10.09 16:23)
Да вроде всё нормально, но 30 секунд многовато, как будто индекс не используется
> [83] kyn66 © (29.10.09 16:26)
> вариант перед удалением записей удалить индексы (индексный
> файл) и потом уже их пересоздать заново, на новом наборе
> записей?
Файл сам удалится при удалении последнего индекса, только вот для DELETE они нужны как раз нужны. А для текущей задачи вообще без условия и без индексов удаление, только для DBF в отличии от ADT на место удалённых новые не будут записываться, а будут в конец.
kyn66 (2009-10-29 16:26:00) [13]Может как раз то что таблица имеет индексы и при удалении записи переиндексируются, а это занимает определенное время. Может как вариант перед удалением записей удалить индексы (индексный файл) и потом уже их пересоздать заново, на новом наборе записей?
kyn66 (2009-10-29 16:23:00) [14]
> 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 записей, если это что изменит.
Anatoly Podgoretsky (2009-10-29 16:16:00) [15]> Inovet (29.10.2009 16:12:18) [78]
Индексы тоже, их же перестраивать нужно.
kyn66 (2009-10-29 16:14:00) [16]
> Anatoly Podgoretsky © (29.10.09 16:11) [77]
Очень доходчиво и поучительно. Спасибо.
Inovet (2009-10-29 16:12:00) [17]> [75] kyn66 © (29.10.09 16:04)
> Не понятно, почему SQL так долго удаляет
Ну первое что приходит на ум - индексы не подходящие под условие WHERE, или вообще их нет.
Anatoly Podgoretsky (2009-10-29 16:12:00) [18]> kyn66 (29.10.2009 16:07:16) [76]
Привыкай или терпи, или спрашивай пояснения, как в данном случае.
Могу иногда ответить, если конечно еще буду помнить почему я так сказал.
Anatoly Podgoretsky (2009-10-29 16:11:00) [19]> kyn66 (29.10.2009 16:04:15) [75]
Потому что при EmptyTable ничего не удаляется, таблица просто обрезается, остается только заголовок. А при DELETE происходит реальное удаление, при этом может делаться много невидимой работы, например ведение журнала тразакций, если данная СУБД с этим работает, а например для DBase присходит запись в каждую строку пометки, что запись удалена.
kyn66 (2009-10-29 16:07:00) [20]
> А ты не путай оценки со своими тараканами, все правильно,
> оценка точная.
Иногда твои мысли проблематично понять...