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
  datav_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 0
      FOR wa IN t_order
      NEXT + wa-netwr
    ).



* COM REDUCE + WHERE
  DATA(v_tot_netwr3=
    REDUCE y_order-netwr(
      INIT 0
      FOR wa IN t_order
        WHERE auart 'A' )
      NEXT + 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
*
  typesbegin 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 0
      FOR  THEN n + UNTIL n > iv_base
      NEXT + n
    ).

ENDMETHOD.


WRITE:
   fatorial),    "06
   fatorial),    "10
   fatorial),    "15
   fatorial).    "21