![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Master-Detail и запрос с параметрами [D6, MSSQL]
Sigetta © (2005-09-13 11:35:00)Таблицы Rasx и PRasx находятся в связи Master-Detail. Если открывать PRasx с параметром, то связь теряется, если без параметра связь есть.
DM.Rasx.Close;
DM.Rasx.CommandText:='SELECT * FROM RASX WHERE SKLAD=:SKLAD AND KODM=:KODM AND DATA BETWEEN :Dat1 and :Dat2';
DM.Rasx.Parameters.ParamByName('Dat1').Value:=StrToDateTime(FMain.Dat1);
DM.Rasx.Parameters.ParamByName('Dat2').Value:=StrToDateTime(FMain.Dat2);
DM.Rasx.Parameters.ParamByName('KODM').Value:=0;
DM.Rasx.Parameters.ParamByName('SKLAD').Value:=FMain.VSklad;
DM.Rasx.Open;
//связь теряется
DM.PRasx.CommandText:='SELECT PRasx.* FROM PRasx INNER JOIN RASX ON PRasx.NVN=Rasx.NVN AND Rasx.SKLAD=:S';
DM.pRasx.Parameters.ParamByName('S').Value:=FMain.VSklad;
DM.PRasx.Open;
//связь сохраняется
DM.PRasx.CommandText:='SELECT PRasx.* FROM PRasx INNER JOIN RASX ON PRasx.NVN=Rasx.NVN AND Rasx.SKLAD='+IntToStr(FMain.VSklad);
DM.PRasx.Open;
Почему так может происходить?
P.S. Rasx - primary key table, PRasx - Foreign Key table
P.S.S. Rasx, PRasx - ADODatatSet
Sigetta (2005-09-14 12:14:00) [1]
> NVN - ключ связи PRASX с Rasx ? Является ли NVN первичным
> ключом в Rasx ? Есть ли индекс по NVN в PRasx ?
Да. Да. Составной (ID,NVN) уникально-кластерный.
Rasx
NVN int
Nom varchar(10)
Data smalldatetime
....
PRasx
ID int IDENTITY(1,1)
NVN int
Kol float
...
> ЗЫ. Странные имена таблиц для такого контекста.
Такие были еще до меня. И в чем странность?
> ЗЫЫ. Если правильно настроить, то постоянно запихивать в
> кверю запрос, присваивать параметр и открывать его не надо,
> связка это сама сделает.
правильно настроить - это выбрать detaildatasource и masterfields для PRasx?
> >ЗЫЫЫ. Если квери сосзданы в дизайн-тайме, зачем динамически
> туда запросы запихивать ?
Динамически они не пихаются.
ANB (2005-09-14 09:55:00) [2]
> Sigetta © (13.09.05 18:10) [16]
NVN - ключ связи PRASX с Rasx ? Является ли NVN первичным ключом в Rasx ? Есть ли индекс по NVN в PRasx ?
Запости структуру таблиц.
ЗЫ. Странные имена таблиц для такого контекста.
ЗЫЫ. Если правильно настроить, то постоянно запихивать в кверю запрос, присваивать параметр и открывать его не надо, связка это сама сделает.
ЗЫЫЫ. Если квери сосзданы в дизайн-тайме, зачем динамически туда запросы запихивать ?
Val (2005-09-13 19:04:00) [3]>Sigetta © (13.09.05 18:10)
чего-то вы недопонимаете в сути связки мастер-дитейл, похоже. попробуйте почитать что-нибудь по этому поводу. потом - перечитать данную ветку.
Sigetta (2005-09-13 18:10:00) [4]>[15]
Каждый раз вызывать
DM.PRasx.CommandText:='SELECT * FROM PRASX where PRasx.NVN=:NVN';
DM.PRasx.Parameters.ParamByName('NVN').Value:=DM.Rasx.FieldByName('NVN').AsInteger;
DM.PRasx.Open;
при перемещении по гриду соответствующему Rasx???
Если делать так то не нужен никакой master-detail настраивать.
Я так пробовал - ~1 сек на отображение инфы в гриде PRasx.
P.S.
Rasx - это шапка накладной
PRasx - содержимое накладной
ANB (2005-09-13 16:40:00) [5]DM.PRasx.CommandText:='SELECT * FROM PRASX INER JOIN Rasx ON PRasx.NVN=Rasx.NVN WHERE Rasx.SKLAD=:SKLAD AND Rasx.KODM=:KODM AND Rasx.DATA BETWEEN :Dat1 and :Dat2'; - сей запрос никакого отношения к мастер-детайл не имеет
Вот этого будет достаточно, если все настроить
DM.PRasx.CommandText:='SELECT * FROM PRASX where PRasx.NVN=:NVN';
Прочие условия по выборке из Rasx нужно в мастер запрос и пихать.
Val (2005-09-13 16:27:00) [6]>Sigetta © (13.09.05 16:19)
те данные, которые нужны, вы получаете, организуя связь - мастер-дитейл, вводя параметр, отсекающих лишее. вам привели уже нужный запрос для дитейла.
Sigetta (2005-09-13 16:25:00) [7]Мне тут говорят, что при
PRasx.CommandType=Table и PRasx.Open с сервера танутся только те данные, которые связаны с Rasx, а не вся таблица.
Но что-то слабо верится...
Sigetta (2005-09-13 16:19:00) [8]Сразу было просто PRasx.Open, но потом мне пришло в голову что я тащу весь набор с сервера. Я и решил, что нужно получать только те данные PRasx, которые ... нужны.
DM.PRasx.CommandText:='SELECT * FROM PRASX INER JOIN Rasx ON PRasx.NVN=Rasx.NVN WHERE Rasx.SKLAD=:SKLAD AND Rasx.KODM=:KODM AND Rasx.DATA BETWEEN :Dat1 and :Dat2';
ANB (2005-09-13 15:37:00) [9]
> Sigetta © (13.09.05 14:26) [10]
- зачем в детайл запросе джойн с мастер-таблицей ?
Sigetta (2005-09-13 14:26:00) [10]>[8]
Это выполнять каждый раз при перемещении по Rasx? Медленно. Не устраивает. Или я не так понял.
В двух случаях я получаю одинаковый набор данных. Только в первом он "фильтруется", а во втором нет.
Val (2005-09-13 13:11:00) [11]>[7] Sigetta © (13.09.05 12:46)
угу, посмотрел, сорри - просто адо не пользуюсь.
Lexer (2005-09-13 12:57:00) [12]Я так понимаю, что используются Query, с установленным у DetailDataSet свойством DataSource на MasterDataSet.
Но тогда здесь вообще связь отсутствует, т.к. параметры детайла не указывают не на одно поле мастера, попробуй так:
SELECT PRasx.*
FROM PRasx
INNER JOIN RASX
ON PRasx.NVN=Rasx.NVN
AND Rasx.SKLAD=:SKLAD
AND Rasx.NVN = :NVN
Sigetta (2005-09-13 12:46:00) [13]> заменить Value на соотв. As..., поскольку тип известен по типу поля в БД
так ведь TADODatatSet. нет никакого As.., только Value
>[3]
там все установлено
При перемещении в гриде связанном с Rasx не происходит "фильтрации" в PRasx, т.е. показан весь выбранный набор. Это при потери связи.
Если связь не теряется, то при перемещении в гриде связанном с Rasx я вижу соотвественные данные PRasx.
Val (2005-09-13 12:13:00) [14]>[4] Lexer © (13.09.05 12:06)
> Откуда известно что это строка, в [1] про это ничего не
> сказано.
Согласен - невнимателен. Перефразирую: заменить Value на соотв. As..., поскольку тип известен по типу поля в БД.
Sergey13 (2005-09-13 12:11:00) [15]2[3] Val © (13.09.05 12:05)
2[4] Lexer © (13.09.05 12:06)
Привычка. 8-)
Lexer (2005-09-13 12:06:00) [16]>Val © (13.09.05 11:46) [1]
>1. как реализована эта связь(я не вижу параметра для связи в тексте запроса) и что значит "теряется", при какой последовательности действий?
согласен, связь не может теряться
>Почему DM.pRasx.Parameters.ParamByName('S').Value а не .AsString, раз уж известно, что это строка?
Откуда известно что это строка, в [1] про это ничего не сказано.
>[2] Sergey13 © (13.09.05 11:53)
>В афтерскрол Rasx вставить
В афтерскролл при нормальной связи вставлять здесь ничего не надо.
Val (2005-09-13 12:05:00) [17]>Sergey13 © (13.09.05 11:53)
> В афтерскрол Rasx вставить...
Зачем? Разве в TADODatatSet нет свойства DataSource? Есть же. Думаю, достаточно его установить в соотв. значение.
Sergey13 (2005-09-13 11:53:00) [18]
DM.PRasx.CommandText:='SELECT PRasx.* FROM PRasx PRasx.NVN=:NVN';
В афтерскрол Rasx вставить
DM.PRasx.Close;
DM.Rasx.FieldByName('NVN').Value
DM.pRasx.Parameters.ParamByName('NVN').Value:=DM.Rasx.FieldByName('NVN').Value;
DM.PRasx.Open;
Val (2005-09-13 11:46:00) [19]1. как реализована эта связь(я не вижу параметра для связи в тексте запроса) и что значит "теряется", при какой последовательности действий?
2. Почему DM.pRasx.Parameters.ParamByName('S').Value а не .AsString, раз уж известно, что это строка?