Выборка в мастер детайле и ключевое поле

Модераторы: kdv, CyberMax

Ответить
Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Выборка в мастер детайле и ключевое поле

Сообщение Antarey » 26 ноя 2007, 15:40

Господа,помогите решить две проблемы:
1.- как в одной транзакции добавлять данные в мастер детайл таблицы,если к примеру
в мастер добавляется одна запись а в детал 10,хотя ето не важно.Связь делаю - автоинкриментное
поле в мастере и интежер поле в детайле,но ведь пока не пройдет транзакция ластавтоинк мастер
поля будет неизвестно??
2. - есть мастер таблица FIO char(70),MasterId AutoInc
и детайл Data DATE,MasterId INTEGER,Id AutoInc - так вот надо сделать выборку тех людей у которых к примеру 2 месяца не было движения по полю Data детайл таблицы

_Mad_
Сообщения: 10
Зарегистрирован: 12 окт 2006, 16:15

Re: Выборка в мастер детайле и ключевое поле

Сообщение _Mad_ » 26 ноя 2007, 15:57

Для первого случая использую хранимую процедуру, которая выдает мне текущее значение генератора.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 ноя 2007, 16:18

но ведь пока не пройдет транзакция ластавтоинк мастер
поля будет неизвестно??
ух, ох....
www.ibase.ru/devinfo/generator.htm
ПОЛУЧИТЕ СНАЧАЛА ЗНАЧЕНИЕ ГЕНЕРАТОРА ДЛЯ МАСТЕРА.
И ИСПОЛЬЗУЙТЕ его в детали.
у которых к примеру 2 месяца не было движения по полю Data детайл таблицы
www.ibase.ru/devinfo/joins.htm
плюс условие по дате.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 ноя 2007, 16:26

_Mad_ писал(а):первого случая использую хранимую процедуру, которая выдает мне текущее значение генератора.
а зачем процедура? и "текущее" - это как?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 27 ноя 2007, 08:43

kdv писал(а):
_Mad_ писал(а):первого случая использую хранимую процедуру, которая выдает мне текущее значение генератора.
а зачем процедура? и "текущее" - это как?
наверное, что-то вроде
select gen_id(my_gen, 0) from rdb$database, только вот зачем в случае использования IBX (FIB+) и зачем в процедуре?

_Mad_
Сообщения: 10
Зарегистрирован: 12 окт 2006, 16:15

Сообщение _Mad_ » 27 ноя 2007, 10:48

stix-s писал(а):
kdv писал(а):
_Mad_ писал(а):первого случая использую хранимую процедуру, которая выдает мне текущее значение генератора.
а зачем процедура? и "текущее" - это как?
наверное, что-то вроде
select gen_id(my_gen, 0) from rdb$database, только вот зачем в случае использования IBX (FIB+) и зачем в процедуре?
Имеется ввиду сгенерил ID для мастер таблицы в процедуре
(вот так ID=gen_id(my_Gen,1)), а потом его использую в детейл таблице

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 27 ноя 2007, 10:49

kdv писал(а):
но ведь пока не пройдет транзакция ластавтоинк мастер
поля будет неизвестно??
ух, ох....
www.ibase.ru/devinfo/generator.htm
ПОЛУЧИТЕ СНАЧАЛА ЗНАЧЕНИЕ ГЕНЕРАТОРА ДЛЯ МАСТЕРА.
И ИСПОЛЬЗУЙТЕ его в детали.
у которых к примеру 2 месяца не было движения по полю Data детайл таблицы
www.ibase.ru/devinfo/joins.htm
плюс условие по дате.
Как соединить по джоин я знаю,меня интересует как раз условие по дате,просто не прикольно перелопачивать всю базу по каждой записи в мастере и соответствующему фильтру в детайле.
Если поставить Дата<'чето там' запрос выберет и тех у которых есть движение и после указаного периода.Дата = Нул - выберет у которых ваще нет движения,а мне надо выбрать тех у кого не было двыжения больше указаного срока.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 27 ноя 2007, 11:36

_Mad_ писал(а): Имеется ввиду сгенерил ID для мастер таблицы в процедуре
(вот так ID=gen_id(my_Gen,1)), а потом его использую в детейл таблице
это уж не текущее :) а следующее с шагом 1
и все равно не понял, зачем в процедуре?
у компонентов FIB+ (может и в IBX так же называется - не помню)есть такое интересное свойство AutoUpdateOptions и при инсерте запросто получается новое значение генератора

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 27 ноя 2007, 11:39

Antarey писал(а): Если поставить Дата<'чето там' запрос выберет и тех у которых есть движение и после указаного периода.Дата = Нул - выберет у которых ваще нет движения,а мне надо выбрать тех у кого не было двыжения больше указаного срока.
если уж нуллы так нужны добавить в условие is not null никак?

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 27 ноя 2007, 12:57

stix-s писал(а):
Antarey писал(а): Если поставить Дата<'чето там' запрос выберет и тех у которых есть движение и после указаного периода.Дата = Нул - выберет у которых ваще нет движения,а мне надо выбрать тех у кого не было двыжения больше указаного срока.
если уж нуллы так нужны добавить в условие is not null никак?
Вопрос о нулах не подымался,там априори движение будет,
повторяю еще раз надо выбрать тех у кого не было движения 2 мес

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 27 ноя 2007, 13:07

повторяю еще раз надо выбрать тех у кого не было движения 2 мес
фирма left join движение
где движение is null и дата движения = указанный интервал

опять же см. joins.htm

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 27 ноя 2007, 13:40

Antarey писал(а): Вопрос о нулах не подымался,там априори движение будет,
повторяю еще раз надо выбрать тех у кого не было движения 2 мес
ну про нуллы не я первый заговорил
если наконец-то правильно понял, то в мастере - персоналии, в подчиненной множество записей дат для каждого персоналия, когда было какое либо телодвижение?
причем дата этого телодвижения бывает null?

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 28 ноя 2007, 11:58

Вопрос снимается
Если кому интересно

Код: Выделить всё

select Biling."FIO",Biling."Gorod",Biling."Street",max(Dvig."Data") LastOp
from Biling a 
left join Dvig b on a.BilingId=b.BilingId
where  max(b."Data")<'30.03.2007' or  b."Data"=NULL
group by Biling."FIO",Biling."Gorod",Biling."Street"

ORDER BY Biling."FIO";

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2007, 13:13

max(b."Data")<'30.03.2007' or b."Data"=NULL
прикольно. что max в where что data = null
:)

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 28 ноя 2007, 13:29

kdv писал(а):
max(b."Data")<'30.03.2007' or b."Data"=NULL
прикольно. что max в where что data = null
:)
не нравится веа используй хевигн,результат тотже,
А по поводу нул - как ты отбереш записи мастера в которых в детайле
ваще не было движения?? :)

belov-evgenii
Сообщения: 52
Зарегистрирован: 28 сен 2007, 10:19

Сообщение belov-evgenii » 28 ноя 2007, 13:55

b.data is null

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2007, 14:56

не нравится веа используй хевигн,результат тотже,
А по поводу нул - как ты отбереш записи мастера в которых в детайле
ваще не было движения??
ты меня с кем-то спутал. это мои сайт, форум, и статья про join (как минимум).

Ответить