Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
На картинке представлена структура части базы данных. На не отражен справочник товаров: группа, подгруппа и товар. Так же есть связь с поставщиками(provider) многие ко многим через три таблицы связки.
И так на форме есть три databloсk'a отражающие справочник товаров, эти три блока связаны. Далее есть три блока с таблицами связками, тоже привязаны к соответствующим таблицам.
Я создаю 7 блок в котором отражаю поставщиков, допустим одну группу товаров поставляет три поставщика дак у меня отражается только один поставщик ибо курсор в таблице связки по группам товаров стоит на одной строке а не на нескольких.
Как сделать что бы отражались сразу все поставщики?

К сообщению приложен файл. Размер - 0Kb
26 янв 08, 14:02    [5206509]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
посмотрел форум и придумал следующее решение. На блоке где отражена группа товаров на триггере post-change написал следующее:



declare 
 cursor c1 is
 		select p.pro_id, pro_name_short from provider p, grp_pro g
		where p.pro_id = g.pro_id 
		union all
		select p.pro_id, pro_name_short from provider p, sgr_pro s
		where p.pro_id = s.pro_id 
		union all
		select p.pro_id, pro_name_short from provider p, gds_pro d
		where  p.pro_id = d.pro_id;
begin
	go_block('provider');
 open c1;
 first_record;
  fetch c1 into :provider.pro_id, :provider.pro_short_name;
  if c1%notfound then
    :provider.pro_id :=null;
    :provider.pro_short_name:=null;    
  end if;  
  next_record;
 close c1;
 go_block('goods_group');
end;


но в этом событии нельзя использовать go_block('provider'); и go_block('goods_group');
хотелось бы все видеть в динамике а не по нажатию кнопки. на какое событие лучше это повесить?
26 янв 08, 18:14    [5206806]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Ошибся в триггере, правильный выглядит вот так, но как и старый работает только по нажатию клавиши:
declare 
 cursor c1 is
 		select p.pro_id, pro_name_short from provider p, grp_pro g
		where p.pro_id = g.pro_id 
		union all
		select p.pro_id, pro_name_short from provider p, sgr_pro s
		where p.pro_id = s.pro_id 
		union all
		select p.pro_id, pro_name_short from provider p, gds_pro d
		where  p.pro_id = d.pro_id;
begin
		go_block('provider');
 		open c1;
 		first_record;
 		
		loop
  			fetch c1 into :provider.pro_id, :provider.pro_short_name;  
  			exit when c1%notfound;    
  		  
  			next_record;
		end loop;
 		close c1;
 		go_block('goods_group');
end;

26 янв 08, 18:29    [5206816]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Сама суть проблемы заключается в том, что в событии post-change нельзя переходить в другие датаблоки , то есть использовать команду go_block.
Как сделать по другому?
Можно ли использовать команды next_record и first_record не переходя в другой датаблок?
или какие можно использовать события при переходе с одного record'a на другой, что бы в нем можно было бегать между датаблоками?
28 янв 08, 13:28    [5210450]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9264
Если я правильно понял, я бы сделал блок PROVIDERS_FOR_GOODS. И связал его с товарами.

Не нужно делать такой "детальный" мастер-детаил в ФОРМС. Вместо схемы Товары-Таблица_связка-Поставщики, прото Товары-Поставщики. Только правильное условие WHERE написать (можно подзапрос или что-то еще). Если поставщики только для просмотра, я бы вообще FORMS'овые master-detail не использовал, просто на WHEN-NEW-RECORD-INSTANCE в блоке Товары, белал бы Execute_Query на блоке Поставщики.

Надеюсь понятно написал.
28 янв 08, 13:43    [5210580]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Leonid Kudryavtsev
Если я правильно понял, я бы сделал блок PROVIDERS_FOR_GOODS. И связал его с товарами.

Не нужно делать такой "детальный" мастер-детаил в ФОРМС. Вместо схемы Товары-Таблица_связка-Поставщики, прото Товары-Поставщики. Только правильное условие WHERE написать (можно подзапрос или что-то еще). Если поставщики только для просмотра, я бы вообще FORMS'овые master-detail не использовал, просто на WHEN-NEW-RECORD-INSTANCE в блоке Товары, белал бы Execute_Query на блоке Поставщики.

