![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как сделать чтоб поле calculated один раз расчиталось запомнило [D6, IB6.x, FIREBIRD 1.5]
AVP_opck © (2004-05-18 08:31:00)использую fibplus,ehlib.
дело в следующем. есть таблица cards - в ней ID и Name1
вторая таблица strukt - ID и Name2
третья таблица - id, cardsid, struktid соответственно из первой и второй таблице.
есть 2 грида - gridcards
и gridstrukt
они через датасет показывают записи своих таблиц.
делаю чтоб нажав на запись в cards в strukt показывало какие записи strukt.id сопоставленны cards.id в третьей таблице.
для этого долбавил в datasetstrukt поле IN_ST calcukated типа булево.
и процедурку
procedure TForm1.DataSourceCARDSDataChange(Sender: TObject; Field: TField);
VAR
STRUKTBOOK:TBOOKMARKSTR; //закладка
begin
if datasetstrukt.Active=true and datasetcardstrukt.Active=true then
BEGIN
if datasetcardstrukt.Active=true then
begin
STRUKTBOOK:=DATASETSTRUKT.Bookmark;
DATASETSTRUKT.First;
WHILE NOT DATASETSTRUKT.Eof DO
BEGIN
datasetSTRUKT['in_st']:=false;
if datasetcardstrukt.Locate('cardid;struktid',VarArrayOf([datasetcards['id'],datasetSTRUKT['id']]),[]) then
begin
datasetSTRUKT['in_st']:=true;
end;
DATASETSTRUKT.Next
END;
DATASETSTRUKT.Bookmark:=STRUKTBOOK;
end;
ЕСЛИ DATASETSTRUKT.Bookmark:=STRUKTBOOK; закоментировать то все нормально показывает, но если это исполнять то все in_st становятся серыми и ниче не показывают. в чем дело???
как сделать чтоб они оставались такими какими я их сделал и после перехода на закладку
AVP_opck (2004-05-18 09:56:00) [1]вобще то что я сделал в начале вполне работает без закладки.
просто каждый раз при выборе в cards другой записи в strukt курсор становица на последнюю запись из за цикла.
хм. а может добавить этот чекбокс в гриде ехлиб вроде позволяет)
надо попробовать
ЮЮ (2004-05-18 09:55:00) [2]В Gride структ. показываить не Table, а запрос
SELECT
Strukt.*,
(SELECT Count(Id) AS Cnt
FROM третья
WHERE (Struct.Id = третья.StruktId) AND (третья.CardId = :ID))
) AS Cnt
FROM Strukt
который сделай Детайл по отночению к таблице CARDS, в результате и получишь то самое поле Сnt, которое считается один раз при перемещении по первому гриду
AVP_opck (2004-05-18 09:52:00) [3]Sergey13
>>но показывать и там и там надо все записи.
>А зачем?
чтоб пользователь кликал на те записи которые не отмечены и они отмечались(обрабатываю cellClick по гриду)
Sergey13 (2004-05-18 09:42:00) [4]2AVP_opck (18.05.04 09:11) [3]
Если и можно так сделать, то ИМХО шибко геморойно. Тем более на "много-много" отношении.
>но показывать и там и там надо все записи.
А зачем?
Anatoly Podgoretsky (2004-05-18 09:25:00) [5]AVP_opck (18.05.04 09:11) [3]
Чем же не подходит
Ну тогда делай фильтрами, запросами
AVP_opck (2004-05-18 09:20:00) [6]и чтоб при переходе в cards на другу запись
в strukt менялся этот Checkbox
AVP_opck (2004-05-18 09:11:00) [7]все с этими связями понятно.
только не подходит чуть чуть.. или скажи как сделать
чтоб было:
всего два грида в одном записи кардс в другом структ. и в этом гриде структ надо как то отметить что соответствует записям кардс
но показывать и там и там надо все записи.
Виталий Панасенко (2004-05-18 08:55:00) [8]Почитай о Master-Detail связи.. Все на-а-а-амного проще окажется...:-)))... См. статьи на сайте FIBPlus... Там как раз то, что тебе нужно... Правда, только для двух таблиц... Но серое вещество не только ж для навара используется ?.. :-)))
AVP_opck (2004-05-18 08:45:00) [9]вобщем наверно все можно свести к одному.
как сделать чтоб поле калькулятед один рас посчиталось и больше не пересчитывалось. сохраняя и показывая свои значения.