20240106

REDUCE (inline)

** R E D U C E
** REDUCE
**
** Permite gerar resultados que antes só eram possíveis
** por meio de loopings

*  X = REDUCE dype|#(conditional iteration|table iteration).


* Exemmlo: permite criar uma única saída com o processamento de vários itens
*          Soma (total) de todos os registros de uma tabela interna

* SEM REDUCE
  data: v_tot_netwr     type y_order-netwr.

  LOOP AT t_order INTO DATA(s_order).
     v_tot_netwr += s_order-netwr.
  ENDLOOP.

* COM REDUCE
  DATA(v_tot_netwr2) =
    REDUCE y_order-netwr(
      INIT x = 0
      FOR wa IN t_order
      NEXT x = x + wa-netwr
    ).



* COM REDUCE + WHERE
  DATA(v_tot_netwr3) =
    REDUCE y_order-netwr(
      INIT x = 0
      FOR wa IN t_order
        WHERE ( auart = 'A' )
      NEXT x = x + wa-netwr
    ).



* REDUCE + Tabela denro de tabela
*
  DATA(v_tot_netwr4) =
    REDUCE y_item-netwr(
      INIT result = 0
      FOR order IN t_order
        WHERE ( auart = 'A' )
      FOR item IN order-items
      NEXT result = result + item-netwr
    ).


* REDUCE + Resutado de tipo estruturado
*
  types: begin of y_result,
           netwr     type y_item-netwr,
           counter   type i,
         end of y_result.



*** SEM REDUCE
  LOOP AT t_order into data(s_orderx)
      WHERE auart = 'A'.

    LOOP AT s_order-items into data(s_item).
      s_tot-netwr   += s_item-netwr.
      s_tot-counter += 1.
    ENDLOOP.

  ENDLOOP.


*** COM REDUCE +
  DATA(s_tot) =
    REDUCE y_result(
      INIT result =
      VALUE y_result(
        netwr   = 0
        counter = 0
      )
      FOR order IN t_order
        WHERE ( auart = 'A' )
      FOR item IN order-items
      NEXT
        result-netwr = result-netwr + item-netwr
        result-counter += 1
    ).





** REDUCE -> Fatorial
** Resultado à partir do nada: sem uma tabela interna como base

METHOD fatorial    "definition
  IMPORTING
     iv_base    type i
  RETURNING
     value(rv_fat)  type i.

ENDMETHOD.


METHOD fatorial.   "implementation
  rv_fat =
    REDUCE i(
      INIT x = 0
      FOR  n = 1 THEN n + 1 UNTIL n > iv_base
      NEXT x = x + n
    ).

ENDMETHOD.


WRITE:
   fatorial( 3 ),    "06
   fatorial( 4 ),    "10
   fatorial( 5 ),    "15
   fatorial( 6 ).    "21