Надеюсь понятно написал.

при событии WHEN-NEW-RECORD-INSTANCE нельзя переходить в другой блок что бы выполнить Execute_Query в этом то и проблема.
8 фев 08, 09:31    [5261060]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
z
Guest
Vladimir_Perm
Leonid Kudryavtsev
Если я правильно понял, я бы сделал блок PROVIDERS_FOR_GOODS. И связал его с товарами.

Не нужно делать такой "детальный" мастер-детаил в ФОРМС. Вместо схемы Товары-Таблица_связка-Поставщики, прото Товары-Поставщики. Только правильное условие WHERE написать (можно подзапрос или что-то еще). Если поставщики только для просмотра, я бы вообще FORMS'овые master-detail не использовал, просто на WHEN-NEW-RECORD-INSTANCE в блоке Товары, белал бы Execute_Query на блоке Поставщики.

Надеюсь понятно написал.

при событии WHEN-NEW-RECORD-INSTANCE нельзя переходить в другой блок что бы выполнить Execute_Query в этом то и проблема.


Это почему еще нельзя? 8)
Решение Леонида абсолютно разумно.
А вам совет - в дальнейшем забудьте о событии POST-CHANGE (Oracle об этом уже 5 лет пишет)
8 фев 08, 09:51    [5261162]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Извиняюсь, все работает. Ручки кривоватые.
8 фев 08, 10:00    [5261208]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Сейчас появилась другая проблема. В том блоке в котором есть событие WHEN-NEW-RECORD-INSTANCE , в котором есть переход в другой блок и обратно, не работают клавиши F7 F8
Пишет FRM-41009: function key not allowed.
Проблема понятна, но как из нее выходить при нажатии F7 и F8???
9 фев 08, 14:59    [5267565]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Если решать данную задачу через master_detail и я создал предложенный блок PROVIDERS_FOR_GOODS, но если дальше привязывать PROVIDERS_FOR_GOODS с Goods_group, то выдается только одна строка. Естественно ведь курсор в датаблоке PROVIDERS_FOR_GOODS стоит на одной строке.

Каким образом сделать, что бы в датаблоке Goods_group отражались все строки которые есть в PROVIDERS_FOR_GOODS ???
11 фев 08, 10:46    [5270371]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9264
Ты можеш сделать тестовый набор данных и простую формочку, которую пытаешся изобразить. А то, честно говоря, очень тяжело догадываться, что ты пытаешся сделать.
11 фев 08, 10:54    [5270429]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Обрисую модельку:
У меня есть один провайдер(поставщик):
pro_id pro_name
1 поставщик№1

есть группы товаров
grp_id grp_name
1 Группа 1
2 Группа 2
3 Группа 3

Есть связывающая таблица
grp_id pro_id
1 1
2 1
3 1

Я делаю свзяку через master_detail (provider---grp_pro) and (grp_pro---goods_group)
Я встаю курсором на запись в блоке provider, в датаблоке grp_pro появляются три записи и курсор в нем стоит на первой записи. Естественно в блоке goods_group отображается та запись на которой стоит курсор в блоке grp_pro. а я хочу чтобы все записи которые отобразились в блоке grp_pro отобразились в goods_group независимо где стоит курсор в блоке grp_pro.
11 фев 08, 11:04    [5270502]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
OraDen
Member

Откуда:
Сообщений: 828
Vladimir_Perm
Я делаю свзяку через master_detail (provider---grp_pro) and (grp_pro---goods_group)
Я встаю курсором на запись в блоке provider, в датаблоке grp_pro появляются три записи и курсор в нем стоит на первой записи. Естественно в блоке goods_group отображается та запись на которой стоит курсор в блоке grp_pro. а я хочу чтобы все записи которые отобразились в блоке grp_pro отобразились в goods_group независимо где стоит курсор в блоке grp_pro.
Зачем вам третий блок? Просто заполняйте в post-query небазовое поле в блоке grp_pro.

Формы обычно проектируются под определенный функционал, а не под структуру базы, иногда под разный функционал нужно сделать и две и три разные формы на одних и тех же таблицах, так что сначала определитесь что вы хотите делать в этой форме, а потом уже думайте как реализовать. Подход, есть десять таблиц, надо сделать форму имхо неправильный, например в вашем случае даже на трех таблицах можно идти или с поставщиков или с групп товаров :)
11 фев 08, 11:58    [5270941]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
2OraDen : хорошая мысль. Постараюсь думать в том же ключе.
11 фев 08, 12:11    [5271024]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
опять появился затык, как я понимаю по вычисляемому полю нельзя делать сортировку. Это так или можно как то выкрутиться?
11 фев 08, 14:14    [5271916]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9264
Что есть "вычисляемое поле" ? и и вычисляемое "где"?

Если на сервере - сортировать можно. Если на клиенте - стандартно нет. Но выкрутиться всегда можно.
11 фев 08, 14:33    [5272025]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Leonid Kudryavtsev
Но выкрутиться всегда можно.


Вы абсолютно правы, выкрутился через вьюху.
11 фев 08, 15:05    [5272231]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Vladimir_Perm
Member

Откуда: Пермь
Сообщений: 53
Выкрутиться не получилось, вьюха не работает с master-detail. Сначала ругнулась на
 CURSOR GOODS_GROUP_VIEW_cur IS      
    SELECT 1 FROM GOODS_GROUP_VIEW G     
    WHERE G.pro_id = :PROVIDER.PRO_ID;
но я дописал что надо было
 CURSOR GOODS_GROUP_VIEW_cur IS      
    SELECT 1 FROM GOODS_GROUP_VIEW G     
    WHERE G."pro_id" = :PROVIDER.PRO_ID;
Теперь просо ничего не возвращается... уже в отчании. Разве с вьюхами нельзя так работать?
11 фев 08, 16:02    [5272623]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
C-Strelok
Member

Откуда: Саянск (Иркутская область), ОАО "СаянскХимпласт"
Сообщений: 631
Vladimir_Perm
Сейчас появилась другая проблема. В том блоке в котором есть событие WHEN-NEW-RECORD-INSTANCE , в котором есть переход в другой блок и обратно, не работают клавиши F7 F8
Пишет FRM-41009: function key not allowed.
Проблема понятна, но как из нее выходить при нажатии F7 и F8???

Эта проблема решается следующим образом:
1) обявляем какую нибудь переменную, например :parameter.off_wnri, присваиваем ей значение по умолчанию 0 ("ноль")
2) в тригере KEY-ENTQRY, перед командой ENTER_QUERY; пишем :parameter.off_wnri := 1; а после, -
:parameter.off_wnri := 1;
3) в триггере WHEN-NEW-RECORD-INSTANCE - всё его содержимое оборачиваем в условие:

if :parameter.off_wnri := 0 then
{ваш текст программы}
end if;
4) всё. 0 триггер будет отрабатывать и всё будет нормально.....

ps триггер enter-query не отрабатывает по причине того что когда вы нажимаете F7, то срабатывает тут же триггер WHEN-NEW-RECORD-INSTANCE - и естественно выполняется его код, который я так предполагаю - делает навигацию на другой блок и execute_query, что конечно же запрещено при процедуре enter-query...
описаное выше позволяет реализовать принцип: "не пойман - не вор"....
7 апр 08, 14:49    [5512649]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9264
C-Strelok


Как то очень сложно. SYSTEM.MODE System Variable не поможет?
7 апр 08, 14:55    [5512716]     Ответить | Цитировать Сообщить модератору
 Re: forms 6i Помогите создать такой Datablock  [new]
badmintonist
Member

Откуда:
Сообщений: 330
Leonid Kudryavtsev
C-Strelok

Как то очень сложно. SYSTEM.MODE System Variable не поможет?
+1
7 апр 08, 14:56    [5512726]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить