Страница 1 из 2
Как 'подогнать' данные к цепочке отчетов своим SQL
Добавлено: 13 фев 2007, 14:19
Александр
Никто не объяснит на примере как использовать свои SQL с тем или иным типом отчетов
Тип
1
Выделенный объект - свои SQL использовать нельзя
2
Объекты первого уровня - заготовка SQL по типу связи+экземпляр объекта+our_dummy???+SQL дополнительного отбора
3
Все объекты - как и для первого уровня
4
Вся база данных - или по условиям отчета или по экземпляру объекта+SQL дополнительного отбора
5
Пользовательский - только свой SQL
Проблема: при запуске отчета с аргументами из действия в случае 5-го типа - первой открывается вскладка аргументы (где нужно нажать Обновить) в других типах отчетов этого эффекта не наблюдается
в своем SQL мне нужно работать с двумя таблицами
Код: Выделить всё
...
From lsdbo.object_reference_view rw,
lsdbo.object_type_view tw
...
и сам отчет должен выполняться сразу
5-й тип отчета не подходит (открывается окно Аргументы)
в остальных типах нет выборки по типу объекта
Никто не подскажет как выполнить свой SQL
Код: Выделить всё
Select rw.id
From lsdbo.object_reference_view rw,
lsdbo.object_type_view tw
Where rw.type_id = tw.id
AND tw.id = 100003181100000
and CHARINDEX(CAST(rw.author_id AS varchar(10)), :UserList)>0
типом отчета отличном от 5-го и что писать в секции дополнительного отбора параметров
Добавлено: 13 фев 2007, 14:30
Александр
оказывается как сказала техподдержка, чтобы не выскакивало окно атрибуты - первым в списке атрибутов должен быть некий фиктивный атрибут с типом объект и произвольным значением (я поставил empty)
тогда все Ок.
Но все таки вопрос остается:
какой синтаксис нужно использовать для подгонки своих данных в отчет , что означает Select1 из help'a
кто нибудь пробовал?
Добавлено: 14 фев 2007, 08:04
Anderyt
видимо, необходимость вставки какого то объекта в запуск отчета продиктована особенностями функции... нужен аргумент-объект, и все тут, без него - никак...

)
а с вопросом... хм... синтаксис для чего, для какого типа отчета? для пользовательского или для всех остальных?
Добавлено: 14 фев 2007, 08:15
Александр
ну допустим для всей базы данных все объекты
нам предлагают 'заготовку' sql
Код: Выделить всё
SELECT lsdbo.object_reference_view.id,
lsdbo.object_reference_view.type_id
FROM lsdbo.object_reference_view
что писать в дополнительном отборе
-просто продолжить секцию From и добавить Where?
-а что делать если мне нужно не 2 колонки а одна или четыре или вообще все? Написать в окне отбора свой запрос?
Кто из этих двух SQL выполняется первым и кто вложен и в кого или они сами по себе?

или можно использовать конструкции типа
Код: Выделить всё
declare @p1 as varchar(256)
set @p1='...'
exec(...
В смысле использовать это окно как Query Analyzer
Ничего не понимаю

Добавлено: 14 фев 2007, 08:29
Anderyt
суть такая, как я понял..
если говорить НЕ о пользовательском отчете.
в настройках отчета задаются следующие вещи:
тип объекта
набор атрибутов, которые нужно показать для отобранных отчетов
условия фильтрации в стандартном фильтре
а вот КАКИЕ это будут объекты - можно как раз задать в условии отбора. причем основной запрос и дополнительный должны дополнять друг друга, они выполняются одновременно, точнее нет, это вообще ОДИН запрос.
просто у нас есть возможность дописать свои условия, которые будут подцеплены
в первой части обычно написано вот так:
Код: Выделить всё
SELECT lsdbo.object_reference_view.id,
lsdbo.object_reference_view.type_id,
lsdbo.rep_part_item_view.part_id
FROM lsdbo.object_reference_view,
lsdbo.rep_part_item_view,
lsdbo.rep_part_view
WHERE ( lsdbo.rep_part_view.id = lsdbo.rep_part_item_view.part_id ) and
( lsdbo.rep_part_item_view.object_type_id = lsdbo.object_reference_view.type_id ) and
( ( lsdbo.rep_part_view.name_id = :adec_report_id ) )
после WHERE идет по сути фильтрация по типу объекта.
а дальше можно написать продолжение этого WHERE, имея в виду, что наше условие будет сцеплено с имеющимся через AND
например, можно написать вот такое (реальный отчет с нашими атрибутами, так что работать "один в один" на других базах это вовсе не обязано):
Код: Выделить всё
(
(lsdbo.object_reference_view.id in
(
select av.object_id
from
lsdbo.attrib_value_view av
, lsdbo.value_datetime_view vd
where
av.attrib_id = 100001197700058
and
av.value_id = vd.id
and
vd.value <getdate>= dateadd(day,-:days_back,getdate())
)
)
or
lsdbo.object_reference_view.id not in
(
select av.object_id
from
lsdbo.attrib_value_view av
where
av.object_id = lsdbo.object_reference_view.id
and
av.attrib_id = 681153613001014
)
)
and
lsdbo.object_reference_view.id in
(
select av.object_id
from
lsdbo.attrib_value_view av
where
av.object_id = lsdbo.object_reference_view.id
and
av.attrib_id = 100000327400000
)
вот..
этот большой запрос (из двух частей) возвращает в отчет набор ИД объектов. отчет после этого уже вытаскивает для них нужные атрибуты и применяет свой собственный фильтр.
Добавлено: 14 фев 2007, 08:42
Александр
через AND, - понятно, спасибо
и еще глупый вопрос - а что такое Select 1 ... из help'a
раздел
Дополнительные условия отбора в SQL 
Добавлено: 14 фев 2007, 09:03
Anderyt
не мог сообразить, пока не попробовал этот запрос сделать

)
этот запрос пишет "1" для каждой строки, которую возвращает запрос

)))
попробуйте его сделать, поймете
но не знаю, я как то без EXISTS обхожусь...
Добавлено: 19 фев 2007, 14:23
Юрий
Самый оптимальный вариант что-бы в отчете использовать различные SQL запросы к базе, если они сложные - использование скриптов в отчете.
Этим способом можно избежать избыточную информацию, которая замедляет формирование отчета.
Нюанс заключается только в том, что столбцы отчета необходимо формировать самому.
Добавлено: 19 фев 2007, 14:29
Александр
Но ведь скрипты запускаются после формирования отчета и не влияют на выборку или не так?

Добавлено: 19 фев 2007, 14:59
Юрий
Да. Я же и говорю формировать отчет самостоятельно в скрипте:
1. Очищаем отчет.
2. Делаем цыкл обработки массива результатов SQL запроса и в этом цыкле заполняем нашу форму.
3. Добавляем или просто применяем фильтры сортировки по вкусу.
Все отчет готов.
Добавлено: 19 фев 2007, 16:05
Юрий
Примерно так:
sub Main
dim id()
dim err, err1
set rst = CreateObject("ADODB.recordset")
redim id (LsRpt.RowCount()+1)
set con1 = LsGetADOConnect
for i = 1 to LsRpt.RowCount()
id(i) = LsRpt.GetItem(i,"isobject_id")
next
j1=1
call LsRpt.SetItem(j1,"col7","")
call LsRpt.SetItem(j1,"col8","")
call LsRpt.SetItem(j1,"col9","")
call LsRpt.SetItem(j1,"col10","")
call LsRpt.SetItem(j1,"col11","")
for j = 1 to i-1
'strcon = "select f.file_name, f.description, f.cd, st.description as bibl "
'strcon = strcon + "from lsdbo.file1 f left join lsdbo.storage st "
'strcon = strcon + "on f.storage_id = st.id where f.object_reference_id = " + cstr(id(j))
strcon = "select f.file_name, f.description, f.cd, st.description bibl, f.ws_id, cast( f.ws_id as char), f.cd "
strcon = strcon + "from (select storage_id, file_name, description, ws_id, cd from lsdbo.file1 fl "
strcon = strcon + " where fl.object_reference_id = "+cstr(id(j))+") f "
strcon = strcon + "left join lsdbo.storage st "
strcon = strcon + "on f.storage_id = st.id "
strcon = strcon + "left join LSDBO.CD_WSID ws on f.ws_id = ws.id "
strcon1 = "select obj.cd, cast(ws.id as char) from (select cd, ws_id from LSDBO.object_reference obj "
strcon1 = strcon1 + " where obj.id="+cstr(id(j))+")obj "
strcon1 = strcon1 + "left join LSDBO.CD_WSID ws on obj.ws_id = ws.id "
set rst = con1.Execute(strcon,err)
set rst1 = con1.Execute(strcon1,err1)
rst1.MoveFirst
mass = rst1.getrows
call LsRpt.SetItem(j1,"col10",mass(0,0))
call LsRpt.SetItem(j1,"col11",mass(1,0))
j1=j1+1
call LsRpt.SetItem(j1,"col7","")
call LsRpt.SetItem(j1,"col8","")
call LsRpt.SetItem(j1,"col9","")
if err = -1 then
rst.MoveFirst
mass = rst.getrows
for i1 = 0 to ubound(mass,2)
call LsRpt.InsertRow(j1)
call LsRpt.SetItem(j1,"col7",mass(0,i1))
call LsRpt.SetItem(j1,"col8",mass(1,i1))
call LsRpt.SetItem(j1,"col9",mass(3,i1))
call LsRpt.SetItem(j1,"col10",mass(2,i1))
call LsRpt.SetItem(j1,"col11",mass(5,i1))
call LsRpt.SetItem(j1,"col12",mass(6,i1))
j1=j1+1
next
end if
next
end sub
Добавлено: 26 фев 2007, 15:27
Anderyt
to Александр
хм... я тоже с такой проблемой столкнулся, как раз с отчетом 5-го типа, но подстановка переменной-объекта не спасает - все равно открывается вкладка Аргументы

и как раз, такого эффекта нет у других отчетов, только у 5-го..
я был уверен, что все должно быть ок, если подставить переменную-объект, а тут - на тебе...
задал вопрос Теххелпу, жду ответа...

Добавлено: 26 фев 2007, 16:44
Александр
2 Anderyt
Так слушай, ставишь первым аргументом переменную типа объект с значением Empty и все, у меня сработало нормально
Добавлено: 27 фев 2007, 09:33
Anderyt
хм...
а теххелп сказал
Будем исправлять... Как только сделаем - сообщим.
и у меня не сработало с пустым объектом... хотя я может не так понял...
я сделал в действии еще одну переменную-объект Obj_empty, без всякого значения, поставил ее в функцию по запуску отчета - сейчас вообще функция не выполняется, выдает ошибку "значение объекта Obj_empty не установлено"
Добавлено: 27 фев 2007, 09:47
Юрий
В переменную нужно просто прилепить объект от фонаря и все.