Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-63948
EdSl
2003-02-27 13:58
2003.03.20
tdxdbgrid


14-64288
Arcada
2003-03-06 12:46
2003.03.20
Поиск файла


1-64193
ден555
2003-03-08 14:34
2003.03.20
Как открыть файл?


1-64126
GrayWolf
2003-03-11 09:24
2003.03.20
Поиск файлов в подкаталогах n-ой глубины


14-64339
MVovva
2003-03-04 12:05
2003.03.20
Желающие посмотреть





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский