Мне нужно создать отчет, который ссылается на несколько таблиц, в том числе одну таблицу, которая является построчной деталью заказа. По заказам у нас есть пакеты, и единственный способ определить, имеет ли пакет определенный статус, - это проанализировать статусы его компонентов. Детали счета хранятся в последовательном порядке с номером строки и уровнем элемента каждой строки. Записи с уровнем элемента> 1 являются частями наборов, которые непосредственно предшествуют им. Так, например ::
Invoiceiid | Lineno | LevelNo | SKU
----------------------------------------------------
10192 | 1 | 1 | K-PACKAGE
10192 | 2 | 2 | SCREEN
10192 | 3 | 2 | CABLE
10192 | 4 | 1 | LCD PROJECTOR
В этом примере ЭКРАН и КАБЕЛЬ являются частью K-ПАКЕТА, а ЖК-ПРОЕКТОР - нет.
Я изменяю статус этих пакетов в зависимости от состояния их составных частей. Для моих целей среднее из статусов работает нормально. У меня есть команда, включенная ниже, в качестве уменьшенной версии SQL-запроса, который я использую (более крупная версия - это просто грубый метод для обработки нескольких количеств подпунктов). Команда принята на экране Эксперта базы данных, окно «Редактировать команду», но на самом деле при попытке предварительного просмотра отчета возвращается
"Ошибка соединителя базы данных: 'HY000: [Oracle] [ODBC] [Ora] ORA-01427: однострочный подзапрос возвращает более одной строки [Код поставщика базы данных: 1427]'"
когда он действительно начинает пытаться получить результаты.
Вот урезанный SQL-запрос, который я использую, чтобы попытаться найти проблему. Сейчас я показываю только профит-центр, чтобы попытаться выяснить, не в этом ли проблема.
select ih.billdate, ih.invoiceid, ih.profitcenter, co.contractid, il.action,
(
case il.status
when 15 then
(
case when (((select il2.itemlevel from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 1) or ((select count(il2.itemlevel) from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 0))
then 15
when (((select max(il2.lineno) from invoiceline il2 where il2.invoiceiid = il.invoiceiid) <= (il.lineno + 2)))
then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))
else
15
end
)
else
il.status
end
) as "Status",
il.amount, il.discountamount, im.revenuegroup, im.subrentalexpense, im.discountgroup, im.subrentglcode, im.sellglcode from invoicehead ih inner join contract co on ih.contractiid = co.contractiid left outer join invoiceline il on ih.invoiceiid = il.invoiceiid inner join invmaster im on il.inviid = im.invi
Если я изменюсь
then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))
Чтобы указать строгое число (например, 15), предварительный просмотр отчета без проблем.
И просто для ясности: на самом деле нет никакой другой ссылки (по крайней мере, я не могу найти) между основным элементом пакета и компонентами, а также я не могу изменить схему базы данных. И все должно быть в Crystal Reports.
Есть мысли?