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

Вниз

Master-Detail и запрос с параметрами   Найти похожие ветки 

 
Sigetta ©   (2005-09-13 11:35) [0]

Таблицы 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


 
Val ©   (2005-09-13 11:46) [1]

1. как реализована эта связь(я не вижу параметра для связи в тексте запроса) и что значит "теряется", при какой последовательности действий?
2. Почему  DM.pRasx.Parameters.ParamByName("S").Value а не .AsString, раз уж известно, что это строка?


 
Sergey13 ©   (2005-09-13 11:53) [2]

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 12:05) [3]

>Sergey13 ©   (13.09.05 11:53)

> В афтерскрол Rasx вставить...

Зачем? Разве в TADODatatSet нет свойства DataSource? Есть же. Думаю, достаточно его установить в соотв. значение.


 
Lexer ©   (2005-09-13 12:06) [4]

>Val ©   (13.09.05 11:46) [1]
>1. как реализована эта связь(я не вижу параметра для связи в тексте запроса) и что значит "теряется", при какой последовательности действий?

согласен, связь не может теряться

>Почему  DM.pRasx.Parameters.ParamByName("S").Value а не .AsString, раз уж известно, что это строка?

Откуда известно что это строка, в [1] про это ничего не сказано.

>[2] Sergey13 ©   (13.09.05 11:53)
>В афтерскрол Rasx вставить

В афтерскролл при нормальной связи вставлять здесь ничего не надо.


 
Sergey13 ©   (2005-09-13 12:11) [5]

2[3] Val ©   (13.09.05 12:05)
2[4] Lexer ©   (13.09.05 12:06)
Привычка. 8-)


 
Val ©   (2005-09-13 12:13) [6]

>[4] Lexer ©   (13.09.05 12:06)

> Откуда известно что это строка, в [1] про это ничего не
> сказано.

Согласен - невнимателен. Перефразирую: заменить Value на соотв. As..., поскольку тип известен по типу поля в БД.


 
Sigetta ©   (2005-09-13 12:46) [7]

> заменить Value на соотв. As..., поскольку тип известен по типу поля в БД
так ведь TADODatatSet. нет никакого As.., только Value
>[3]
там все установлено

При перемещении в гриде связанном с Rasx не происходит "фильтрации" в PRasx, т.е. показан весь выбранный набор. Это при потери связи.
Если связь не теряется, то при перемещении в гриде связанном с Rasx я вижу соотвественные данные PRasx.


 
Lexer ©   (2005-09-13 12:57) [8]

Я так понимаю, что используются Query, с установленным у DetailDataSet свойством DataSource на MasterDataSet.
Но тогда здесь вообще связь отсутствует, т.к. параметры детайла не указывают не на одно поле мастера, попробуй так:
SELECT PRasx.*
FROM PRasx
INNER JOIN RASX
ON PRasx.NVN=Rasx.NVN
AND Rasx.SKLAD=:SKLAD
AND Rasx.NVN = :NVN


 
Val ©   (2005-09-13 13:11) [9]

>[7] Sigetta ©   (13.09.05 12:46)
угу, посмотрел, сорри - просто адо не пользуюсь.


 
Sigetta ©   (2005-09-13 14:26) [10]

>[8]
Это выполнять каждый раз при перемещении по Rasx? Медленно. Не устраивает. Или я не так понял.

В двух случаях я получаю одинаковый набор данных. Только в первом он "фильтруется", а во втором нет.


 
ANB ©   (2005-09-13 15:37) [11]


> Sigetta ©   (13.09.05 14:26) [10]

- зачем в детайл запросе джойн с мастер-таблицей ?


 
Sigetta ©   (2005-09-13 16:19) [12]

Сразу было просто 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";


 
Sigetta ©   (2005-09-13 16:25) [13]

Мне тут говорят, что при
PRasx.CommandType=Table и PRasx.Open с сервера танутся только те данные, которые связаны с Rasx, а не вся таблица.
Но что-то слабо верится...


 
Val ©   (2005-09-13 16:27) [14]

>Sigetta ©   (13.09.05 16:19)
те данные, которые нужны, вы получаете, организуя связь - мастер-дитейл, вводя параметр, отсекающих лишее. вам привели уже нужный запрос для дитейла.


 
ANB ©   (2005-09-13 16:40) [15]

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 нужно в мастер запрос и пихать.


 
Sigetta ©   (2005-09-13 18:10) [16]

>[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 - содержимое накладной


 
Val ©   (2005-09-13 19:04) [17]

>Sigetta ©   (13.09.05 18:10)
чего-то вы недопонимаете в сути связки мастер-дитейл, похоже. попробуйте почитать что-нибудь по этому поводу. потом - перечитать данную ветку.


 
ANB ©   (2005-09-14 09:55) [18]


> Sigetta ©   (13.09.05 18:10) [16]

NVN - ключ связи PRASX с Rasx ? Является ли NVN первичным ключом в Rasx ? Есть ли индекс по NVN в PRasx ?
Запости структуру таблиц.
ЗЫ. Странные имена таблиц для такого контекста.
ЗЫЫ. Если правильно настроить, то постоянно запихивать в кверю запрос, присваивать параметр и открывать его не надо, связка это сама сделает.
ЗЫЫЫ. Если квери сосзданы в дизайн-тайме, зачем динамически туда запросы запихивать ?


 
Sigetta ©   (2005-09-14 12:14) [19]


> 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?


> >ЗЫЫЫ. Если квери сосзданы в дизайн-тайме, зачем динамически
> туда запросы запихивать ?

Динамически они не пихаются.



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.085 c
8-1116864991
кактусбел
2005-05-23 20:16
2005.10.23
Перекодировка из exe в swf и обратно


3-1126530501
naz
2005-09-12 17:08
2005.10.23
Temporary table


14-1127995312
Jeer
2005-09-29 16:01
2005.10.23
Зачем мы - им и что - они о нас:)


14-1127910731
ZeroDivide
2005-09-28 16:32
2005.10.23
Новый девайс для идентификации личности


11-1108950755
lo
2005-02-21 04:52
2005.10.23
RTTI for KOL?