[ОТВЕТИТЬ]
10.02.2012 06:46
Danil_
 
Пришло ТЗ для редактирования документа ТОРГ-2 в приходящих накладных

Цитата:
на 1 стр. не проставляется № товарной накладной, дата.
№ счет-фактуры, дата.

В строке Грузоотправитель нужно , чтобы машина подтягивала физический
адрес поставщика( из раздела контрагенты)
Таблица, с которой берутся все данные для supermag.SVSpecNaclRep, но там нет поля с интересующими нас данными.
Они есть в таблице supermag.smwaybillsin. В поле SUPPLIERDOC - Накладная поставщика, SUPPLIERINVOICE - Счет-фактура поставщика.
Как мне связать эти таблицы в запросе? По каким ключам или через какие промежуточные таблицы?
Я еще не разобрался до конца в супермаговской структуре.
10.02.2012 08:11
Mtirt
 
Мне оказалось сложным понять, что вы реально хотите?
Научить вас писать любые запросы?
Написать за вас этот конкретный запрос?
10.02.2012 08:34
Danil_
 
Запросы уметь писаю, слава богу.
И что такое примари кей тоже знаю.
И даже что такое джоин знаю и пользовался.
Можете написать конкретно этот запрос, подсказать по какому ключу связать.
10.02.2012 08:38
Mtirt
 
Ключ - номер(id или docid) и тип документа (doctype).
13.02.2012 05:10
Danil_
 
Что было:

Код:
SELECT s.displayitem displayitem, 
s.ARTICLE ARTICLE, 
s.NAME NAME, 
s.SPECITEM SPECITEM, 
round(s.QuantByDoc,-s.Prec)  QUANTBYDOC, 
s.REASON REASON,
round(s.itemprice,:P_Prec) itemprice, 
round(s.quantity,-s.Prec) quantity_fact,
s.MESABBREV MESABBREV,
s.Prec Prec,
round(s.TotalPrice,:P_Prec) TotalPrice_fact,
round(nvl(t.TotalPrice,0),:P_Prec) TotalPrice_doc       
FROM supermag.SVSpecNaclRep s, supermag.TTPrintNacl t
WHERE s.DOCID = :P_DOC_ID
     AND s.DOCTYPE = :P_DOC_TYPE
     and t.doctype(+)=s.doctype
     and t.docid(+)=s.docid
     and t.specitem(+)=s.specitem
 and s.Quantity!=nvl(t.Quantity,0)
ORDER BY &P_SORT,s.displayitem

Что стало:
Код:
SELECT s.displayitem displayitem, 
s.ARTICLE ARTICLE, 
s.NAME NAME, 
s.SPECITEM SPECITEM, 
round(s.QuantByDoc,-s.Prec)  QUANTBYDOC, 
s.REASON REASON,
round(s.itemprice,:P_Prec) itemprice, 
round(s.quantity,-s.Prec) quantity_fact,
s.MESABBREV MESABBREV,
s.Prec Prec,
round(s.TotalPrice,:P_Prec) TotalPrice_fact,
round(nvl(t.TotalPrice,0),:P_Prec) TotalPrice_doc,
sm.supplierdoc supplierdoc, -- добавил накладную поставщика
sm.supplierinvoice, -- добавил счет-фактуру поставщика
sm.supplinvoicecreate -- добавил дату создания счет-фактуры
FROM supermag.SVSpecNaclRep s, supermag.TTPrintNacl t, supermag.smwaybillsin sm -- добавил таблицу
WHERE s.DOCID = :P_DOC_ID
     AND s.DOCTYPE = :P_DOC_TYPE
     and t.doctype(+)=s.doctype
     and t.docid(+)=s.docid
     and t.specitem(+)=s.specitem 
     and t.docid = sm.id -- добавил
     and t.doctype = sm.doctype -- добавил
 and s.Quantity!=nvl(t.Quantity,0)
ORDER BY &P_SORT,s.displayitem
Меня интересуют 2 последних "добавил". Вы ведь это имели ввиду, связать по двум ключам?
13.02.2012 06:13
Danil_
 
Опечатка
Код:
     and t.docid = sm.id -- добавил
     and t.doctype = sm.doctype -- добавил
а надо

Код:
     and s.docid = sm.id -- добавил
     and s.doctype = sm.doctype -- добавил
13.02.2012 07:13
Mtirt
 
Результат тебя устраивает? Значит связал правильно.
13.02.2012 07:39
Danil_
 
1. Просто, как я понял, вы посоветовали связать по двум ключам, что я и сделал. Но я не очень понимаю зачем именно по двум ключам надо было связать.

2. При выполнении в супермаге мой измененный отчет ТОРГ-2 выдает ошибку

