Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизКак програмно отлючить связь между таблицами? Найти похожие ветки
← →
Hirara (2003-02-27 22:10) [0]Дело вот в чем : у меня связано две таблицы (TTable) через Masrefield, в результате получается что в зависимой таблице видны только те записи , которые соответсвуют первой(типа так и должно быть), но мне надо вычислить общее количество записей в зависимой таблице, а RecordCount так не может, так вот, как мне узнать общее количество записей?
← →
MsGuns (2003-02-27 23:13) [1]Дай запрос на таблицу:
Var
MyQ : TQuery;
qrec: integer;
...
MyQ := TQuery.Create(MyDataBase);
MyQ.SQL.Add("SELECT COUNT(*) FROM DetailTable");
qrec := -1;
try
MyQ.Prepare;
MyQ.Open;
qrec := MyQ.Fields[0].AsInteger;
finally
MyQ.Close;
MyQ := nil;
end;
← →
Hirara (2003-02-27 23:33) [2]может я щас ступлю, но может прокомментируеш?
← →
MsGuns (2003-02-28 00:02) [3]Связанным у тебя является КУРСОР, созданный на детальную таблицу с помощью двух компонент класса TTable или TQuery. В рамках этого курсора (детала), ты действительно видишь только подмножество записей всей таблицы. Но кто тебе мешает взять другой компонент, связать его с этим же самым деталом и юзать его как тебе угодно !
В данном примере я использую запрос, так как сами записи меня не интересуют, а нужно узнать их кол-во в физ.таблице. Чтобы не загромождать проект лишними "одноразовыми" компонентами, в данном примере создается экземпляр запроса (TQuery), используется как надо, а затем "выбрасывается", чтобы освободить ресурсы.
Хотя мне кажется, что данная проблема (узнать общее кол-во записей во всей таблице) в данном контексте (связка Мастер-Детал) несколько надуманна. Но, не зная сути решаемой задачи, что-либо более определенное сказать сложно
← →
MsGuns (2003-02-28 00:09) [4]Защищенный блок TRY.. FINALLY/EXCEPT надо использовать ВСЕГДА.
- Во-первых, запрос может не "пройти" по разным причинам (повреждение таблицы, блокировка другим пользователем и т.д.)
- Во-вторых, это вообще постулат ПРАВИЛЬНОГО СТИЛЯ написания запросов. Об этом даже во всех умных книжках написано (и, кстати, дельфишных справках тоже)
← →
kaif (2003-02-28 00:54) [5]2 MsGuns © (27.02.03 23:13)
>Защищенный блок TRY.. FINALLY/EXCEPT надо использовать ВСЕГДА.
Позволю себе исправить Ваш текст:
MyQ := TQuery.Create(MyDataBase);
MyQ.SQL.Add("SELECT COUNT(*) FROM DetailTable");
qrec := -1;
try
MyQ.Prepare;
MyQ.Open;
qrec := MyQ.Fields[0].AsInteger;
finally
MyQ.Close;
MyQ.Free;
MyQ := nil;
end;
Присвоение указателю MyQ значения nil не удаляет компонент, а лишь теряет указатель на него. И хотя при завершении работы приложения, все созданные компоненты удалятся, но лишь с удалением компонента MyDataBase, который назначался в конструкторе в данном случае владельцем этих компонентов запросов. А если программу не вырубать долго, но часто вызывать данную процедуру, то будет происходить утечка памяти.
Предлагаю более кратко записанный верный код:
Var
qrec: integer;
...
qrec := -1;
with TQuery.Create(nil) do
try
SQL.Text := "SELECT COUNT(*) FROM DetailTable";
Open;
qrec := Fields[0].AsInteger;
finally
Free;
end;
С уважением.
← →
Hirara (2003-02-28 17:26) [6]спасибо конечно, но почему в запросе в месте где должны быть поля таблицы указывается count(*)?
И еще : qrec := Fields[0].AsInteger; здесь насколько я знаю берется значение из первого поля таблицы в текущей записи? или я чо то не то понял??
← →
MsGuns (2003-02-28 18:01) [7]>kaif © (28.02.03 00:54)
Спасибо за поправку. Что касается Free, то без комментариев. Что же касается "укрорченности", то это дело вкуса и стиля. Хотя Ваш алгоритм, ИХО, красивее. Только требует нЕсколько большего понимания принципов ООП, чего у автора сабжа, ИМХО, нет пока ;))
>Hirara © (28.02.03 17:26)
>спасибо конечно, но почему в запросе в месте где должны быть поля таблицы указывается count(*)?
Я же написал в пояснениях, что мне не нужны собственно записи (т.е. содержимое любого из полей/колонок), а требуется только подсчитаьб ОБЩЕЕ их число.
>И еще : qrec := Fields[0].AsInteger; здесь насколько я знаю берется значение из первого поля таблицы в текущей записи? или я чо то не то понял??
Данный мною и "приглаженный" kaif © (28.02.03 00:54) образец запроса вернет ОДНУ запись, состоящую из ОДНОГО поля.
← →
Val (2003-02-28 18:02) [8]>Hirara © (28.02.03 17:26)
LocalSQLHelp.
Как вариант:
1.отключить мастер-таблицу и поле,
2.RecordCount,
3.подключить обратно.
← →
MsGuns (2003-02-28 18:04) [9]>kaif © (28.02.03 00:54)
Спасибо за поправку. Что касается Free, то без комментариев. Что же касается "укорченности", то это дело вкуса и стиля. Хотя Ваш код, ИМХО, красивее. Только требует нЕсколько большего понимания принципов ООП, чего у автора сабжа, ИМХО, нет пока ;))
>Hirara © (28.02.03 17:26)
>спасибо конечно, но почему в запросе в месте где должны быть поля таблицы указывается count(*)?
Я же написал в пояснениях, что не нужны собственно записи (т.е. содержимое любого из полей/колонок), а требуется только подсчитать ОБЩЕЕ их число.
>И еще : qrec := Fields[0].AsInteger; здесь насколько я знаю берется значение из первого поля таблицы в текущей записи? или я чо то не то понял??
Данный мною и "приглаженный" kaif © (28.02.03 00:54) образец запроса вернет ОДНУ запись, состоящую из ОДНОГО поля.
← →
Hirara (2003-03-02 16:59) [10]
> Данный мною и "приглаженный" kaif © (28.02.03 00:54) образец
> запроса вернет ОДНУ запись, состоящую из ОДНОГО поля.
мне не нужна запись, мне нужно количество записей во всей таблице.
COUNT(*) что делает? оно возвращает количество записей? если да то куда выдается результат?
типа с уважением
← →
MsGuns (2003-03-02 18:16) [11]>Hirara © (02.03.03 16:59)
Надо бы хоть в общих чертах ознакомиться с SQL - ем и компонентами запросов.
После того, как ознакомишься, то с уважением без "типа"
← →
Hirara (2003-03-02 18:25) [12]
> MsGuns
как работает селект, я знаю, он же возвращает сами записи, а не их количество, откуда там взялось Count(*) ? первый раз такое вижу
← →
MsGuns (2003-03-02 18:53) [13]Local SQL. Руководство разработчика. Встроенный дельфишный хэлп
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c