Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.20;
Скачать: CL | DM;

Вниз

Как програмно отлючить связь между таблицами?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
3-64009
pa\/el
2003-02-27 13:28
2003.03.20
Что лучше для IB ???


8-64238
Zergling
2002-12-04 09:29
2003.03.20
Движущаяся пунктирная линия (в прямоугольнике)


1-64164
lexusU
2003-03-07 15:01
2003.03.20
Распознавание изображений


1-64061
Alex-21
2003-03-08 11:00
2003.03.20
Memo1.Lines.Add


6-64266
Vzlom
2003-02-01 12:38
2003.03.20
как добавить в IExplorer свою кнопку