REP-1213: Поле 'F_SUPPLIERDOC' ссылается на столбец 'supplierdoc' с частотой ниже его группы.

Вот запрос мною написанный для этого значения
Код:
function CF_SUPPLIERDOCFormula return Char is
SUPPLIERDOC supermag.smwaybillsin.supplierdoc%type;
begin
	select
	sm.supplierdoc into SUPPLIERDOC
	from
	supermag.smwaybillsin sm
	where
	sm.id=:P_DOC_ID and sm.doctype=:P_DOC_TYPE;
	return  
	(SUPPLIERDOC);
	exception
	when others then return '';
end;
Скрин схемы отчета, запросов и функций


Что еще нужно проверить и посмотреть, чтобы устранить ошибку пункта 2?

Добавлено через 1 минуту 37 секунд
Как ее исправить?
13.02.2012 07:49
Mtirt
 
У меня идиотский вопрос.
Зачем делать отдельное вычисляемое поле, если ты переделал исходных запрос для получения этих-же данных?
13.02.2012 07:56
Danil_
 
Затем что с репорт билдером я первый месяц работаю и у меня просто нет опыта.
Подскажите, пожалуйста, как правильно, потому что я признаю, что я полный 0 в работе с репортом, но очень хочу набраться опыта.
13.02.2012 08:05
Mtirt
 
Даже на твоем стриншоте видно.
В Q1 есть supplierdoc (первой строкой).
Его и вставь в печатную форму. Нет?
13.02.2012 08:50
Danil_
 
Я полностью удалил и сделал заново поле "Накладная"

Код:
function F_SUPPLIERDOCFormatTrigger return boolean is
begin
  
  return (TRUE);
end;
Ошибка та же

Цитата:
REP-1213: Поле 'F_SUPPLIERDOC' ссылается на столбец 'supplierdoc' с частотой ниже его группы.
13.02.2012 10:42
vdm
 
Если источником для поля F_SUPPLIERDOC служит supplierdoc из запроса спецификации, то это поле обязано лежать в пределах repeating frame, источником для которого служит тот же запрос. У тебя F_SUPPLIERDOC скорее всего где-то в заголовке.

Еще мелкая придирка
Код:
and s.docid = sm.id(+) -- добавил
and s.doctype = sm.doctype(+) -- добавил
Иначе теоретически можно и спецификацию получить.

Но вообще нет смысла для одного документа брать номер/дату с-ф вместе со спецификацией, он все равно в единственном числе у тебя.
Заведи глобальные пользовательские параметры или переменные в спецификации пакета, и заполни их селектом в afterpform. Их можно будет в любом месте использовать.
13.02.2012 11:08
Danil_
 
vdm, а можно подробнее? Как-то пошагово что ли. Пробую, пробую, гугла уже замучил бедного, а ошибка всё таже и не могу понять о каком фрейме идет речь.
Давай сначала создадим это поле?
13.02.2012 12:03
vdm
 
Смотри в объектном навигаторе, кто является родителем для поля F_SUPPLIERDOC.
Если оно выше, чем группа полей запроса спецификации (раз уж ты берешь данные оттуда), то ошибка частоты группы будет.

Использование переменных на примере формы счета-фактуры, см. картинки.

1. В "Программы" добавляется пакет, только спецификация. С соответствующими переменными.
2. В них селектится нужное.
3. Использовать их можно в формулах любого уровня, на частоту группы ругаться не должно.

Вместо переменных пакета можно добавить свое в "Модель данных - Параметры пользователя".
Использовать аналогично.

Если данные используются исключительно однократно, можно не возиться с созданием переменных.
1. Селект из afterpform вынести в отдельный запрос Q3 (аналогично Q2 на твоем скриншоте)
2. На форму кинуть отдельный r.frame с группой Q3
3. В него положить поля с данными из Q3.
Миниатюры
Нажмите на изображение для увеличения
Название: пакет.jpg
Просмотров: 301
Размер:	118.0 Кб
ID:	1131   Нажмите на изображение для увеличения
Название: селект.jpg
Просмотров: 305
Размер:	85.2 Кб
ID:	1132   Нажмите на изображение для увеличения
Название: поле.jpg
Просмотров: 288
Размер:	140.1 Кб
ID:	1133  
13.02.2012 22:09
vdm
 
Цитата:
vdm Если данные используются исключительно однократно ...
Сильно перемудрено.
Почти всегда достаточно одного поля с формулой, где текст при необходимости собирается из нескольких частей. Что собственно и можно видеть в скриншоте поля заголовка.
15.02.2012 05:48
Danil_
 
Вот так SUPPLIERDOC располагается в объектном навигаторе

15.02.2012 10:01
vdm
 
