У меня есть отчет, который вызывается много раз, но я хочу, чтобы порядок каждый раз менялся.

Как я могу изменить «порядок по» в зависимости от переменной.

Например

report print_label()

   If is_reprint
   then
       order by rpt.item_code, rpt.description
   else
       order by rpt.description, rpt.item_code
   end if

Я попытался передать переменную при вызове отчета:

let scratch = "rpt.item_code, rpt.description"
start print_label(scratch)

И в отчете я сделал:

order by scratch

Но это не сработало ... Есть другие предложения ?? Спасибо!

1
Moses Davidowitz 7 Сен 2016 в 21:39

3 ответа

Вы можете использовать приготовить:

let query_txt="select ... "
If is_reprint then
  let query_txt=query_txt clipped, " order by rpt.item_code, 
  rpt.description"
else
  let query_txt=query_txt clipped, " order by rpt.description, 
  rpt.item_code"
end if
prepare statement1 from query_txt
declare cursor_name cursor for statement1

А теперь запустите отчет, используйте foreach и т. Д. И т. Д.

P.S. Вы должны определить query_txt как char, достаточно длинный для всего текста.

0
Brunner 29 Май 2017 в 22:14

Техника, которую я использовал для этого типа проблем, похожа на

REPORT report_name(x)
DEFINE x RECORD
    param1,param2, ..., paramN ...,
    sort_method ...,
    data ...
END RECORD

ORDER [EXTERNAL] BY x.param1, x.param2, ..., x.paramN

BEFORE GROUP OF x.param1
    CASE 
        WHEN x.sort_method ...
            PRINT ...
        WHEN x.sort_method ...
            PRINT ...
    END CASE

BEFORE GROUP OF x.param2
    # similar technique as above

...

BEFORE GROUP OF x.paramN
    # similar technique as above

ON EVERY ROW
    PRINT ...

AFTER GROUP OF x.paramN
   # similar technique as above
...

AFTER GROUP OF x.param2
    # similar technique as above

AFTER GROUP OF x.param1
    # similar technique as above

... а затем в 4gl, который вызывает ОТЧЕТ, заполните x.param1, x.param2, ..., x.paramN желаемыми параметрами, используемыми для сортировки, например

CASE x.sort_method 
    WHEN "product,branch"
        LET x.param1 = x.data.product_code
        LET x.param2 = x.data.branch_code
    WHEN "branch,product"
        LET x.param1 = x.data.branch_code
        LET x.param2 = x.data.product_code
END CASE
OUTPUT TO REPORT report_name(x.*)

Итак, согласно моему примеру, это метод, который я видел и использовал для таких вещей, как биржевые отчеты. Менеджер склада / филиала / магазина хочет видеть вещи, заказанные по складу / филиалу / магазину, а затем по продукту / артикулу / номенклатуре, в то время как менеджер по продукту хочет видеть вещи, заказанные по продукту / артикулу / номенклатуре, а затем складу / филиалу / магазин. Больше аналитических отчетов с большим количеством потенциальных параметров можно сделать, используя ту же технику. Я думаю, что запись, которую я видел, - 6. Так что в этом случае гораздо лучше с одним отчетом, охватывающим все 6! = 720 потенциальных комбинаций, чем писать отдельный отчет для каждой возможной комбинации заказов.

Вероятно, похоже на вариант 1 Джонатана, хотя у меня нет таких же оговорок относительно сложности. Я не припомню, чтобы на рецензировании кода кто-то из моих младших разработчиков ошибался. Фактически, если отчет достаточно общий, вы обнаружите, что не нужно его слишком часто трогать.

2
Jonathan Leffler 9 Сен 2016 в 00:09

Вы можете иметь оператор case в предложении order by следующим образом:

order by 
       case 
         when 1 = 1 then 
            rpt.item_code, rpt.description
         else
            rpt.description, rpt.item_code
       end
0
mihirp724 7 Сен 2016 в 19:18