Речь шла о связи поле F_SUPPLIERDOC - его данные.
Еще раз.
Ошибка
Цитата:
REP-1213: Поле 'F_SUPPLIERDOC' ссылается на столбец 'supplierdoc' с частотой ниже его группы.
Т.е., чтобы поле F_SUPPLIERDOC могло использовать данные из G_SPECITEM, оно должно находиться внутри фрейма, для которого источником данных является группа G_SPECITEM или любая другая, выше чем G_SPECITEM.

Все же выбрось ты supplierdoc из запроса спецификации и сделай уж что нибудь из [глобальная переменная | формула].
16.02.2012 08:00
Danil_
 
Я не понимаю вас... Путаюсь в терминах.
Я создал отчет заново. Чистенький запрос только с нужными мне 3 полями.

Код:
SELECT
sm.supplierdoc,
sm.supplierinvoice,
sm.supplinvoicecreate
FROM 
supermag.smwaybillsin sm


Затем добавил поле F_1, которое я хочу, чтобы отображало данные из стобца и указал в палитре свойств источник supplierdoc.

И он выдал ту же самую ошибку.

Это 3 действия. Что из них я делаю не так? Или какое-то пропустил может быть?
Что нужно сделать, чтобы у меня заработал мой отчет? Хотя бы вот этот простенький, который я начал заново, потом уже разберусь и добавлю это поле в нужный.

Не понимаю как создать глобальную переменную.
А выбросить supplierdoc из запроса спецификации значит просто удалить строку в селект из запроса Q_1 в моем отчете?
16.02.2012 09:28
Danil_
 
Разобрался, практически, по крайней мере повторящийся фрейм сделал и теперь отчет ошибку не выдает, но и поле пустое, буду разбираться что в запросе не так
16.02.2012 11:06
Danil_
 
Сейчас у меня вот такой вот запрос

Код:
SELECT s.displayitem displayitem, 
s.ARTICLE ARTICLE, 
s.NAME NAME, 
s.SPECITEM SPECITEM, 
round(s.QuantByDoc,-s.Prec)  QUANTBYDOC, 
s.REASON REASON,
round(s.itemprice,:P_Prec) itemprice, 
round(s.quantity,-s.Prec) quantity_fact,
s.MESABBREV MESABBREV,
s.Prec Prec,
round(s.TotalPrice,:P_Prec) TotalPrice_fact,
round(nvl(t.TotalPrice,0),:P_Prec) TotalPrice_doc,
sm.supplierdoc supplierdoc,
sm.supplierinvoice supplierinvoice,
sm.supplinvoicecreate supplinvoicecreate
FROM supermag.SVSpecNaclRep s, supermag.TTPrintNacl t, supermag.smwaybillsin sm
WHERE s.DOCID = :P_DOC_ID
     AND s.DOCTYPE = :P_DOC_TYPE
     and t.doctype(+)=s.doctype
     and t.docid(+)=s.docid
     and t.specitem(+)=s.specitem 
     and t.docid = sm.id
     and t.doctype = sm.doctype
 and s.Quantity!=nvl(t.Quantity,0)
ORDER BY &P_SORT,s.displayitem
Поле F_SUPPLIERDOC не показывает ничего.
Где может быть ошибка?
17.02.2012 00:58
vdm
 
Эх. :dash2:
Расписывать каждый шаг картинками лень, а словами объяснять видимо не умею.
Погуглите чтоль "уроки oracle reports". Да и про sql... и повнимательнее...

Вручную, вне reports этот запрос выполни, подставив нужные параметры.
Будет ли там нужный тебе результат?

Предполагаю, что не будет, т.к. вот это все же неправильно:
Код:
     and t.docid = sm.id
     and t.doctype = sm.doctype
Как думаешь, получишь ли ты строки, где на месте t.* - null?
Правильное условие было уже указано выше.

Если так и не выйдет у тебя каменный цветок номеров со спецификацией (мне надоело повторять, что он и не нужен), вернись хотя бы в сторону своего же эксперимента
https://olegon.ru/showpost.php?p=109116&postcount=8
Тот CF_SUPPLIERDOC точно рабочий, ставь его источником для нужного поля в разметке и будет счастье.

Ну и чтобы еще больше запутать: можно и один общий запрос в модели данных разбить на группы, 1-ю с данными документа поставщика, 2-ю со всем остальным, и 2 повторяющихся рамки для них нарисовать, 2-ю внутри первой. Но вы лучше сюда пока не смотрите :)
29.02.2012 08:56
Danil_
 
У меня всё получилось. В запросе ошибку нашел и знания по репорт-билдеру повысил.
Всем большое спасибо.
Опции темы


Часовой пояс GMT +3, время: 02:30.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.